#pragma omp distribute parallel for simd

目的

omp distribute parallel for simd ディレクティブは、ループ反復を各マスター・スレッドに分散し、さらにその反復を各チームのスレッド間で再び分散し、SIMD ベクトル化を各反復に適用します。

構文

構文図を読む構文図をスキップする
                                                .-+---+------.   
                                                | '-,-'      |   
                                                V            |   
>>-#--pragma--omp distribute parallel for simd----+--------+-+-><
                                                  '-clause-'     

構文図を読む構文図をスキップする
>>-for-loops---------------------------------------------------><

パラメーター

omp distribute parallel for simd 構文は複合構文です。clause には、omp distribute ディレクティブまたは omp parallel for simd ディレクティブで受け入れられる任意の節を指定でき、節の意味と制約事項はそれらのディレクティブの場合と同じです。

使用法

omp distribute parallel for simdディレクティブは、-qsmp-qoffload の両方のコンパイラー・オプションを指定する場合のみ有効です。

規則

collapse 節以外の指定された節が omp distribute ディレクティブおよび omp parallel for simd ディレクティブの両方に適用可能な場合、その節は 2 回適用されます。collapse 節は 1 回のみ適用されます。

linear 文節ではループ反復変数のみが指定可能です。

int N = 8;
int a[N];
#pragma omp target map(to: N) map(tofrom: a)
#pragma omp teams num_teams(2) thread_limit(N/2)
#pragma omp distribute parallel for simd
for (i=0, i<N, i++)
{
  a[i] = N;
}
#pragma omp end distribute parallel for simd
#pragma omp end teams
#pragma omp end target

この例では、ターゲット領域に、2 つのチームからなるチーム領域が含まれています。 omp distribute parallel for simd ディレクティブでは、緊密にネストされた分散ループの反復が、実際に作成されたチームに割り当てられ、各チームのマスター・スレッドで、分散された反復が実行されます。さらに、並行実行の各 SIMD チャンクが各チームのスレッド間で再配分され、SIMD チャンクの各反復に SIMD ベクトル化が適用されます。