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

是否有任何相反的迹象表明这样做? 或者是指定的行为?

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

因为看来OpenMP规范只对c ++ 98有效,但是我猜可能会有更多的不兼容性,因为C ++ 11线程在这里没有使用。 我想确定,仍然。

OpenMP 4.0规范在几天前在此定稿并发布。 它仍然要求并行循环应该是规范forms(§2.6,p.51):

for ( init-expr ; test-expr ; incr-expr ) 结构化块

该标准允许在所有expression式中使用提供随机访问迭代器的容器,例如:

 #pragma omp parallel for for (it = v.begin(); it < v.end(); it++) { ... } 

如果您仍然坚持使用C ++ 11语法糖,并且需要花费相当多的时间处理stl_container每个元素,那么您可以使用单生产者任务模式:

 #pragma omp parallel { #pragma omp single { for (auto x : stl_container) { #pragma omp task { // Do something with x, eg compute(x); } } } } 

任务会导致一定的开销,所以如果使用compute(x);那么使用这个模式是没有意义的compute(x); 花费很less的时间来完成。