我需要實現約簡操作(對於每個線程,值應該存儲在不同的數組條目中)。但是,對於更多的線程,它運行得更慢。有什麼建議麼?OpenMP實現減少
double local_sum[16];.
//Initializations....
#pragma omp parallel for shared(h,n,a) private(x, thread_id)
for (i = 1; i < n; i++) {
thread_id = omp_get_thread_num();
x = a + i* h;
local_sum[thread_id] += f(x);
}
保留原始16元素數組並不是更好,而是在並行循環中使用私有局部部分和減少,然後在並行循環之外但在並行塊中填充16元素數組。這仍然有錯誤的共享,但影響可以忽略不計,因爲該數組只在每個線程中命中一次,而不是每次迭代一次,此外,您不必擔心NUMA系統上的頁面。 –
這樣做會更好,但它不會具有教導OP關於虛假分享的教育價值。 NUMA相關的優化後來:) –