这样做有反作用吗?或者是否明确指定了行为?
#pragma omp parallel for
for(auto x : stl_container)
{
...
}
因为看起来OpenMP规范只对c ++ 98有效,但我想由于C ++ 11线程可能存在更多的不兼容性,这里没有使用它们。我还是想确定。
答案 0 :(得分:39)
OpenMP 4.0规范已于几天前完成并发布here。它仍然要求并行循环应该是规范形式(§2.6,p.51):
for (
init-expr;
test-expr;
incr-expr {{ 1}} structured-block
该标准允许在所有表达式中使用提供随机访问迭代器的容器,例如:
)
如果您仍然坚持使用C ++ 11语法糖,并且如果需要(相对)大量时间来处理#pragma omp parallel for
for (it = v.begin(); it < v.end(); it++)
{
...
}
的每个元素,那么您可以使用单生成器任务模式:
stl_container
任务导致某些开销,因此如果#pragma omp parallel
{
#pragma omp single
{
for (auto x : stl_container)
{
#pragma omp task
{
// Do something with x, e.g.
compute(x);
}
}
}
}
花费很少的时间来完成,那么使用此模式是没有意义的。
答案 1 :(得分:5)
OpenMP 5.0在第99页上添加了以下行,这使得很多基于范围的for循环行!
2.12.1.3具有随机访问迭代器的基于范围的for循环具有规范的循环形式。
来源:https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf