![](/img/trans.png)
[英]Can std::atomic be used sometimes instead of std::mutex in C++?
[英]Can std::atomic be safely used with OpenMP
我目前正在尝试学习如何使用 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 规范的第 1.7 页第 32 页说:
虽然 OpenMP 规范的未来版本有望解决以下功能,但目前它们的使用可能会导致未指定的行为。
并发
对标准库的补充
C++11 库
但是,根据您使用的 OpenMP 运行时的实现,它可能没问题。 事实上,LLVM OpenMP 运行时甚至使用std::atomic
来实现一些 OpenMP 规范。
最安全的选择是坚持只使用 OpenMP 提供的内容。 您可以使用std::atomic
执行的任何操作也应该能够仅使用 OpenMP 来实现。
由于原子会减慢并行执行速度并且不能很好地扩展,所以最好这样做
pragma omp parallel for reduction(+:result)
for(...)
{
double tmp=0;
//some stuff;
result+=tmp;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.