この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15524: xxxx was not vectorized: search loop cannot be vectorized unless all memory references can be aligned vector load」(https://software.intel.com/en-us/articles/cdiag15524) の日本語参考訳です。
このベクトル診断メッセージは、インテル® C++ コンパイラー 15.0 以降で生成されます。
原因:
検索ループのベクトル化は次のヒューリスティックに依存します: “ベクトルロード” がキャッシュラインに完全に収まり、その中に非投機的にアクセスされる要素がある場合、コンパイラーはベクトル内のほかのすべての要素 (同一キャッシュライン内) を投機的にロードしても安全です。
例:
int foo(float *a, int n){ int i; for (i=0;i<n;i++){ if (a[2*i] == 0){ break; } } return i; }
$ icl 15524.c /c /O2 /Qopt-report:2 /Qopt-report-phase:vec
以下の診断メッセージは、インテル® C++ コンパイラー for Windows* 19.1.0.166 (ビルド 20191121) で生成しました。
最適化レポート開始: foo(float *, int)
レポート: ベクトルの最適化 [vec]
ループの開始 D:\15524.c(3,3)
リマーク #15524: ループ はベクトル化されませんでした: すべてのメモリー参照をアライメントされたベクトルロードにできなければ検索ループはベクトル化できません。
ループの終了
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。