この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15542: xxxx was not vectorized: inner loop was already vectorized」(https://software.intel.com/en-us/articles/cdiag15542) の日本語参考訳です。
このベクトル診断メッセージは、インテル® C++ コンパイラー 15.0 以降で生成されます。
原因:
この診断メッセージは、for ループが入れ子構造になっており、内部ループがベクトル化されている場合に出力されます。内部 for ループがベクトル化されると、外部ループに対してこの診断メッセージが出力されます。
例:
#define N 1000 float A[N][N]; void foo(int n){ int i,j; for (i=0;i<n;i++){ for (j=0;j<n;j++){ A[i][j]++; } } }
$ icl 15542.c /c /Qopt-report:2 /Qopt-report-phase:vec
以下の診断メッセージは、インテル® C++ コンパイラー for Windows* 19.1.0.166 (ビルド 20191121) で生成しました。
最適化レポート開始: foo(int)
レポート: ベクトルの最適化 [vec]
ループの開始 D:\15542.c(5,3)
リマーク #15542: ループ はベクトル化されませんでした: 内部ループがすでにベクトル化されています。
ループの開始 D:\15542.c(6,5)
リマーク #15300: ループがベクトル化されました。
ループの終了
ループの開始 D:\15542.c(6,5)
<ベクトル化の剰余ループ>
リマーク #15301: 剰余ループ がベクトル化されました。
ループの終了
ループの開始 D:\15542.c(6,5)
<ベクトル化の剰余ループ>
ループの終了
ループの終了
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。