私が使用したことがなく、いつ使用するかわからない OpenMP ディレクティブの 1 つはflush
(リストの有無にかかわらず) です。
2 つの質問があります。
1.) When is an explicit `omp flush` or `omp flush(var1, ...) necessary?
2.) Is it sometimes not necessary but helpful (i.e. can it make the code fast)?
明示的なフラッシュをいつ使用するかを理解できない主な理由は、スレッドを同期する多くのディレクティブ (バリア、シングルなど) の後に暗黙的にフラッシュが行われることです。たとえば、フラッシュを使用して同期しない方法がわかりません(たとえば、とnowait
)。
異なるコンパイラが異なる方法で実装する可能性があることを理解していomp flush
ます。リストを使用したフラッシュを、 OpenMP のフラッシュとフラッシュ (リスト)を使用しない (つまり、すべての共有オブジェクトをフラッシュする) と解釈する人もいます。しかし、私は仕様が必要とするものだけを気にします。言い換えれば、明示的なflush
原則が必要または役立つ場所を知りたいのです。
編集:2番目の質問を明確にする必要があると思います。例を挙げましょう。暗黙的なフラッシュを削除して (たとえば、nowait を使用)、代わりに明示的なフラッシュを使用する場合があるかどうかを知りたいのですが、特定の共有変数に対してのみ (それでも正しい結果が得られます)。次のようなもの:
float a,b;
#pragma omp parallel
{
#pragma omp for nowait // No barrier. Do not flush on exit.
//code which uses only shared variable a
#pragma omp flush(a) // Flush only variable a rather than all shared variables.
#pragma omp for
//Code which uses both shared variables a and b.
}
コードには最初の for ループの後にまだバリアが必要だと思いますが、すべてのバリアには暗黙的なフラッシュがあるため、目的が無効になります。フラッシュを行わないバリアを持つことは可能ですか?