診断 15521: ループはベクトル化されませんでした: ループ制御変数が識別されませんでした。ループを実行する前に反復数を計算できる式に置き換えてください。

インテル® DPC++/C++ コンパイラー

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15521: loop was not vectorized: simplify loop control flow and/or explicitly compute the trip count outside of the loop.」(https://software.intel.com/en-us/articles/cdiag15521) の日本語参考訳です。


このベクトル診断メッセージは、インテル® C++ コンパイラー 15.0 以降で生成されます。

原因:

この診断メッセージは、コンパイラーがベクトル化対象のループの反復回数をコンパイル時に判断できない場合に出力されます。次の例では、ループ反復の上限は bar() 関数によって提供され、その実装はコンパイル単位で利用できます。

例:

int bar();

void foo(float *A){
    int i;
    while(1) {
        for (i=0; i<bar();i++){
            A[i] = 0;
        }
    }
}

$ icl 15521.c /c /O3 /Qopt-report:2 /Qopt-report-phase:vec

以下の診断メッセージは、インテル® C++ コンパイラー for Windows* 19.1.0.166 (ビルド 20191121) で生成しました。

最適化レポート開始: foo(float *)

    レポート: ベクトルの最適化 [vec]
ループの開始 D:\15521.c(9,21)
   リマーク #15521: ループ はベクトル化されませんでした: ループ制御変数が識別されませんでした。ループを実行する前に反復数を計算できる式に置き換えるか、または OpenMP* 仕様の標準ループ形式を使用してください。
   ループの開始 D:\15521.c(9,21)
      リマーク #15523: ループ はベクトル化されませんでした: ループ制御変数 i は見つかりましたが、ループを実行する前にループの反復数を計算できません。
   ループの終了
ループの終了

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました