診断 15378: ループはベクトル化されませんでした: /Qfreestanding オプションが整数除算/剰余のベクトル化を妨げています。

インテル® DPC++/C++ コンパイラー

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15378: xxxx was not vectorized: -ffreestanding flag prevents vectorization of integer divide/remainder」(https://software.intel.com/en-us/articles/cdiag15378) の日本語参考訳です。


このベクトル診断メッセージは、インテル® C++ コンパイラー 15.0 以降で生成されます。

原因:

この診断メッセージは、/Qfreestanding (Windows*) または -ffreestanding (Linux*) オプションが使用されている場合に出力されます。通常、ベクタライザーは SVML 整数除算ライブラリーを呼び出してこのループをベクトル化します。/Qfreestanding オプションが指定されると、SVML ライブラリーは使用されずこの診断メッセージが出力されます。

例:

void foo(int *a, int *b, int n){
  int i;
  for (i=0;i<n;i++){
    a[i] /= b[i];
  }
}

icl $ 15378.c /c /Qopt-report:2 /Qopt-report-phase:vec /Qfreestanding

以下の診断メッセージは、インテル® C++ コンパイラー for Windows* 19.1.0.166 (ビルド 20191121) で生成しました。

最適化レポート開始: foo(int *, int *, int)

    レポート: ベクトルの最適化 [vec]
ループの開始 D:\15378.c(3,4)
<マルチバージョン v1>
   リマーク #15378: ループ はベクトル化されませんでした: /Qfreestanding オプションが整数除算/剰余のベクトル化を妨げています。[ D:\15378.c(4,6) ] ループの終了

ループの開始 D:\15378.c(3,4)
<マルチバージョン v2>
   リマーク #15304: ループ はベクトル化されませんでした: マルチバージョンのベクトル化できないループ・インスタンスです。
ループの終了

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

タイトルとURLをコピーしました