0

セクションを使用するこの OpenMP コードがあります

    #pragma omp parallel sections num_threads(8)
    {
        printf_s("Allo from thread %d\n", omp_get_thread_num());
        #pragma omp section
        printf_s("Bello from thread %d\n", omp_get_thread_num());
        #pragma omp section
        printf_s( "Cello from thread %d\n", omp_get_thread_num());
    }

さまざまな種類の出力が得られます。スレッド 0 だけが 3 行すべてを出力することもあれば、別のスレッドが出力することもあります。3 つの行は常に 3 つの異なるスレッドから出力されるべきではありませんか?

4

2 に答える 2

1

Open MPは、同時計算を行うために各セクションが異なるスレッドによって実行されることを保証します。

最初のステートメントは、作成された8つのスレッドのいずれかで実行できますが、2番目と3番目のprintステートメントは、作成された8つのスレッドの任意の2つの異なるスレッドで実行されます。それが起こらない場合は、最初のステートメントをプラグマセクションディレクティブの下に置きます。次に、3つのステートメントすべてが異なるスレッドによって実行されます。

于 2012-06-18T06:41:44.837 に答える
1

OpenMP は、期待する動作を保証しません。セクション構造は、各セクションが 1 つの (そして 1 つのみの) スレッドによって実行されることを保証します (少なくとも、構造保証の仕様では、実装が壊れている可能性があります)。各セクションが異なるスレッドによって実行されることを保証するものではありません。

あなたが観察したレベルでは、プログラムは非決定論的です。これは並列プログラムでは珍しいことではなく、心に留めておくべき教訓です。必要に応じて、コードのセグメントの実行を順序付けることがプログラマの責任である場合があります。

于 2012-05-23T13:56:12.353 に答える