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

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

メッセージ

変数 "%s" に、ループ本体の最初 (行 %d) で値を代入します。 これにより、ループが並列化されます。

アドバイス

指定されたループの最初でスカラー変数を無条件で初期化できるかどうか確認します。 できる場合は、初期化を行うようにコードを変更するか (標準的なアドバイス)、parallel プラグマの private 節に変数をリストします (高度なアドバイス)。 これにより、並列化機能が各反復においてこれらの変数をプライベート化し、ループを並列化できるようになります。

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

#define N 100000 
double A[N], B[N];
 
void foo(int cond1, int cond2){
  int i, t=7;
  for (i=0; i<N; i++){
    if (cond1) {
      t = i;
    }
    if (cond2) {
      A[i] = t;
    }
  } 
}

この例では、より詳しい情報がなければ変数 t をプライベート化できないため、コンパイラーはこのループを並列化しません。 cond2 が常に cond1 を示唆することが分かっている場合、t を使用するすべての反復において t を使用する前に同じ反復で書き込みが行われることを並列化機能に知らせることができます。 この 1 つの方法として、各反復の最初で t に値を代入します。 別の方法として、parallel プラグマの private 節にプライベート化する変数をリストすることもできます。

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

#define N 100000 
double A[N], B[N];
 
void foo(int cond1, int cond2){
  int i, t=7; 
#pragma private (t)
  for (i=0; i<N; i++){
    if (cond1) {
      t = i;
    }
    if (cond2) {
      A[i] = t;
    }
  } 
}

確認

オリジナルのプログラムにおいて、ループの各反復で変数の読み取りを行う場合は、その変数が同じ反復でそれ以前に定義されているか、parallel プラグマの private 節によりプライベート化されていなければなりません。

関連情報