インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス

GAP メッセージ (診断 ID 30522)

メッセージ

"%s parallel private(%s)" 文をループの直前 (行 %d) に挿入して、このループを並列化します。

アドバイス

"#pragma parallel private" を指定されたループの前に追加します。 このプラグマは、指定された行のループの並列化を有効にします。

次の例について考えてみます。

float A[10][10000]; 
float B[10][10000]; 
float C[10][10000]; 
void foo(
 int n,
 int m1,
 int m2 
) 
{
  int i,j;
  float W[10000];
  for (i =0; i < n; i++) {
    for (j =0; j < m1; j++)
      W[j]  =  A[i][j] * B[i][j];
    for (j =0; j < m2; j++)
      C[i][j] += W[j] + 1.0;
  } 
}

この例では、確実に m1 >= m2 になるかどうか分からないため、コンパイラーはこのループを並列化しません。

m1 >= m2 であることが分かっており、ループ終了後に W の要素が書き込まれる前にフェッチされることがない場合、次のプラグマを使用できます。

安全であることが分かっている場合は、次のようにプラグマを追加できます。

float A[10][10000]; 
float B[10][10000]; 
float C[10][10000]; 
void foo(
 int n,
 int m1,
 int m2 
) 
{
  int i,j;
  float W[10000]; 
#pragma parallel private (W)
  for (i =0; i < n; i++) {
    for (j =0; j < m1; j++)
      W[j]  =  A[i][j] * B[i][j];
    for (j =0; j < m2; j++)
      C[i][j] += W[j] + 1.0;
  } 
}

確認

ループで配列の要素を読み取る場合は、同じ反復でそれ以前に書き込まれた値でなければなりません。 また、ループ終了後に要素を読み取る場合は、ループ終了後からその読み取りが行われるまでの間に書き込まれた値でなければなりません。