0

4つのスレッドがあり、一度に3つの機能を開始したいと思います。各関数は1つのスレッドを取ります。
しかし、このコードはすべての関数を4回開始しています

#pragma omp parallel
    {
        Func1();
        Func2();
        Func3();
    }

そして私はこの結果を持っています:

Func * 1 *開始

Func * 1 *開始

Func * 1 *開始

Func * 1 *開始

Func * 1 *終了

Func * 1 *終了

Func * 1 *終了

Func * 1 *終了

Func * 2 *開始

Func * 2 *開始

Func * 2 *開始

Func * 2 *開始

Func * 2 *終了

Func * 2 *終了

Func * 2 *終了

Func * 2 *終了

..。

次のようなコードを表示するようにコードを変更するにはどうすればよいですか?

Func * 1 *開始

Func * 2 *開始

Func * 3 *開始

Func * 2 *終了

Func * 1 *終了

Func * 3 *終了

4

2 に答える 2

5

あなたが探しているのは、sectionsワークシェアリング構造です。構文は次のようになります。

#pragma omp parallel
{
#pragma omp sections
  {
#pragma omp section
    Func1();
#pragma omp section
    Func2();
#pragma omp section
    Func3();
  }
}

この構成がどのように機能するかについての詳細は、仕様とその中の例を参照することをお勧めします。

于 2012-10-14T16:32:21.037 に答える
1

Massimilianoがすでに回答しているように、目的を達成するための最も簡単な方法は、sections構成を使用することです。

#pragma omp parallel sections
{
    #pragma omp section
    Func1();
    #pragma omp section
    Func2();
    #pragma omp section
    Func3();
}

sectionsコンストラクトがリージョン内にネストされている唯一のものである場合parallel、両方のプラグマを図のように組み合わせることができます)

それぞれsectionがステートメントまたはその直後のブロックをスコープします。たとえば、セクションにさらにコードを含めたい場合は、ブロック内に配置する必要があります。

#pragma omp section
{
    Func1();
    SomeOtherFunc1();
}

各スレッドの動作を制御するためのより一般的な方法は、によって返されるスレッドIDを調べ、omp_get_thread_num()それに応じて分岐することです。これは、MPIプログラムの記述方法に似ています。

#pragma omp parallel
{
    switch (omp_get_thread_num())
    {
        case 0:
            Func1();
            break;
        case 1:
            Func2();
            break;
        case 2:
            Func3();
            break;
        default:
            // Do nothing
     }
}

明らかな欠点の1つは、並列領域を実行するスレッドがチームに少なくとも3つ存在しない場合にのみ機能することです。つまり、スレッドIDに依存するコードは移植性がいくらかなくなります。対照的に、sectionsディレクティブは任意の数のスレッドで機能します。たとえば、スレッドが1つしかない場合は、すべてのセクションが順番に実行されます。

于 2012-10-14T21:08:33.297 に答える