これを行うための反表示はありますか?または、動作は適切に指定されていますか?
#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);
が完了するまでの時間が非常に短い場合、このパターンを使用しても意味がありません。