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

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

メッセージ

"%s ivdep" 文をループの直前 (行 %d) に挿入して、このループをベクトル化します。

アドバイス

"#pragma ivdep" を指定されたループの前に追加します。 このプラグマは、いくつかの想定されるループの繰り返し間のデータ依存を無視して、指定された行のループのベクトル化を有効にします。

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

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

この例では、各反復がその前の反復に依存しており、x が -1 になる可能性があるため、コンパイラーはこのループをベクトル化できません。 x が正の数であることが分かっている場合は、このループをベクトル化できます。

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

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

確認

ループ内の配列に安全ではない繰り返し間の依存関係がないことを確認してください。 繰り返し間の依存関係は、ループの 1 つの反復でメモリー位置の変更を行い、別の反復でその読み取り/書き込みを行った場合に発生します。 このような依存関係が存在しないこと、または依存関係が存在する場合は安全に無視できることを確認してください。