2015-01-19 3 views
-1

Я начинаю в OpenMP и я хочу распараллелить эту часть кодаКак я могу использовать openMP для моего кода?

int A[n][m+1]; 
int B[k][m]; 
for (h=0;h<100;h++){ 
    for (i=0;i<n;i++){p=0; 
     for (j=0;j<k;j++){s=0; 
      for (l=0;l<m;l++){ 
       s+=(A[i][l]-B[j][l]); 
      } 
      s=sqrt(s);  
      if (j==0) min =s; 
      else 
      if (min > s){min =s;p=j;}    
     } 
    A[i][m]=p; 
    } 
} 

и это моя попытка для распараллеливания с помощью OpenMP

#pragma omp parallel for private(s) 
for (h=0;h<100;h++){ 
    for (i=0;i<n;i++){p=0; 
     for (j=0;j<k;j++){s=0; 
      for (l=0;l<m;l++){ 
       s+=(A[i][l]-B[j][l]); 
      } 
      s=sqrt(s);  
      if (j==0) min =s; 
      else 
      if (min > s){min =s;p=j;}    
     } 
    A[i][m]=p; 
    } 
} 

как я могу сделать это правильно? мне нужна ваша помощь.

+1

Как вы думаете, что вы делаете неправильно? – TankorSmash

+1

Сначала правильно открепите свой код и добавьте пробел. Не используйте переменное имя 'l', так как его трудно отличить от' 1'; он задает проблемы. –

+1

Возможно, что 'h, i, j, p, l' и' min' также должны быть приватными: каждый поток должен обрабатывать собственное значение 'h, i, j, l' и' min'. – francis

ответ

0

Там есть пара аспектов вам не хватает сейчас:

Private vs. общего переменные: вы не должны иметь несколько потоков использовать то же переменный в качестве счетчиков циклов или любого другого вида ДОПОЛНИТЕЛЬНЫХ переменного. Если один поток изменяет счетчик циклов другого потока, тогда возникает хаос. Решение: указать, какие переменные являются общими и которые являются частными:

#pragma omp parallel for private(s, min, h, i, j, l) shared(n, k, m) 

Снижение: Вы проводите операцию уменьшения на переменную «мин». Начиная с OpenMP 3.1 и GCC 4.7 вы можете иметь OpenMP обрабатывать это сокращение для вас (*):

#pragma omp parallel for reduction(min : min) private(s, h, i, j, l) shared(n, k, m) 
// here the rest of your code 

Этой специфическая часть синтаксиса затемняется именем как операции min (минимума) и вашего min переменного существа тоже самое. Прямо сейчас я не уверен, действительно ли вам нужно изменить имя переменной. Я предполагаю, что вам это не нужно, но, тем не менее, это хорошая идея. Кроме того, как вы уже сказали в комментариях, старайтесь избегать использования буквы «l» в качестве имени переменной, потому что она выглядит как цифра.

(*) В более ранних версиях OpenMP в C вы не было минимальных/максимальных сокращений, поэтому вам пришлось бы хранить временное значение для min в личной переменной каждого потока, а затем найти глобальный минимум после цикла, внутри критического раздела или с помощью атомных операций.

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