インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
ベクトル依存性が存在していると推定されてもそれを無視するようにコンパイラーに指示します。
#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 オプションが必要です。