使用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的时间来完成。