Ответ 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);
занимает очень мало времени для завершения.