2011-12-22 9 views
2

#pragma omp parallelの最初にスレッドの束が作成され、#pragma omp forに到達するとワークロードが分散されます。このforループの中にforループがある場合はどうなりますか?また、その前に#pragma omp forを置きますか?各スレッドは新しいスレッドを作成しますか?そうでなければ、どのスレッドにこのタスクが割り当てられていますか?この状況ではどういうことが起こりますか?プラグマの内部にプラグマがある場合、OpenMPではどうなりますか?

答えて

3

デフォルトでは、内部ループ用にスレッドが生成されません。それは、それに到達するスレッドを使用して順次行われます。

これは、デフォルトでネストが無効になっているためです。ただし、omp_set_nested()でネストを有効にすると、新しいスレッドセットが生成されます。

ただし、慎重でないと、元のスレッドのそれぞれがpスレッドを生成するため、p^2のスレッド数になります。したがって、ネストはデフォルトでは無効になっています。次のような状況では

+0

あなたの答えは、OPによって尋ねられたものとは異なる状況に対処しているという意味で間違っていると思います。 – Massimiliano

+0

@Massimilianoうーん...良い点。しかし、あなたがあなたの答えで主張しているUBを確認することも拒否することもできません。私はこれら2つの箇条書きの解釈が異なっているようです。 – Mysticial

+0

あなたの解釈は何ですか?少なくとも、あなたは 'n%nthreads!= 0'、スケジュールは 'static'ではないので、ポイント2は常に違反していますか? – Massimiliano

1

#pragma omp parallel 
{ 
#pragma omp for 
    for(int ii = 0; ii < n; ii++) { 
    /* ... */ 
#pragma omp for 
    for(int jj = 0; jj < m; jj++) { 
     /* ... */ 
    } 
    } 
} 

何が起こることは、あなたがOpenMPの標準に違反するとして、あなたは未定義の動作をトリガーするということです。以下の制限がワークシェアリング構造に適用されます

  • 各ワークシェアリング領域がチームにまたはnoneにより、すべてのスレッドが遭遇しなければならないより正確には、あなたは、セクション2.5(ワークシェアリング構造)に登場するの制限に違反しますまったく。
  • 発生したワークシェアリング領域とバリア領域の順序は、チーム内のすべてのスレッドで同じでなければなりません。

これは明らかに実施例A.39.1c and A.40.1cに示されている:

例A.39.1c:内側と外側のループ領域が別に結合するためをネストループ構造の以下の例は、適合されています平行 領域:

void work(int i, int j) {} 
void good_nesting(int n) 
{ 
    int i, j; 
#pragma omp parallel default(shared) 
    { 
#pragma omp for 
    for (i=0; i<n; i++) { 
#pragma omp parallel shared(i, n) 
    { 
#pragma omp for 
     for (j=0; j < n; j++) 
     work(i, j); 
    } 
    } 
    } 
} 

例A.40.1c次の例で、内側と外側のループ領域が密接にこれが異なっていること

void work(int i, int j) {} 
void wrong1(int n) 
{ 
#pragma omp parallel default(shared) 
    { 
    int i, j; 
#pragma omp for 
    for (i=0; i<n; i++) { 
    /* incorrect nesting of loop regions */ 
#pragma omp for 
     for (j=0; j<n; j++) 
     work(i, j); 
    } 
    }  
} 

お知らせ入れ子になっているので、不適合です:あなたは、ネストされたを起動しようとする

#pragma omp parallel for 
    for(int ii = 0; ii < n; ii++) { 
    /* ... */ 
#pragma omp parallel for 
    for(int jj = 0; jj < m; jj++) { 
     /* ... */ 
    } 
    } 

すると平行領域。この場合のみ、神秘的な答えの議論が成立する。

関連する問題