这样做有什么反指示吗?或者行为是否明确?
#pragma omp parallel for
for(auto x : stl_container)
{
...
}
因为似乎 OpenMP 规范仅对 c++98 有效,但我猜可能由于 C++11 线程而存在更多不兼容性,此处未使用这些线程。我还是想确定一下。
OpenMP 4.0 规范在几天前在这里完成并发布。它仍然要求并行循环应该采用规范形式(第 2.6 节,第 51 页):
for (
init-expr;
test-expr;
incr-expr)
结构化块
该标准允许在所有表达式中使用提供随机访问迭代器的容器,例如:
#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, e.g.
compute(x);
}
}
}
}
任务会产生一定的开销,因此如果compute(x);
需要很少的时间来完成,那么使用这种模式是没有意义的。
OpenMP 5.0 在第 99 页添加了以下行,这使得很多基于范围的 for 循环 OK !
2.12.1.3 具有随机访问迭代器的基于范围的 for 循环具有规范循环形式。
来源:https ://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf