診断 15535: xxxx はベクトル化されませんでした: ループに switch 文が含まれています。if-else 文の使用を検討してください。

同カテゴリーの次の記事

診断 15542: ループはベクトル化できませんでした: 内部ループはベクトル化されています。

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15535: xxxx was not vectorized: loop contains switch statement. Consider using if-else statement」の日本語参考訳です。


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

原因:

コストモデルによりコンパイラーの自動変換には制限があります。ベクトル化できない場合、if-else 文を使用するか SIMD ディレクティブなどの明示的なベクトル・プログラミングを導入することを検討してください。

例:

void foo(float *A, int *B, int N){
  int i;
  for (i=0;i<N;i++){
    switch(B[i]){
    case 1: A[i]++;
    case 2: A[i]+=2;
    case 3: A[i]+=3;
    case 4: A[i]+=4;
    case 5: A[i]+=5;
    }
  }
}

$ icl 15535.c /c /O2 /Qopt-report:2 /Qopt-report-phase:vec

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

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

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

最適化できないループ:
ループの開始 D:\15535.c(3,3)
   リマーク #15535: ループ はベクトル化されませんでした: ループに switch 文が含まれています。if-else 文の使用を検討してください。[ D:\15535.c(4,5) ]
ループの終了

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

関連記事