これを行うことに反対の兆候はありますか?または、動作が適切に指定されていますか?
#pragma omp parallel for
for(auto x : stl_container)
{
...
}
OpenMP 仕様は c++98 でのみ有効なようですが、ここでは使用されていない C++11 スレッドによる非互換性がさらにあると思われます。それでも確かめたかった。
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);
完了するまでにほとんど時間がかからない場合は、このパターンを使用しても意味がありません。