Dav*_*rcz 9 c++ atomic openmp c++11 stdatomic
我目前正在努力学习使用OpenMP,我有一个问题.做这样的事情是否安全:
std::atomic<double> result;
#pragma omp parallel for
for(...)
{
result+= //some stuff;
}
Run Code Online (Sandbox Code Playgroud)
或者我应该使用:
double result;
#pragma omp parallel for
for(...)
{
double tmp=0;
//some stuff;
#pragma omp atomic
result+=tmp;
}
Run Code Online (Sandbox Code Playgroud)
谢谢 !
编辑:我知道处理的最简单的方法是使用数组,但我问,因为我很好奇
官方说法是,没有。在实践中,可能是这样。
OpenMP 5.0 规范第 1.7 页第 32 页表示:
虽然 OpenMP 规范的未来版本预计将解决以下功能,但目前它们的使用可能会导致未指定的行为。
并发性
标准库的补充
C++11 库
但是,根据您使用的 OpenMP 运行时的实现,这可能没问题。事实上,LLVM OpenMP 运行时甚至用于std::atomic实现某些 OpenMP 规范。
不过,最安全的选择是坚持仅使用 OpenMP 提供的内容。您可以使用 OpenMP 完成的任何事情std::atomic也应该能够仅使用 OpenMP 来实现。
| 归档时间: |
|
| 查看次数: |
883 次 |
| 最近记录: |