診断 15331: xxxx はベクトル化されませんでした: コンパイラー・オプションまたはディレクティブによる暗黙の precise FP モデルがベクトル化を妨げています。fast FP モデルの使用を検討してください。

同カテゴリーの次の記事

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

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15331: xxxx was not vectorized: precise FP model implied by the command line or a directive prevents vectorization. Consider using fast FP model」の日本語参考訳です。


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

原因:

浮動小数点演算での再連結は、結果の値を変更する可能性があります。precise 浮動小数点モデルでは、このような再連結は許可されません。ベクトル (または並列) リダクションでは本質的に再連結が行われます。この例では、for ループはリダクション操作を行います。ベクトル化により操作の順番が変更されるため、-fp:precise オプションを使用するとコンパイラーはこのループをベクトル化しません。

例:

double foo(double *a, int N){
  double x = 0;
  int i;
  for (i=0;i<N;i++){
    x += a[i];
  }
  return x;
}

$ icl 15331.c /c /Qopt-report:3 -fp:precise /Qopt-report-phase:vec

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

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

    レポート: ベクトルの最適化 [vec]

ループの開始 D:\15331.c(4,3)
   リマーク #15331: ループ はベクトル化されませんでした: コンパイラー・オプションまたはディレクティブによる暗黙の precise FP モデルがベクトル化を妨げています。fast FP モデルの使用を検討してください。[ D:\15331.c(5,5) ]
ループの終了

ループの開始 D:\15331.c(4,3)
<剰余> ループの終了

解決方法:

このループは、/fp:presice コンパイラー・オプションの代わりに /fp:fast を使用するとベクトル化できます。

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

関連記事