我正在尝试学习使用OpenMP的问题,我有一个问题。 做这样的事情是否安全:
std::atomic<double> result;
#pragma omp parallel for
for(...)
{
result+= //some stuff;
}
或者我应该使用:
double result;
#pragma omp parallel for
for(...)
{
double tmp=0;
//some stuff;
#pragma omp atomic
result+=tmp;
}
谢谢!
编辑:我知道处理的最简单的方法是使用数组,但我问,因为我很好奇
答案 0 :(得分:1)
正式地,不。在实践中,可能。
OpenMP 5.0 Specification的第1.7节第32页的第1.7页说:
虽然预期OpenMP规范的未来版本将解决以下功能,但当前使用它们可能会导致未指定的行为。
并发性
对标准库的添加
C ++ 11库
但是,取决于您使用的OpenMP运行时的实现,可能可以。实际上,LLVM OpenMP运行时甚至使用std::atomic
来实现某些OpenMP规范。
最安全的选择是仅使用OpenMP提供的内容。使用std::atomic
可以执行的任何操作,也应该仅使用OpenMP即可实现。
答案 1 :(得分:-3)
由于原子会降低并行执行速度并且不能很好地扩展,所以
更好pragma omp parallel for reduction(+:result)
for(...)
{
double tmp=0;
//some stuff;
result+=tmp;
}