我意识到减少仅适用于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)
(注意到我可能已经遗漏了一些语法).似乎一个明显的解决方案是将实部和虚部分成临时双重,然后积累在那些上.我想我正在寻找优雅,这似乎......不仅仅是漂亮.这是典型的方法吗?
在OpenMP中没有用户定义的减少的典型解决方法甚至比你建议的更加丑陋.通常,在并行区域之前,人们创建一个(至少)元素的数组,就像区域中将有线程一样,为每个线程分别累积部分结果omp_get_thread_num()作为数组的索引,并最终减少累积在平行区域之后产生循环.
据我所知,OpenMP语言委员会致力于在规范中添加用户定义的约简,因此可能会在几年后最终得到解决.