第12世代インテル® Core™ プロセッサーのEコア(高効率コア)はGracemontというマイクロアーキテクチャでできています。 このコアで命令を実行したときのレイテンシを調べたものにuops.info - Tableがありますが、測定方法がよくなくて正しい値になっていません。 そこでnanoBenchを用いて独自に測定してみました。
測定方法
sudo taskset -c 23 ./nanoBench.sh -asm "測定コード" -config configs/cfg_AlderLakeE_common.txt
測定結果
vaddsd
および vshufpd
vaddsd xmm0, xmm0, xmm1
→ 3.00 cyclevaddsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1
→ 6.00 cyclevshufpd xmm0, xmm0, xmm1, 0
→ 1.00 cyclevshufpd xmm0, xmm0, xmm1, 0; vshufpd xmm0, xmm0, xmm1, 0
→ 2.00 cyclevaddsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0
→ 7.00 cyclevaddsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0; vaddsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0
→ 14.00 cyclevaddsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0; vshufpd xmm0, xmm0, xmm1, 0
→ 11.00 cycle
以上の結果から、以下のことが分かります。
vaddsd
命令のレイテンシは 3 cyclevshufpd
命令のレイテンシは 1 cyclevaddsd
命令とvshufpd
命令を行き来すると、往復で 3 cycle のペナルティ- uops.info の測定はこのペナルティを考慮できていないため間違い
vmulsd
および vfmadd132sd
vmulsd xmm0, xmm1, xmm1
→ 4.00 cyclevmulsd xmm0, xmm0, xmm1; vmulsd xmm0, xmm0, xmm1
→ 8.00 cyclevmulsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0
→ 7.00 cyclevfmadd132sd xmm0, xmm1, xmm2
→ 6.00 cyclevfmadd132sd xmm0, xmm1, xmm2; vshufpd xmm0, xmm0, xmm1, 0
→ 10.00 cyclevmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1
→ 6.08 cyclevmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1
→ 9.08 cyclevmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1; vmulsd xmm0, xmm0, xmm1
→ 10.08 cyclevmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1; vmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1
→ 12.16 cyclevmulsd xmm0, xmm0, xmm1; vmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1
→ 13.08 cyclevfmadd132sd xmm0, xmm1, xmm2; vmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1
→ 12.08 cyclevfmadd132sd xmm0, xmm1, xmm2; vaddsd xmm0, xmm0, xmm1; vmulsd xmm0, xmm0, xmm1
→ 13.00 cycle
以上の結果から、以下のことが分かります。
vmulsd
命令のレイテンシは 4 cyclevfmadd132sd
命令のレイテンシは 6 cyclevmulsd
命令とvshufpd
命令と行き来すると往復で 2 cycle のペナルティvfmadd132sd
命令とvshufpd
命令と行き来すると往復で 3 cycle のペナルティ- uops.info の測定はこのペナルティを考慮できていないため間違い
vmulsd
命令からvaddsd
命令にフォワーディングするとき、1 cycle 得することがある(92%ほど発生)
浮動小数点数演算命令とvshufpd
の行き来はどこにペナルティがあるか
movq rax, xmm0; movq xmm0, rax
→ 10.00 cyclevshufpd xmm0, xmm0, xmm1, 0; movq rax, xmm0; movq xmm0, rax
→ 11.00 cyclevaddsd xmm0, xmm0, xmm1; movq rax, xmm0; movq xmm0, rax
→ 13.00 cycle
以上の結果から、以下のことが分かります。
movq rax, xmm0; movq xmm0, rax
命令列で移動させると合計で 10 cycle かかる- この命令列を使った場合、
vshufpd
命令やvaddsd
命令と組み合わせてもペナルティは発生しない
これを使って以下のような実験を行うと、どこでペナルティが発生するかを特定することができます。
vaddsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0; movq rax, xmm0; movq xmm0, rax
→ 17.00 cyclevshufpd xmm0, xmm0, xmm1, 0; vaddsd xmm0, xmm0, xmm1; movq rax, xmm0; movq xmm0, rax
→ 14.00 cycle
したがって、以下のことが分かります。
vmulsd
命令、vfmadd132sd
命令についても同じ実験を行うことで、どこでペナルティが発生するかを特定することができます。
vmulsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0; movq rax, xmm0; movq xmm0, rax
→ 17.00 cyclevshufpd xmm0, xmm0, xmm1, 0; vmulsd xmm0, xmm0, xmm1; movq rax, xmm0; movq xmm0, rax
→ 15.00 cyclevfmadd132sd xmm0, xmm1, xmm1; vshufpd xmm0, xmm0, xmm1, 0; movq rax, xmm0; movq xmm0, rax
→ 20.00 cyclevshufpd xmm0, xmm0, xmm1, 0; vfmadd132sd xmm0, xmm1, xmm1; movq rax, xmm0; movq xmm0, rax
→ 17.00 cycle
したがって、以下のことが分かります。
vmulsd
命令からvshufpd
命令にフォワーディングするとき、2 cycle のペナルティが発生するvfmadd132sd
命令からvshufpd
命令にフォワーディングするとき、3 cycle のペナルティが発生する
まとめ
vshufpd
命令のレイテンシは 1 cyclevaddsd
命令のレイテンシは 3 cyclevmulsd
命令のレイテンシは 4 cyclevfmadd132sd
命令のレイテンシは 6 cyclevmulsd
命令からvaddsd
命令にフォワーディングするとき、1 cycle 得することがあるvaddsd
命令からvshufpd
命令にフォワーディングするとき、3 cycle のペナルティが発生するvmulsd
命令からvshufpd
命令にフォワーディングするとき、2 cycle のペナルティが発生するvfmadd132sd
命令からvshufpd
命令にフォワーディングするとき、3 cycle のペナルティが発生する