2015-11-13 19 views
1

據我所知,這個程序應該得到加速2或更多時運行2線程。而不是我連續得到幾乎相同。似乎沒有得到加速,我應該在打開MP

static void proc_paralelo (int n, char *vprimos, int nthr) {

omp_set_num_threads(nthr); int i, j, prim, posiciones; int raiz_n = sqrt(n); for (i=1;i < raiz_n; i++) { if (vprimos[i]==0) { prim=i+1; posiciones=ceil((float)(n-(i+prim))/(float)prim); #pragma omp parallel for private(j) schedule (static, posiciones/omp_get_num_threads()) for (j=0; j<posiciones; j++){ vprimos[i+prim+(j*prim)]=1;} } } }

我使用的線程數爲2(我的處理器的內核)和n大小爲20000000

的時候,我得到的是:

  • 連續:650000000 ns
  • 並聯:630000000 ns
+1

你的程序應該做什麼?通過使用2個線程,你不應該得到超過2倍的加速,順便說一句。 –

+0

'posiciones'通常有多長時間?如果你要利用多個線程,它應該非常大。 –

+0

向我們展示如何衡量執行時間。 – jepio

回答

1

通過運行兩個線程,您永遠不會(編輯:很少,看到註釋)看到超過2x加速。事實上,因爲沒有工作是完全可並行化的,所以你甚至可能不會看到。另外考慮一下,開始一個新線程需要相當多的資源 - 你可能看不到任何收益,並且可能會看到性能損失,除非你的工作負載足夠大以致CPU飽和時間超過啓動新線程所花費的時間(for CPU綁定的工作負載)。由於您的主題共享某些硬件或軟件資源,因此您也將受到共享資源爭用的限制 - 請參閱某些示例的註釋。

+0

也可能存在諸如爭用共享CPU緩存,增加分頁等問題,所有這些都會削減可通過並行化實現的加速。 –

+0

@JohnBollinger優秀點。 – Patrick87

+2

偶爾,您可以看到使用兩個內核的速度超過了2倍。一個明顯的例子是,如果您使用的數據不適合一個內核的緩存,但會適合兩個內核的緩存。在這種情況下,消除大量主存訪問可以將速度提高大約2倍以上。這並不常見,但我已經看到了。 –

0

它看起來對我來說,這裏的問題是,你的代碼幾乎可以肯定是內存限制,並使用第二芯不增加內存帶寬。

特別是,你vprimos顯然是大約20兆,這是過多放入高速緩存(至少在大多數處理器)。你爲一次迭代所做的實際計算完全是微不足道的(計算一個地址並寫入1),所以即使對於單個核心,也可能大部分是內存限制的。添加第二個內核可以節省一點點(可能對於緩存中的的部分),但這就是它。

在這種情況下,一個明顯的增益將是從使用單一位來存儲每個布爾,而不是使用整個炭。儘管它增加了一些計算開銷,但它可能會節省足夠的內存帶寬,而不僅僅是補償。

一個例子,我扔了一段時間(也是Sieve of Eratosthenes)似乎運行速度是同樣大小的6倍(儘管它是C++而不是C)。

相關問題