この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15523: loop was not vectorized: cannot compute loop trip count outside of the loop」(https://software.intel.com/en-us/articles/cdiag15523) の日本語参考訳です。
このベクトル診断メッセージは、インテル® C++ コンパイラー 15.0 以降で生成されます。
原因:
この診断メッセージは、コンパイラーがベクトル化対象のループの反復回数をコンパイル時に判断できない場合に出力されます。次の例では、ループ反復の上限は bar() 関数によって提供され、その実装はコンパイル単位で利用できます。
例:
int bar(); void foo(float *A){ int i; while(1) { for (i=0; i<bar();i++){ A[i] = 0; } } }
$ icl 15523.c /c /O3 /Qopt-report:2 /Qopt-report-phase:vec
以下の診断メッセージは、インテル® C++ コンパイラー for Windows* 19.1.0.166 (ビルド 20191121) で生成しました。
最適化レポート開始: foo(float *)
レポート: ベクトルの最適化 [vec]
ループの開始 D:\15523.c(9,21)
リマーク #15521: ループ はベクトル化されませんでした: ループ制御変数が識別されませんでした。ループを実行する前に反復数を計算できる式に置き換えるか、または OpenMP* 仕様の標準ループ形式を使用してください。
ループの開始 D:\15523.c(9,21)
リマーク #15523: ループ はベクトル化されませんでした: ループ制御変数 i は見つかりましたが、ループ を実行する前にループの反復数を計算できません。
ループの終了
ループの終了
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。