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

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

メッセージ

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

アドバイス

指定されたループの最初でスカラー変数を無条件で初期化します。 これにより、ベクトル化機能が各反復においてこれらの変数をプライベート化し、ループをベクトル化できるようになります。 すべての変数はソースコードの変更前と変更後で同じ値を参照するようにしなければなりません。

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

void foo(float *a, int n) {
  int i;
  float b;
  for (i=0; i<n; i++) {
    if (a[i] > 0) {
      b = a[i];
      a[i] = 1 / a[i];
    }
    if (a[i] > 1) {
      a[i] += b;
    }
  }
  return; 
}

この例では、変数 b のプライベート化に失敗したため、コンパイラーはこのループをベクトル化できません。 ベクトル化は、b の値が使用される各反復で b への代入が行われる場合にサポートされます。 そのため、ベクトル化するための 1 つの方法として、すべての反復で代入を行うようにします。

安全であることが分かっている場合は、次のようにプログラムコードを変更します。

void foo(float *a, int n) {
  int i;
  float b;
  for (i=0; i<n; i++) {
    b = a[i];
    if (a[i] > 0) {
      a[i] = 1 / a[i];
    }
    if (a[i] > 1) {
      a[i] += b;
    }
  }
  return; 
}

確認

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