診断 15541: 外部ループは自動ベクトル化されませんでした: SIMD ディレクティブの使用を検討してください。

同カテゴリーの次の記事

診断 15537: ループはベクトル化されませんでした: 暗黙の FP 例外モデルが、切り捨てまたは整数除算/剰余に必要な SVML ライブラリーの使用を妨げています。コンパイラー・オプションやソースのディレクティブを変更して、fast FP モデルを有効にし、FP 例外をマスクすることを検討してください。

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15541: outer loop was not auto-vectorized: consider using SIMD directive」の日本語参考訳です。


このベクトル診断メッセージは、インテル® 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>
      ループの終了
   ループの終了
ループの終了

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

関連記事