Подтвердить что ты не робот

Использование OpenMP с С++ 11 для циклов?

Есть ли контр-индикация для этого? Или хорошо указано поведение?

#pragma omp parallel for
for(auto x : stl_container)
{
   ...
}

Поскольку кажется, что спецификация OpenMP действительна только для С++ 98, но я думаю, что может возникнуть больше несовместимости из-за потоков С++ 11, которые здесь не используются. Я хотел быть уверенным, все еще.

4b9b3361

Ответ 1

Спецификация OpenMP 4.0 была завершена и опубликована несколько дней назад здесь. Он по-прежнему требует, чтобы параллельные петли были в канонической форме (§2.6, с .51):

for ( init-expr ; test-expr ; incr-expr ) structured-block

Стандарт позволяет контейнерам, которые предоставляют итераторы с произвольным доступом, которые будут использоваться во всех выражениях, например:

#pragma omp parallel for
for (it = v.begin(); it < v.end(); it++)
{
   ...
}

Если вы все еще настаиваете на использовании синтаксического сахара С++ 11, и если для обработки каждого элемента stl_container требуется (сравнительно) много времени, то вы можете использовать шаблон однопрофильной задачи:

#pragma omp parallel
{
   #pragma omp single
   {
      for (auto x : stl_container)
      {
         #pragma omp task
         {
            // Do something with x, e.g.
            compute(x);
         }
      }
   }
}

Задача вызывает определенные накладные расходы, поэтому бессмысленно использовать этот шаблон, если compute(x); занимает очень мало времени для завершения.