9

omp 並列ブロックの外側で critical、single、master、barrier などの omp プラグマを使用しても問題ありませんか? OMP 並列ブロックから、またはそうでなくても呼び出せる関数があります。はいの場合、コードの一部をクリティカル セクションで囲む必要があります。つまり、このコードは大丈夫ですか?

void myfunc(){
    #pragma omp critical
    { /* code */ }
}

// not inside an omp parallel region
myfunc();

#pragma omp parallel
{
    // inside an omp parallel region
    myfunc();
}

OpenMP ドキュメントでこれについての言及は見つかりませんでした。コードは 1 スレッドの実行とまったく同じように動作するはずです。これが gcc での動作です。この動作が移植可能かどうか、または仕様で定義されておらず、何も期待できないものかどうかを知りたいです。

4

1 に答える 1

3

この文書によると:

DO/for、SECTIONS、SINGLE、MASTER、および BARRIER ディレクティブは、動的に囲んでいる PARALLEL (存在する場合) にバインドします。現在実行中の並列領域がない場合、ディレクティブは効果がありません。

答えは、これらのプラグマは並列領域の外で使用できるということです。ドキュメントに明示的に書かれていることはまだわかりませんが。

于 2012-09-27T19:24:24.987 に答える