可以将std :: atomic与OpenMP安全使用

问题描述 投票:9回答:2

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

谢谢!

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

c++ c++11 openmp atomic stdatomic
2个回答
1
投票

正式上,不。实际上,可能。

OpenMP 5.0 Specification的第32页第1.7节说:

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

  • 并发

  • 标准库的补充

  • C ++ 11库

但是,取决于您使用的OpenMP运行时的实现,可能可以。实际上,LLVM OpenMP运行时甚至使用std::atomic来实现某些OpenMP规范。

尽管最安全的选择是仅使用OpenMP提供的内容。使用std::atomic可以执行的任何操作,也应该仅使用OpenMP即可实现。


-2
投票

因为原子减慢了并行执行的速度,并且扩展性不好,所以最好做

std::atomic
© www.soinside.com 2019 - 2024. All rights reserved.