使用OpenMP和C ++ 11基于范围的for循环?

时间:2013-07-25 03:29:35

标签: c++11 openmp

这样做有反作用吗?或者是否明确指定了行为?

#pragma omp parallel for
for(auto x : stl_container)
{
   ...
}

因为看起来OpenMP规范只对c ++ 98有效,但我想由于C ++ 11线程可能存在更多的不兼容性,这里没有使用它们。我还是想确定。

2 个答案:

答案 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