2016-12-09 3 views
0

У меня есть исходный код: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, чтобы я убедился, что все минимумы вычисляются перед вычислением глобального минимума.

+0

Нет, это неправильно. Хотя критический может быть использован, для этого в OpenMP 4.0 была добавлена ​​#pragma omp для восстановления (min: ....). Почти достаточная причина для использования последней реализации. – tim18

+0

И что мне нужно изменить, если я хочу сделать это без сокращения? – Unknown

+0

Вы, кажется, колеблются, хотите ли вы настроить внутреннюю замену симметра и внешнюю параллельную резьбовую редукцию (хороший метод, если проблема достаточно велика). Одного уменьшения потока нити достаточно, возможно, до N <80000 или около того. К сожалению, omp для восстановления simd не работает одинаково для всех компиляторов (опять же, совсем не на Microsoft). – tim18

ответ

1

Код верный. Нет необходимости добавлять #pragma omp barrier, потому что нет необходимости, чтобы все min_l вычислялись, когда один поток попадает в критический раздел. Существует также неявный барьер в конце области петли.

Кроме того, вам не обязательно явно указывать переменную итерации цикла i.

Вы можете улучшить код, используя сокращения вместо вашего ручного сращивания minl:

#pragma omp for reduction(min:min) 
for (i=0;i<N;i++) 
    if (A[i]<min) 
    min=A[i]; 

Примечание: min оператор редукции доступен с OpenMP 3.1.

+0

спасибо за помощь! – Unknown

+0

Visual Studio 2017 говорит: '' min ': недействительный токен оператора в объявлении OpenMP' сокращение '. Есть идеи? – Royi

+0

@ Royi afaik Vs поддерживает только Openmp 2.0, старинную версию стандарта. – Zulan

Смежные вопросы