この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15535: xxxx was not vectorized: loop contains switch statement. Consider using if-else statement」(https://software.intel.com/en-us/articles/cdiag15535) の日本語参考訳です。
このベクトル診断メッセージは、インテル® 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) ]
ループの終了
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。