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
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.
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;
}
来源:https://stackoverflow.com/questions/21554099/can-stdatomic-be-safely-used-with-openmp