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

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

メッセージ

次の演算を無条件で安全に実行できる場合、行 %d のループの直前に "%s ivdep" 文を追加してループをベクトル化できます: %s。

アドバイス

"#pragma ivdep" を指定されたループの前に追加します。

このプラグマは、指定された行のループのベクトル化を有効にします。 条件付きの除算、平方根、逆平方根演算を無条件で実行した場合に、プログラムで想定されている例外セマンティクスを変更しないようにする必要があります。

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

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

この例では、浮動小数点例外セマンティクスが有効な場合 (/fp:except オプションなど)、"a[i] > 0" という条件は除算の浮動小数点例外を保護している可能性があるため、コンパイラーはこのループをベクトル化できません。

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

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

確認

すべての反復でオペランドの値が安全であることを確認してください。