ループのパフォーマンス・チューニング・レベルを設定します。これは C++ 固有のコンテンツです。DPC++ には適用されません。
Linux*: | -qopt-assume-no-loop-carried-dep[=n] |
macOS*: | なし |
Windows*: | /Qopt-assume-no-loop-carried-dep[=n] |
n |
ループ伝搬依存への対応方法。設定可能な値は以下のとおりです。
|
[q または Q]qopt-assume-no-loop-carried-dep=0 |
コンパイラーは、ループ伝搬依存がないことを仮定しません。 |
このオプションは、ループのパフォーマンス・チューニング・レベルを設定します。
これは、C / C++ アプリケーションやベンチマークでポインターや引数がエイリアスされている場合に便利です。レベル 1 またはレベル 2 を指定すると、より多くのループがベクトル化されたり、ループ変換の恩恵を受けられます。
このオプションは、ファイル内のすべてのループに適用されます。ループ外のコードには適用されません。
なし
次のループは、データ依存関係があるためベクトル化されません。[q または Q]opt-assume-no-loop-carried-dep=1 を指定すると、コンパイラーはこのループにはデータ依存関係がないことを仮定し、ループがベクトル化されます。
void sub (float *A, float *B, int* M ) {
for (int i =0; i< 10000 ; i++) {
A[i] += B[M[i]] + 1;
}
}
次の例では、すべてのループの入れ子に依存関係があるため、行列乗算カーネルは最適化されません。[q または Q]opt-assume-no-loop-carried-dep=2 を指定すると、ブロッキング、アンロールとジャム、ベクトル化などのループ変換が行われます。
void matmul(double *a, double *b, double *c) {
int i, j, k;
int n = 1024;
for (i = 0; i < 1024; i++) {
for (j = 0; j < 1024; j++) {
for (k = 0; k < 1024; k++) {
c[i * n + j] += a[i * n + k] * b[k * n + j];
}
}
}
}