この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15487: type converts: xxxx」(https://software.intel.com/en-us/articles/cdiag15487) の日本語参考訳です。
このベクトル診断メッセージは、インテル® C++ コンパイラー 15.0 以降で生成されます。
原因:
このベクトル化診断メッセージは、レポートレベル 3 以上で生成されます。この診断メッセージは、コンパイラーがループで生成したデータ型変換の数を出力します。以下は、このメッセージを生成するコードの例です。
例:
#include<stdio.h> #include<math.h> #define SIZE 100 int main(){ float a[SIZE], x; a[:] = __sec_implicit_index(0); x = __sec_reduce_all_zero(a[:] == 1 ? 0 : 1); printf("%fn",x); return 0; }
$ icl 15487.c /c /Qopt-report:3 /Qopt-report-phase:vec /S
以下の診断メッセージは、インテル® C++ コンパイラー for Windows* 19.1.0.166 (ビルド 20191121) で生成しました。
最適化レポート開始: main()
レポート: ベクトルの最適化 [vec]
ループの開始 D:\15487.c(6,12)
リマーク #15300: ループがベクトル化されました。
リマーク #15449: マスクなしアライン・ユニット・ストライド・ストア: 1
リマーク #15475: --- ベクトルのコストサマリー開始 ---
リマーク #15476: スカラーのコスト: 4
リマーク #15477: ベクトルのコスト: 1.000
リマーク #15478: スピードアップの期待値: 4.000
リマーク #15487: 型変換: 1
リマーク #15488: --- ベクトルのコストサマリー終了 ---
ループの終了
ループの開始 D:\15487.c(7,9)
リマーク #15300: ループがベクトル化されました。
リマーク #15448: マスクなしアライン・ユニット・ストライド・ロード: 1
リマーク #15475: --- ベクトルのコストサマリー開始 ---
リマーク #15476: スカラーのコスト: 165
リマーク #15477: ベクトルのコスト: 43.250
リマーク #15478: スピードアップの期待値: 3.810
リマーク #15488: --- ベクトルのコストサマリー終了 ---
ループの終了
次に示すように、コンパイラーはループで cvtdq2ps
変換命令を生成して (6 行目)、倍精度 FP を単精度 FP に変換します。
movd %eax, %xmm0 #6.5 xorl %eax, %eax #6.12 pshufd $0, %xmm0, %xmm1 #6.5 movdqa .L_2il0floatpacket.0(%rip), %xmm0 #6.5 # LOE rax rbx r12 r13 r14 r15 xmm0 xmm1 ..B1.2: # Preds ..B1.2 ..B1.12 cvtdq2ps %xmm0, %xmm2 #6.12 movaps %xmm2, (%rsp,%rax,4) #6.5 addq $4, %rax #6.12 paddd %xmm1, %xmm0 #6.5 cmpq $100, %rax #6.12 jb ..B1.2 # Prob 99% #6.12
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。