Какую прагму openMP я использую для блокировки цикла? - PullRequest
3 голосов
/ 12 августа 2011

Мой алгоритм (решение уравнения Пуассона) полностью распараллеливается - при условии, что все потоки синхронизируются в конце каждой итерации.

Function f, fNext;
init(f);
#pragma omp parallel
for(int step=0; step<maxITER; step++) {
#pragma omp for
   for(int i=0; i<N; i++) {
      for(int j=0; j<N; j++) {
         fNext(i,j) = someOperator( f(i,j) );
      }
   }
   f = fNext;
}//Threads must synchronize here

Обеспечивает ли #pragma omp for синхронизацию потоков перед продолжением следующей итерации?

1 Ответ

5 голосов
/ 12 августа 2011

Да.Из OpenMP Spec (например, v 3.1, но это было с самого начала), в разделе "конструкции разделения:"

Существует неявный барьер в концеконструкция цикла, если не указано предложение nowait.

То есть в конце цикла for, если вы не сделаете что-то вроде #pragma omp for nowait, существует неявный барьер, так что ни один поток не будет выполнятьсяf=fNext пока все потоки не будут выполнены для цикла for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...