82

这样做有什么反指示吗?或者行为是否明确?

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

因为似乎 OpenMP 规范仅对 c++98 有效,但我猜可能由于 C++11 线程而存在更多不兼容性,此处未使用这些线程。我还是想确定一下。

4

2 回答 2

54

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);需要很少的时间来完成,那么使用这种模式是没有意义的。

于 2013-07-25T09:04:20.360 回答
25

OpenMP 5.0 在第 99 页添加了以下行,这使得很多基于范围的 for 循环 OK !

2.12.1.3 具有随机访问迭代器的基于范围的 for 循环具有规范循环形式。

来源:https ://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf

于 2018-07-17T22:07:34.380 回答