有没有这样做的反指标?或者是指定的行为?使用OpenMP与C++ 11基于范围的for循环?
#pragma omp parallel for
for(auto x : stl_container)
{
...
}
因为它似乎OpenMP规范仅适用于C++ 98,但我猜有可能是由于C++ 11多线程不兼容,在此不再使用。我想确定,仍然。
有没有这样做的反指标?或者是指定的行为?使用OpenMP与C++ 11基于范围的for循环?
#pragma omp parallel for
for(auto x : stl_container)
{
...
}
因为它似乎OpenMP规范仅适用于C++ 98,但我猜有可能是由于C++ 11多线程不兼容,在此不再使用。我想确定,仍然。
OpenMP 4.0规范在几天前完成并发布了here。它仍然强制要求的并行循环,应在规范形式(§2.6,第51页):
for (
INIT-EXPR;
测试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);
花费很少的时间来完成,那么使用这种模式是没有意义的。
+好问题。也想知道。 – lulyon