Question

I'm currently trying to learn ow to use OpenMP and I have a question. Is it safe to do something like that :

  std::atomic<double> result;
  #pragma omp parallel for
  for(...)
  {
  result+= //some stuff;
  }

Or shall I use :

  double result;
  #pragma omp parallel for
  for(...)
  {
    double tmp=0;
    //some stuff;
    #pragma omp atomic
    result+=tmp;
  }

Thanks !

Edit : I know the most simple way to handle that is using an array, but Im asking because I'm curious

Was it helpful?

Solution

Officially, no. In practice, probably.

Page Section 1.7 page 32 of the OpenMP 5.0 Specification says:

While future versions of the OpenMP specification are expected to address the following features, currently their use may result in unspecified behavior.

  • Concurrency

  • Additions to the standard library

  • C++11 Library

However, depending on the implementation of the OpenMP runtime you use, it might be alright. In fact, the LLVM OpenMP runtime even uses std::atomic to implement some of the OpenMP specification.

The safest option though is to stick with using only what OpenMP provides. Anything you can do using std::atomic you should also be able to achieve using only OpenMP.

OTHER TIPS

Since atomics slow down parallel execution and don't scale well, better do

pragma omp parallel for reduction(+:result)
for(...)
{
  double tmp=0;
  //some stuff;
  result+=tmp;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top