20

openmpを使用してstd::setを介したループをマルチスレッド化しようとしています。次のコードを書くと-

    #pragma omp parallel for
    for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) {
            const A a = *i;
            operate(a);
    }

このエラーが発生します:

error: invalid type for iteration variable 'i'
error: invalid controlling predicate
error: invalid increment expression.

openmpを使用してstdコンテナーを反復処理する別の正しい方法はありますか?toとイテレータまたはループ本体で使用int iおよび反復 できることはわかっていますが、これはあまりきれいに見えません。0s.size()operator[]

4

1 に答える 1

27

stlイテレータのループ並列化は、OpenMP 3.0以降でのみ機能し、ランダムアクセスイテレータ(vectorおよびdeque)でのみ機能します。あなたはこのようなことをすることができるはずです:

#pragma omp parallel {
   for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) {
      #pragma omp single nowait {
         operate(*i);
      }
   }
}

ただし、各スレッドはシーケンス全体を反復処理するため、オーバーヘッドは非常に大きくなります(ただし、一部のスレッドでのみ実行operateされます)。を使用する方法のint i方が効率的です。

別の方法として、GCCの並列実装を見てくださいstd::for_each。私のコメントを参照してください。

編集:STL Parallism TSは、おそらくC ++ 17の一部であり、将来、標準のコンテナーを反復処理するための優れたオプションになる可能性があります。

于 2010-03-25T09:28:43.160 に答える