12

我目前正在尝试学习如何使用 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;
  }

谢谢 !

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

4

2 回答 2

3

官方,没有。在实践中,可能。

OpenMP 5.0 规范的第 1.7 页第 32 页第 1.7 节说:

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

  • 并发

  • 标准库的补充

  • C++11 库

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

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

于 2019-11-02T21:36:21.230 回答
-2

由于原子会减慢并行执行速度并且不能很好地扩展,所以最好这样做

pragma omp parallel for reduction(+:result)
for(...)
{
  double tmp=0;
  //some stuff;
  result+=tmp;
}
于 2014-02-04T13:56:23.193 回答