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

时间:2014-02-04 13:38:57

标签: c++ c++11 openmp atomic stdatomic

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

谢谢!

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

2 个答案:

答案 0 :(得分:1)

正式地,不。在实践中,可能。

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

  

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

     
      
  • 并发性

  •   
  • 对标准库的添加

  •   
  • C ++ 11库

  •   

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

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

答案 1 :(得分:-3)

由于原子会降低并行执行速度并且不能很好地扩展,所以

更好
pragma omp parallel for reduction(+:result)
for(...)
{
  double tmp=0;
  //some stuff;
  result+=tmp;
}