2013-07-25 22 views
41

これを行うにあたって反対の兆候はありますか?あるいは、その行動は明確に規定されていますか?C++でOpenMPを使用する11範囲ベースのforループ?

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

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

+0

+良い質問です。それも知りたいです。 – lulyon

答えて

28

OpenMP 4.0仕様は数日前に確定され、公開されましたhere

for (INIT-exprの;試験-exprの;INCR-exprの)構成ブロック:それはまだ並列ループは(§2.6、P.51)標準形であるべきであることを義務付け

0:

標準は、ランダムアクセスイテレータは、表現のすべてで使用することを提供した容器、例えばすることができますあなたはまだC++ 11糖衣構文を使用して主張し、それがstl_containerの各要素を処理するために、時間の(比較的)多くがかかっている場合、その後、あなたはパターンをタスクシングルプロデューサーを使用することができれば

#pragma omp parallel for 
for (it = v.begin(); it < v.end(); it++) 
{ 
    ... 
} 

#pragma omp parallel 
{ 
    #pragma omp single 
    { 
     for (auto x : stl_container) 
     { 
     #pragma omp task 
     { 
      // Do something with x, e.g. 
      compute(x); 
     } 
     } 
    } 
} 

タスキングは特定のオーバーヘッドを引き起こします。したがって、compute(x);が完了するまでにわずかな時間がかかる場合は、このパターンを使用する意味がありません。

+0

私はイテレータが今は行く方法だと思っていますが、コードをgccでコンパイルしたい場合は、!= <と置き換える必要があります。そうしないと、 "無効な制御述語"エラーが発生します。ところで、あなたはその理由を知っていますか? – DarioP

+0

このウェブサイトによると:http://www.cplusplus.com/reference/iterator/RandomAccessIterator/ それはうまくいくはずです... –

+0

そのウェブサイトでは、彼らはサイクルの前にプラグマを入れません。コンパイルしようとしました:) – DarioP

関連する問題