この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15335: xxxx was not vectorized: vectorization possible but seems inefficient. Use vector always directive or -vec-threshold0 to override」(https://software.intel.com/en-us/articles/cdiag15335) の日本語参考訳です。
このベクトル診断メッセージは、インテル® C++ コンパイラー 15.0 以降で生成されます。
原因:
デフォルトでは、コンパイラーのヒューリスティックは、それぞれのループのベクトル化の可能性を判断し、しきい値が 100% の場合にのみベクトル化します。ベクトル化のしきい値が 100% 未満の場合、ベクトル化は非効率であると判断されます。この診断メッセージは、上記の条件に一致すると出力されます。
例:
void foo(int *b, int N){ int i; for (i=0; i<5; i++) { b[2*i] = b[2*i] + 1; } }
$ icl 15335.c /c /Qopt-report:2 /Qopt-report-phase:vec
以下の診断メッセージは、インテル® C++ コンパイラー for Windows* 19.1.0.166 (ビルド 20191121) で生成しました。
最適化レポート開始: foo(int *, int)
レポート: ベクトルの最適化 [vec]
ループの開始 D:\15335.c(3,3)
リマーク #15335: ループ はベクトル化されませんでした: ベクトル化は可能ですが非効率です。オーバーライドするには vector always ディレクティブまたは /Qvec-threshold0 を使用してください。
ループの終了
解決方法:
#pragma vector allways
を使用するか、/Qvec-threshold0
コンパイラー・オプションを指定してヒューリスティックを変更します。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。