使用OpenMP和C++ 11基于范围的for循环?

Jea*_*ier 62 openmp c++11

这样做是否有任何反指示?或者是否明确规定了行为?

#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);花费很少的时间来完成,使用这种模式是没有意义的.

  • @DarioP,`!=`是英特尔主义 - 标准不允许使用它,但`icpc`足够聪明,可以推断循环中发生的事情.我纠正了.这也是需要随机访问迭代器的原因之一 - 通常的迭代器只提供`==`和`!=`运算符. (3认同)

Jea*_*ier 9

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

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

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

  • OpenMP 5.0 还提供对 C++14 和 C++17 的初始支持。但是,并非支持这些基本语言中的所有功能。 (2认同)
  • 至少 GCC 9+、Clang 10+ 应该支持此功能。 (2认同)