Распараллеливание цикла для итераторов 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);
}
}
}
Затраты довольно велики, потому что каждый поток выполняет итерацию по всей последовательности (но только для некоторых из них operate
). Ваш метод, использующий int i
, более эффективен.
В качестве альтернативы взгляните на параллельную реализацию GCC std::for_each
. Смотрите мой комментарий.
EDIT : STL Parallism TS , который, скорее всего, станет частью C ++ 17, в будущем может стать хорошим вариантом для перебора стандартных контейнеров.