IntelのGracemontコアの浮動小数点数演算レイテンシの測定

第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 cycle
  • vaddsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1 → 6.00 cycle
  • vshufpd xmm0, xmm0, xmm1, 0 → 1.00 cycle
  • vshufpd xmm0, xmm0, xmm1, 0; vshufpd xmm0, xmm0, xmm1, 0 → 2.00 cycle
  • vaddsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0 → 7.00 cycle
  • vaddsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0; vaddsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0 → 14.00 cycle
  • vaddsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0; vshufpd xmm0, xmm0, xmm1, 0 → 11.00 cycle

以上の結果から、以下のことが分かります。

  • vaddsd命令のレイテンシは 3 cycle
  • vshufpd命令のレイテンシは 1 cycle
  • vaddsd命令とvshufpd命令を行き来すると、往復で 3 cycle のペナルティ
    • uops.info の測定はこのペナルティを考慮できていないため間違い

vmulsd および vfmadd132sd

  • vmulsd xmm0, xmm1, xmm1 → 4.00 cycle
  • vmulsd xmm0, xmm0, xmm1; vmulsd xmm0, xmm0, xmm1 → 8.00 cycle
  • vmulsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0 → 7.00 cycle
  • vfmadd132sd xmm0, xmm1, xmm2 → 6.00 cycle
  • vfmadd132sd xmm0, xmm1, xmm2; vshufpd xmm0, xmm0, xmm1, 0 → 10.00 cycle
  • vmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1 → 6.08 cycle
  • vmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1 → 9.08 cycle
  • vmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1; vmulsd xmm0, xmm0, xmm1 → 10.08 cycle
  • vmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1; vmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1 → 12.16 cycle
  • vmulsd xmm0, xmm0, xmm1; vmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1 → 13.08 cycle
  • vfmadd132sd xmm0, xmm1, xmm2; vmulsd xmm0, xmm0, xmm1; vaddsd xmm0, xmm0, xmm1 → 12.08 cycle
  • vfmadd132sd xmm0, xmm1, xmm2; vaddsd xmm0, xmm0, xmm1; vmulsd xmm0, xmm0, xmm1 → 13.00 cycle

以上の結果から、以下のことが分かります。

  • vmulsd命令のレイテンシは 4 cycle
  • vfmadd132sd命令のレイテンシは 6 cycle
  • vmulsd命令とvshufpd命令と行き来すると往復で 2 cycle のペナルティ
  • vfmadd132sd命令とvshufpd命令と行き来すると往復で 3 cycle のペナルティ
    • uops.info の測定はこのペナルティを考慮できていないため間違い
  • vmulsd命令からvaddsd命令にフォワーディングするとき、1 cycle 得することがある(92%ほど発生)

浮動小数点数演算命令とvshufpdの行き来はどこにペナルティがあるか

  • movq rax, xmm0; movq xmm0, rax → 10.00 cycle
  • vshufpd xmm0, xmm0, xmm1, 0; movq rax, xmm0; movq xmm0, rax→ 11.00 cycle
  • vaddsd 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 cycle
  • vshufpd xmm0, xmm0, xmm1, 0; vaddsd xmm0, xmm0, xmm1; movq rax, xmm0; movq xmm0, rax → 14.00 cycle

したがって、以下のことが分かります。

  • vaddsd命令からvshufpd命令にフォワーディングするとき、3 cycle のペナルティが発生する
  • vshufpd命令からvaddsd命令にフォワーディングするときは、ペナルティが発生しない

vmulsd命令、vfmadd132sd命令についても同じ実験を行うことで、どこでペナルティが発生するかを特定することができます。

  • vmulsd xmm0, xmm0, xmm1; vshufpd xmm0, xmm0, xmm1, 0; movq rax, xmm0; movq xmm0, rax → 17.00 cycle
  • vshufpd xmm0, xmm0, xmm1, 0; vmulsd xmm0, xmm0, xmm1; movq rax, xmm0; movq xmm0, rax → 15.00 cycle
  • vfmadd132sd xmm0, xmm1, xmm1; vshufpd xmm0, xmm0, xmm1, 0; movq rax, xmm0; movq xmm0, rax → 20.00 cycle
  • vshufpd 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 cycle
  • vaddsd命令のレイテンシは 3 cycle
  • vmulsd命令のレイテンシは 4 cycle
  • vfmadd132sd命令のレイテンシは 6 cycle

  • vmulsd命令からvaddsd命令にフォワーディングするとき、1 cycle 得することがある

  • vaddsd命令からvshufpd命令にフォワーディングするとき、3 cycle のペナルティが発生する

  • vmulsd命令からvshufpd命令にフォワーディングするとき、2 cycle のペナルティが発生する
  • vfmadd132sd命令からvshufpd命令にフォワーディングするとき、3 cycle のペナルティが発生する