У меня есть исходный код:OpenMP минимальное значение массива
min = INT_MAX;
for (i=0;i<N;i++)
if (A[i]<min)
min = A[i];
for (i=0;i<N;i++)
A[i]=A[i]-min;
Я хочу, чтобы получить параллельную версию этого, и я сделал это:
min = INT_MAX;
#pragma omp parallel private(i){
minl = INT_MAX;
#pragma omp for
for (i=0;i<N;i++)
if (A[i]<minl)
minl=A[i];
#pragma omp critical{
if (minl<min)
min=minl;
}
#pragma omp for
for (i=0;i<N;i++)
A[i]=A[i]-min;
}
ли параллельный код правильно? Мне было интересно, нужно ли писать барьер #pragma omp перед критическим #pragma omp, чтобы я убедился, что все минимумы вычисляются перед вычислением глобального минимума.
Нет, это неправильно. Хотя критический может быть использован, для этого в OpenMP 4.0 была добавлена #pragma omp для восстановления (min: ....). Почти достаточная причина для использования последней реализации. – tim18
И что мне нужно изменить, если я хочу сделать это без сокращения? – Unknown
Вы, кажется, колеблются, хотите ли вы настроить внутреннюю замену симметра и внешнюю параллельную резьбовую редукцию (хороший метод, если проблема достаточно велика). Одного уменьшения потока нити достаточно, возможно, до N <80000 или около того. К сожалению, omp для восстановления simd не работает одинаково для всех компиляторов (опять же, совсем не на Microsoft). – tim18