OpenMP本身是否支持减少表示数组的变量?
这可能会像以下一样......
float* a = (float*) calloc(4*sizeof(float));
omp_set_num_threads(13);
#pragma omp parallel reduction(+:a)
for(i=0;i<4;i++){
a[i] += 1; // Thread-local copy of a incremented by something interesting
}
// a now contains [13 13 13 13]
Run Code Online (Sandbox Code Playgroud)
理想情况下,对于omp并行会有类似的东西,并且如果你有足够多的线程使它有意义,那么积累将通过二叉树发生.
我意识到减少仅适用于C++中的POD类型.您将如何实现复杂类型累加器的减少?
complex<double> x(0.0,0.0), y(1.0,1.0);
#pragma omp parallel for reduction(+:x)
for(int i=0; i<5; i++)
{
x += y;
}
Run Code Online (Sandbox Code Playgroud)
(注意到我可能已经遗漏了一些语法).似乎一个明显的解决方案是将实部和虚部分成临时双重,然后积累在那些上.我想我正在寻找优雅,这似乎......不仅仅是漂亮.这是典型的方法吗?