繁体   English   中英

std::atomic 可以安全地与 OpenMP 一起使用吗

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM