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

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)

谢谢 !

编辑:我知道处理的最简单的方法是使用数组,但我问,因为我很好奇

Inc*_*tic 3

官方说法是,没有。在实践中,可能是这样。

OpenMP 5.0 规范第 1.7 页第 32 页表示:

虽然 OpenMP 规范的未来版本预计将解决以下功能,但目前它们的使用可能会导致未指定的行为。

  • 并发性

  • 标准库的补充

  • C++11 库

但是,根据您使用的 OpenMP 运行时的实现,这可能没问题。事实上,LLVM OpenMP 运行时甚至用于std::atomic实现某些 OpenMP 规范。

不过,最安全的选择是坚持仅使用 OpenMP 提供的内容。您可以使用 OpenMP 完成的任何事情std::atomic也应该能够仅使用 OpenMP 来实现。

  • 此问题已在 OpenMP 5.1 中修复:https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5-1.pdf (2认同)