並列領域にない OpenMP* ワークシェアリング構造

ワークシェアリング構造が並列で実行されないコンテキストにあります。

OpenMP* ワークシェアリング構造は、並列で実行できる作業単位を定義します。ただし、これらの作業単位を並列で実行するスレッドチームは、ワークシェアリング構造が単独で作成するものではありません。むしろ、ワークシェアリング領域は、最内の囲まれた PARALLEL 領域にバインドします。このエラーは、このワークシェアリング構造が動的に PARALLEL 領域内に囲まれていない (あるいは常に囲まれていない) ために、並列で実行されない (または実行されない可能性がある) ことを示します。

最も簡単な修正方法は、ワークシェアリング構造を並列ワークシェアリング構造に置き換えることです。例えば、"#pragma omp for" (C の場合) または "!$OMP DO" (FORTRAN の場合) の代わりに、"#pragma omp parallel for" または "!$OMP PARALLEL DO" を使用します。

ID

問題箇所

説明

1

OpenMP* 宣言

ワークシェアリング構造の場所


void f(int n, double *a1, double *a2, double *a3)
{
    int i;
    // should be #pragma omp parallel for unless called from a parallel region
    #pragma omp for 
    for (i = 1; i++; i < n) {
        a1[i] = a2[i] * a3[i];
    }
}
        
次に FORTRAN の同様の例を示します。

subroutine F(N, A1, A2, A3)
    integer N, I
    real A1(N), A2(N), A3(N)
    ! Should be $OMP PARALLEL DO if not called from parallel region
    !$OMP DO
    do I = 1, N
        A1[I] = A2[I] * A3[I]
    end do
    !$OMP END DO
end subroutine F
        

© 2010 Intel Corporation. 無断での引用、転載を禁じます。