qopt-assume-no-loop-carried-dep、Qopt-assume-no-loop-carried-dep

ループのパフォーマンス・チューニング・レベルを設定します。これは C++ 固有のコンテンツです。DPC++ には適用されません。

構文

Linux*:

-qopt-assume-no-loop-carried-dep[=n]

Windows*:

/Qopt-assume-no-loop-carried-dep[=n]

引数

n

ループ伝搬依存への対応方法。設定可能な値は以下のとおりです。

0

コンパイラーは、ループ伝搬依存がないことを仮定しません。これは、このオプションが指定されない場合のデフォルトです。

1

最内ループにループ伝搬依存がないことを仮定するようにコンパイラーに指示します。これは、n を指定せずにこのオプションを使用した場合のデフォルトです。

2

すべてのループレベルにループ伝搬依存がないことを仮定するようにコンパイラーに指示します。

デフォルト

[q または Q]qopt-assume-no-loop-carried-dep=0

コンパイラーは、ループ伝搬依存がないことを仮定しません。

説明

このオプションは、ループのパフォーマンス・チューニング・レベルを設定します。

これは、C/C++ アプリケーションやベンチマークでポインターや引数がエイリアスされている場合に便利です。レベル 1 またはレベル 2 を指定すると、より多くのループがベクトル化されたり、ループ変換の恩恵を受けられます。

このオプションは、ファイル内のすべてのループに適用されます。ループ外のコードには適用されません。

IDE オプション

なし

代替オプション

なし

次のループは、データ依存関係があるためベクトル化されません。[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];
         }
        }
      }
   }