82

これを行うことに反対の兆候はありますか?または、動作が適切に指定されていますか?

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

OpenMP 仕様は c++98 でのみ有効なようですが、ここでは使用されていない C++11 スレッドによる非互換性がさらにあると思われます。それでも確かめたかった。

4

2 に答える 2

54

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++)
{
   ...
}

それでも 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 に答える