4

私はこれらの2つのコードセクションを持っています

#pragma omp parallel
#pragma omp sections
  {
#pragma omp section
    printf("H");
#pragma omp section
    printf("e");
#pragma omp section
    printf("l");
#pragma omp section
    printf("l");
#pragma omp section
    printf("o");
#pragma omp section
    printf(" ");
#pragma omp section
    printf("W");
#pragma omp section
    printf("o");
#pragma omp section
    printf("r");
#pragma omp section
    printf("l");
#pragma omp section
    printf("d");
#pragma omp section
    printf("!");
  }

char word[] = "Hello World!";
int n;

#pragma omp parallel for
  for(n=0; n<12; n++)
  {
  printf("%c", word[n]);
  }

最初のものは常に印刷Hello World!しますが、2番目のものは時々印刷しますHello World!そして時々印刷しますHelld!lo Wor

最初の1つが決定論的で、もう1つが決定論的ではないのはなぜですか?

4

4 に答える 4

7

まず第一に、公式のGCC4.1.2はOpenMPをサポートしていません。おそらく、RedHatから派生したLinuxディストリビューション(RHEL、Fedora、CentOS、Scientific Linuxなど)があり、OpenMPサポートが新しいバージョンからGCC4.1.2にバックポートされています。RHは、最終的に新しいGCCバージョンに切り替えるまで、かなり長い間そのバックポートを維持していました。

共有ストリームに書き込むと、OpenMPセクションと並列ループの両方で非決定的な動作が発生します。ここで観察されるのは、sectionsGCCでの実装の動的スケジューリングの性質の結果です。libgomp(GCC OpenMPランタイム)は、チーム内のスレッド間で先着順でセクションを配布します。あなたのケースでおそらく起こることは、セクションのサイズが非常に短いため、実行時間が短いため、並列領域の開始時にドッキングバリアを出る最初のスレッドが、他のスレッドが追いつく前にすべての作業項目を消費することです。すべてのセクションのシリアル実行。

並列ループの場合、観察されるforのは、デフォルトのループスケジューリングの結果です。つまり、12回の反復が線形にスレッド間で均等に分割されます。あなたのケースには(スクランブルされた出力からのテキストセグメントに基づいて)6つのスレッドがあると思います。したがって、スレッド0は0から1までの反復を取得し、スレッド1は2から3までの反復を取得します。繰り返しますが、各スレッドでの反復の実行は非常に明確に定義されていますが、スレッド自体がどのような順序で実行されるかは保証されていません。libgompstatic

この動作はGCC固有であることに注意してください。OpenMP標準は次のように述べています。

チーム内のスレッド間で構造化ブロックをスケジュールする方法は、実装によって定義されます。

たとえば、Intelのコンパイラは、セクションをラウンドロビン方式で配布します。つまり、静的スケジューリングとチャンクサイズが1の並列ループが行うのと同じように、セクションnはスレッドに与えられます。n % num_threadsfor

于 2013-03-26T15:43:52.233 に答える
4

forループで同じことを実行したい場合は、次のようにforループで「ordered」を使用します。

#pragma omp parallel for ordered 
for(n=0; n<12; n++) {
    #pragma omp ordered
    printf("%c", word[n]);
}

この例を参照してください:http: //bisqwit.iki.fi/story/howto/openmp/#ExampleCalculatingTheMandelbrotFractalInParallel

于 2013-03-26T09:23:43.833 に答える
2

omp parallel for決定論的ではありません。この句を使用して、配列に独立したデータを持つアルゴリズムを実装する必要があります。一部のテキストを印刷する場合、文字は1つずつ順番に続く必要がありますが、omp parallel forコードはランダムな順序で実行されます。

于 2013-03-25T15:11:32.203 に答える
2

セクションは決定論的ではなく、並列形式でもありません。ここでのOpenMP仕様 は、セクションが決定論的であることについては何も述べていません。

私はあなたのセクションコードを2つのスレッドで実行しましたHllo World!e

あなたのコードが順番に文字を生成したのは偶然でした。

于 2013-03-25T22:55:59.537 に答える