Ожидание завершения задачи OpenMP на неявных барьерах?

Если я создам кучу задач OpenMP и не использую taskwait, где программа будет ждать завершения этих задач? Рассмотрим следующий пример:

#pragma omp parallel
{
   #pragma omp single
   {
      for (int i = 0; i < 1000; i++) {
         #pragma omp task
         ... // e.g., call some independent function
      }
      // no taskwait here
   }
   // all the tasks completed now?
}

Ожидает ли программа завершения задачи у неявного барьера в конце блока single? Я предполагаю, что да, но не могу найти никакой информации об этой проблеме в спецификации OpenMP.

ИЗМЕНИТЬ

Из barrier описания в OpenMP Spec.:

Все потоки команды, выполняющие связывающую параллельную область, должны выполнить барьерную область и завершить выполнение всех явных задач, привязанных к этой параллельной области, прежде чем им будет разрешено продолжить выполнение за пределами барьера.

Это, однако, не говорит о том, отвечаю ли я за выполнение задачи или среда выполнения OpenMP делает это за меня.


person Daniel Langr    schedule 13.02.2017    source источник


Ответы (1)


Выполнение задачи в OpenMP является неявным, а не явным (1.2.5 Терминология задач)

завершение задачи Завершение задачи происходит, когда заканчивается структурированный блок, связанный с конструкцией, сгенерировавшей задача достигнута.

В конце конструкции совместной работы single есть неявный барьер. Как вы упомянули, барьеры ждут явных задач. Поэтому все задачи будут выполнены в блоке single.

person Zulan    schedule 13.02.2017
comment
Спасибо. Я как бы не ожидал, что это будет определено в разделе «Глоссарий» спецификации. - person Daniel Langr; 13.02.2017