В настоящее время я пытаюсь научиться использовать 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;
}
Спасибо !
Редактировать: я знаю самый простой способ справиться с использованием массива, но я спрашиваю, потому что мне любопытно
Поскольку атомика замедляет параллельное выполнение и плохо масштабируется, лучше
pragma omp parallel for reduction(+:result)
for(...)
{
double tmp=0;
//some stuff;
result+=tmp;
}
Других решений пока нет …