web-dev-qa-db-ja.com

C ++ 11範囲ベースのforループでOpenMPを使用していますか?

これを行うための反表示はありますか?または、動作は適切に指定されていますか?

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

OpenMP仕様はc ++ 98に対してのみ有効であるように見えますが、ここでは使用されていないC++ 11スレッドにより、さらに非互換性がある可能性があります。確かにしたかったのです。

OpenMP 5.0は、99ページに次の行を追加します。これにより、多くの範囲ベースのforループがOKになります。

2.12.1.3ランダムアクセス反復子を使用した範囲ベースのforループには、標準的なループ形式があります。

ソース: https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf

OpenMP 4.0仕様は数日前に最終決定され公開されました here 。並列ループは標準形式(§2.6、p.51)にする必要があります。

_for (_init-expr_;_test-expr_;_incr-expr_)_structured-block

標準では、ランダムアクセスイテレータを提供するコンテナをすべての式で使用できます。例:

_#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);が完了するまでの時間が非常に短い場合、このパターンを使用しても意味がありません。

42
Hristo Iliev