我目前正在尝试学习使用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;
}
谢谢!
编辑:我知道使用数组的最简单方法,但是我问是因为我很好奇
正式上,不。实际上,可能。
OpenMP 5.0 Specification的第32页第1.7节说:
虽然预期OpenMP规范的未来版本将解决以下功能,但当前使用它们可能会导致未指定的行为。
并发
标准库的补充
C ++ 11库
但是,取决于您使用的OpenMP运行时的实现,可能可以。实际上,LLVM OpenMP运行时甚至使用std::atomic
来实现某些OpenMP规范。
尽管最安全的选择是仅使用OpenMP提供的内容。使用std::atomic
可以执行的任何操作,也应该仅使用OpenMP即可实现。
因为原子减慢了并行执行的速度,并且扩展性不好,所以最好做
std::atomic