3

パフォーマンスに関しては、次のうちどれがより効率的ですか?

マスター スレッドに代入し、値をすべてのスレッドにコピーします。

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 番目の実装の方が効率的であると思います。

4

1 に答える 1

4

ご提示いただいた3つのバージョンは、いずれも#pragma omp parallel for. したがって、OpenMP はそれぞれの反復を異なるスレッドに自動的に割り当てます。したがって、変数iは各スレッドに対してプライベートになり、各スレッドは反復処理の異なる範囲を持ちます。この変数'i'は、この変数を更新する際の競合状態を回避するために、自動的にプライベートに設定されました。いずれにせよ、変数はパラレル for でプライベートになるため、 private(i)'i'に配置する必要はありません。#pragma omp parallel for

それにもかかわらず、OpenMP は のすぐ下にあるループ#pragma omp parallel forが次の形式であると想定しているため、最初のバージョンではエラーが発生します。

for(init-expr; test-expr;incr-expr)

仕事の範囲を事前に計算するため。

for ディレクティブは、関連するすべての for ループの構造に制限を課します。具体的には、関連付けられているすべての for ループは、次の標準的な形式である必要があります。

for (init-expr; test-expr;incr-expr) 構造化ブロック ( OpenMP Application Program Interfaceページ 39/40.)

編集:最後の2つのバージョンをテストし、生成されたアセンブリを検査しました。ご覧のとおり、両方のバージョンで同じアセンブリが生成されます -> version 2version 3

于 2013-03-18T01:25:15.673 に答える