この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15541: outer loop was not auto-vectorized: consider using SIMD directive」(https://software.intel.com/en-us/articles/cdiag15541) の日本語参考訳です。
このベクトル診断メッセージは、インテル® C++ コンパイラー 15.0 以降で生成されます。
原因:
この診断メッセージは、自動ベクトル化が外部ループをベクトル化できない場合に出力されます。これは、ベクタライザーのヒューリスティックとコストモデルに基づいて判断されます。ベクタライザーのコストモデルを無視する 1 つの方法は、#pragma ivdep や #pragma omp simd などの明示的なベクトル化ディレクティブを使用することです。
例:
void foo(float **a, float **b, int N){ int i, j; #pragma ivdep for (i=0;i<N;i++){ float *ap = a[i]; float *bp = b[i]; for (j=0;j<N;j++){ ap[j] = bp[j]; } } }
$ icl 15541.c /c /Qopt-report:3 /Qopt-report-phase:vec
以下の診断メッセージは、インテル® C++ コンパイラー for Windows* 19.1.0.166 (ビルド 20191121) で生成しました。
最適化レポート開始: foo(float **, float **, int)
レポート: ベクトルの最適化 [vec]
ループの開始 D:\15541.c(4,3)
リマーク #15541: 外部 ループ は自動ベクトル化されませんでした: SIMD ディレクティブの使用を検討してください。
ループの開始 D:\15541.c(7,5)
リマーク #15541: 外部 ループ は自動ベクトル化されませんでした: SIMD ディレクティブの使用を検討してください。
ループの開始 D:\15541.c(7,5)
<マルチバージョン v2>
リマーク #15304: ループ はベクトル化されませんでした: マルチバージョンのベクトル化できないループ・インスタンスです。
ループの終了
ループの開始 D:\15541.c(7,5)
<剰余, マルチバージョン v2>
ループの終了
ループの終了
ループの終了
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。