パフォーマンスに関しては、次のうちどれがより効率的ですか?
マスター スレッドに代入し、値をすべてのスレッドにコピーします。
int i = 0;
#pragma omp parallel for firstprivate(i)
for( ; i < n; i++){
...
}
各スレッドでの変数の宣言と割り当て
#pragma omp parallel for
for(int i = 0; i < n; i++){
...
}
マスタースレッドで変数を宣言しますが、各スレッドで割り当てます。
int i;
#pragma omp parallel for private(i)
for(i = 0; i < n; i++){
...
}
ばかげた質問に思えるかもしれませんし、パフォーマンスへの影響は無視できるかもしれません。しかし、少量の計算を行い、多数回呼び出されるループを並列化しているので、このループから絞り出すことができる最適化は役に立ちます。
より低レベルの説明と、OpenMP がこれを処理する方法を探しています。
たとえば、多数のスレッドを並列化する場合xor
、変数をすべてのスレッドにコピーするよりも変数を初期化する方がはるかに効率的であるため、2 番目の実装の方が効率的であると思います。