Я пытаюсь использовать 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[]
в теле цикла, но это выглядит намного менее чистым.
Распараллеливание цикла для итераторов 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, может быть хорошим вариантом в будущем для итерации по стандартным контейнерам.