私の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
これに関する参照はありますか?
どうもありがとう!