診断 15335: xxxx はベクトル化されませんでした: ベクトル化は可能ですが非効率です。オーバーライドするには vector always ディレクティブまたは /Qvec-threshold0 を使用してください。

同カテゴリーの次の記事

診断 15344: ループはベクトル化されませんでした: ベクトル依存関係がベクトル化を妨げています。

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15335: xxxx was not vectorized: vectorization possible but seems inefficient. Use vector always directive or -vec-threshold0 to override」の日本語参考訳です。


このベクトル診断メッセージは、インテル® 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 コンパイラー・オプションを指定してヒューリスティックを変更します。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事