この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15527: loop was not vectorized: function call to xxxx cannot be vectorized」(https://software.intel.com/en-us/articles/cdiag15527) の日本語参考訳です。
このベクトル診断メッセージは、インテル® C++ コンパイラー 15.0 以降で生成されます。
原因:
この診断メッセージは、関数/ループ本体がベクトル化できないほかの関数を呼び出すため、__declspec(vector) でアノテーションされたユーザー定義関数をベクトル化できない場合に出力されます。次の例では、ユーザーは foo() のベクトルバージョンを生成しようとしますが、関数 foo() はベクトル化できない omp_init_lock() を呼び出しています。
例:
#include <omp.h> omp_lock_t x; void bar(){ omp_init_lock(&x); } __declspec(vector) void foo(int *x, int y){ bar(); }
$ icl 15527.c /c /O2 /Qopt-report:2 /Qopt-report-phase:vec /Qopt-report-file:stderr
以下の診断メッセージは、インテル® C++ コンパイラー for Windows* 19.1.0.166 (ビルド 20191121) で生成しました。
最適化レポート開始: foo.._simdsimd4__xmm2nvv(int *, int)
レポート: ベクトルの最適化 [vec]
リマーク #15527: 関数 はベクトル化されませんでした: omp_init_lock(omp_lock_t *) への関数呼び出しはベクトル化できません。
リマーク #13397: vector 関数がベクトル化されませんでした。[ D:\15527.c(7,24) ]
D:\15527.c(7): (col. 24) 警告 #13401: ベクトル関数がエミュレートされました。
===========================================================================
D:\15527.c(7): (col. 24) 警告 #13397: vector 関数がベクトル化されませんでした。
最適化レポート開始: foo.._simdsimd4__xmm2mvv(int *, int)
レポート: ベクトルの最適化 [vec]
リマーク #15527: 関数 はベクトル化されませんでした: omp_init_lock(omp_lock_t *) への関数呼び出しはベクトル化できません。
リマーク #13397: vector 関数がベクトル化されませんでした。[ D:\15527.c(7,24) ]
D:\15527.c(7): (col. 24) 警告 #13401: ベクトル関数がエミュレートされました。
===========================================================================
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。