ベクトル依存性が存在していると推定されてもそれを無視するようにコンパイラーに指示します。
#pragma ivdep |
なし
ivdep プラグマは、ベクトル依存性が存在していると推定されてもそれを無視するようコンパイラーに指示します。正しいコードにするため、コンパイラーは、想定される依存性を証明された依存性として扱い、ベクトル化を行わないようにします。このプラグマは、その決定を無視します。このプラグマは、想定されているループの依存性が安全で、無視できる場合にのみ使用してください。
ベクトル化を防ぐ証明された依存性は無視されず、想定された依存性のみが無視されます。
IA-64 アーキテクチャー上で実行されることを想定したアプリケーションで ivdep プラグマが指定された場合、-ivdep-parallel オプション (Linux* システム) または /Qivdep-parallel オプション (Windows* システム) は、ループにループ伝播のメモリー依存がないことを示します。この手法は、スパース・マトリクス・アプリケーションに役立ちます。例 2 を参照してください。
例 1
この例のループは、k の値が不明なため、ivdep プラグマなしではベクトル化を行いません (ベクトル化は k < 0 の場合、不正です)。
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;
}
プラグマは、現在の関数に含まれている for ループだけをバインドします。これには、現在の関数によって呼び出されるサブ関数に含まれる for ループも含まれます。
例 2
例えば、次のループでは、ループ伝播の依存がないことを示す ivdep プラグマの他に parallel オプションが必要です。
#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;
}
例 3
例えば、次のループでは、a() への格納でループ伝播の依存がないことを示す ivdep プラグマの他に parallel オプションが必要です。
#pragma ivdep
for (j=0; j<n; j++)
{
a[b[j]] = a[b[j]] + 1;
}