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

ivdep

ベクトル依存性が存在していると推定されてもそれを無視するようにコンパイラーに指示します。

構文

#pragma ivdep

引数

なし

説明

ivdep プラグマは、ベクトル依存性が存在していると推定されてもそれを無視するようにコンパイラーに指示します。正しいコードにするため、コンパイラーは、想定される依存性を証明された依存性として扱い、ベクトル化を行わないようにします。このプラグマは、その決定を無視します。このプラグマは、想定されているループの依存性が安全で、無視できる場合にのみ使用してください。

ivdep プラグマの他に、vector プラグマをベクトル化の効率性ヒューリスティックをオーバーライドするために使用することができます。

ベクトル化を防ぐ証明された依存性は無視されず、想定された依存性のみが無視されます。

void ignore_vec_dep(int *a, int k, int c, int m) {
  #pragma ivdep
  for (int i = 0; i < m; i++)
    a[i] = a[i + k] * c; 
}

この例のループは、k の値が不明なため、ivdep プラグマなしではベクトル化を行いません (ベクトル化は k < 0 の場合、不正です)。

プラグマは、現在の関数に含まれている for ループだけをバインドします。これには、現在の関数によって呼び出されるサブ関数に含まれる for ループも含まれます。

#pragma ivdep 
  for (i=1; i<n; i++) {
    e[ix[2][i]] = e[ix[2][i]]+1.0;
    e[ix[3][i]] = e[ix[3][i]]+2.0; 
}

このループでは、ループ伝播の依存がないことを示す ivdep プラグマの他に parallel オプションが必要です。

#pragma ivdep 
  for (j=0; j<n; j++) { a[b[j]] = a[b[j]] + 1; }

このループでは、a() への格納でループ伝播の依存がないことを示す ivdep プラグマの他に parallel オプションが必要です。

関連情報