Как создать `omp параллель для` с синхронизацией (` барьер`) всех потоков в середине с OpenMP - PullRequest
6 голосов
/ 10 ноября 2009

У меня есть две функции, do_step_one(i) и do_step_two(i), для i от 0 до N-1.

В настоящее время у меня есть этот (последовательный) код:

for(unsigned int i=0; i<N; i++) {
     do_step_one(i);
}

for(unsigned int i=0; i<N; i++) {
     do_step_two(i);
}

Каждый вызов do_step_one() и do_step2() может быть выполнен в любом порядке и параллельно, но для любого do_step_two() необходим конец всех do_step_one(), чтобы начать (он использует do_step_one() результаты).

Я попробовал следующее:

#omp parallel for
for(unsigned int i=0; i<N; i++) {
    do_step_one(i);

#omp barrier

    do_step_two(i);
}

Но GCC жалуется

convolve_slices.c: 21: предупреждение: барьерная область не может быть близко вложена в область разделения работы, критического, упорядоченного, основного или явного задания.

Что я неправильно понимаю? Как решить эту проблему?

Ответы [ 2 ]

11 голосов
/ 14 ноября 2011

Просто примечание: если вы хотите убедиться, что потоки не воссозданы, разделите объявление параллели и объявление for:

#pragma omp parallel
{
  #pragma omp for
  for(unsigned int i=0; i<N; i++){
    do_step_one(i);
  }
  //implicit barrier here
  #pragma omp for
  for(unsigned int i=0; i<N; i++){
    do_step_two(i);
  }
}
4 голосов
/ 10 ноября 2009

Одна проблема, которую я вижу с этим кодом, состоит в том, что код не соответствует спецификации:)

Если вам нужно завершить все do_step_one (), вам понадобится что-то вроде следующего:

#pragma omp parallel for
for(unsigned int i=0; i<N; i++){
     do_step_one(i);
}

#pragma omp parallel for
for(unsigned int i=0; i<N; i++){
     do_step_two(i);
}

Результатом этого будет параллелизм первого для, а затем параллелизм второго для.

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