第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 のペナルティが発生する