这样做是否有任何反指示?或者是否明确规定了行为?
#pragma omp parallel for
for(auto x : stl_container)
{
...
}
Run Code Online (Sandbox Code Playgroud)
因为看起来OpenMP规范只对c ++ 98有效,但我想由于C++ 11线程可能存在更多的不兼容性,这里没有使用它们.我还是想确定一下.
Hri*_*iev 43
OpenMP的4.0规范已经完成,并出版前几天在这里.它仍然要求并行循环应该是规范形式(§2.6,p.51):
for (init-expr;test-expr;incr-expr)结构块
该标准允许在所有表达式中使用提供随机访问迭代器的容器,例如:
#pragma omp parallel for
for (it = v.begin(); it < v.end(); it++)
{
...
}
Run Code Online (Sandbox Code Playgroud)
如果您仍然坚持使用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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
任务导致某些开销,因此如果compute(x);花费很少的时间来完成,使用这种模式是没有意义的.
OpenMP 5.0在第99页上添加了以下行,这使得很多基于范围的for循环行!
2.12.1.3具有随机访问迭代器的基于范围的for循环具有规范的循环形式。
来源:https : //www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf
| 归档时间: |
|
| 查看次数: |
13275 次 |
| 最近记录: |