0

私のopenMPプログラムを実装するとき、これら2つの質問に悩まされています

Q1: 並列領域と異なるコンストラクトはいつ停止しますか?

OpenMP は {} をコンストラクト領域または並列領域の間の区切りとして使用することを推奨しているようですが、for ループで使用される {} と競合する場合や、コードを単純にするために意図的に使用しないことを選択した場合に、混乱したり、本来の意図に反したりすることがあります。

例 1:

int main() {
int i, j;
int t =0;
int a[sizeA];
for (i=0;i<sizeA;i++)
 a[i] =1;

 double elapsed =-omp_get_wtime();

 #pragma omp parallel for reduction(+: t)
  for(j=0; j<sizeA; j++)
    t=t+a[j];
  --------------------1-----------------------------------------------------
  #pragma omp master     
   printf("The sum of the array %d\n", t);

---------------------2-------------------------------------------------------
  elapsed+=omp_get_wtime();
  printf("The sum of the array In [REDUCTION] is %d: \n", t);
  printf("The time cost is %f: \n", elapsed);   
 -----------------------------3-------------------------------------- 
}

上記の例では、並列領域は (プログラムでマークされているように) 1 または 2 または 3 で停止しますか? テスト結果によると、それは場所 2 で停止します。原因 2-3 の間のセクションが 1 回だけ実行されるため、これはやや混乱します。なぜですか?

私はまた #pragma omp parallel for bla bla、状況をさらに混乱させた、同じコード、少し異なる、{} for for ループの追加のような組み合わせディレクティブの使用にもまったく反対です

   #pragma omp parallel for reduction(+: t)
  for(j=0; j<sizeA; j++)
  { //================difference added here================
    t=t+a[j];
    printf("hi, everyone\n");
  } //===============difference added here ==================

  //--------------------1-----------------------------------------------------
  #pragma omp master     
   printf("The sum of the array %d\n", t);

 //---------------------2-------------------------------------------------------
  elapsed+=omp_get_wtime();
  printf("The sum of the array In [REDUCTION] is %d: \n", t);
  printf("The time cost is %f: \n", elapsed);   
 // -----------------------------3-------------------------------------- 
}

2 番目の例では、並列領域は 1 で停止しますか? 2で?並列領域にコンストラクトを含めたい場合、並列領域に#pragma omp masterブラケットを追加する必要がありますか? その結果、次のように、結合されたディレクティブを壊し#pragma omp parallel forます: または、より良い方法があります(もしあれば、とても幸せです)

   #pragma omp parallel 
  {
    #pragma omp for reduction(+: t)
     for(j=0; j<sizeA; j++)
     { 
       t=t+a[j];
       printf("hi, everyone\n");
     } 

    #pragma omp master     
      bla bla
  }

================================================== =================== **Q2: 同じ並列領域内に配置できる構成要素はどれですか? **

最初の例のように、デフォルトで同じ並列領域#pragma omp forを共有しますが、{} が明示的に thisを示していなくても、 #pragma omp master その後に続くものはありません。同じ並列領域を共有できるのはどのような構造ですか? 共有コンストラクトと同期コンストラクトの作業のように#pragma omp master

これに関する参照はありますか?

どうもありがとう!

4

1 に答える 1

0

ステートメント

#pragma omp parallel for reduction(+: t)

次の C ステートメントを使用して、作業する領域を定義します。領域の開始時に複数のスレッドが生成され、領域の最後でランデブーが発生します。

#pragma omp master

同様に、囲んでいる領域を部分に分割します。そのプラグマの後の部分は、「マスター」スレッドによってのみ実行されます。

並列領域内の「#for」は、領域自体を定義するのではなく、領域によって定義されたスレッドを使用しますが、実行するジョブの数を定義します。「nowait」句が追加されない限り、ループの最後に「バリア」または同期ポイントがあります。「nowait」句を使用すると、ループの後の他のセクション (omp マスターなど) が同時に実行されます。

強調するために、追加するとすぐに

#pragma omp parallel 

複数のスレッドを取得します。すべてのスレッドによって実行された後の単一のステートメントまたはブロック。どのスレッドがコードのどの部分を実行するかを制限するには、別の「#pragma」が必要です。

編集:たとえば、私の8つのコアでは、「Hello World」のみが8回印刷されます。

#include <stdio.h>
#include <omp.h>
int main(){
  printf("Starting\n");
#pragma omp parallel
  printf("Hello World\n");
  printf("Split\n"); 
#pragma omp parallel
  {
#pragma omp master
    printf("OOps, really\n");
  }
  printf("Done\n");
}
于 2015-02-15T07:49:09.697 に答える