我需要实现约简操作(对于每个线程,值应该存储在不同的数组条目中)。但是,对于更多的线程,它运行得更慢。有什么建议么?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相关的优化后来:) –