Повторение через контейнеры станд. в openmp

Я пытаюсь использовать openmp для многопоточности цикла через станд.:: набор. Когда я пишу следующий код -

    #pragma omp parallel for
    for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) {
            const A a = *i;
            operate(a);
    }

Я получаю эту ошибку:

error: invalid type for iteration variable 'i'
error: invalid controlling predicate
error: invalid increment expression.

Существует ли другой, корректный способ выполнить итерации через контейнеры станд. с помощью openmp? Я знаю, что могу использовать int i и выполните итерации от 0 кому: s.size() и итератор или operator[] в теле цикла, но это выглядит намного менее чистым.

20
задан Dan 16 October 2013 в 19:54
поделиться

1 ответ

Распараллеливание цикла для итераторов stl работает только с OpenMP 3.0 и только для итераторов с произвольным доступом (например, vector и deque ). Вы должны уметь делать что-то вроде этого:

#pragma omp parallel {
   for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) {
      #pragma omp single nowait {
         operate(*i);
      }
   }
}

Накладные расходы довольно велики, потому что каждый поток выполняет итерацию по всей последовательности (но выполняет только операцию на некоторых из них). Ваш метод с использованием int i более эффективен.

В качестве альтернативы взгляните на параллельную реализацию GCC std :: for_each . Смотрите мой комментарий.

РЕДАКТИРОВАТЬ : STL Parallism TS , который, скорее всего, будет частью C ++ 17, может быть хорошим вариантом в будущем для итерации по стандартным контейнерам.

25
ответ дан 30 November 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: