今度はロードストア命令を測定してみました。

条件は以下の通りです。

  • 命令もデータもすべて L1 キャッシュに乗っている。
  • シーケンシャルアクセスする。

ベンチマークプログラムはこちら(Windows + Visual C++ + NASM)。バイナリ入りです。

まずスループットの逆数は以下の通りです。キャッシュが絡むため、前回のような演算ユニットだけで完結するような命令の場合と比べると計測精度はだいぶ下がります。

方向 命令 アライメント Prescott Conroe Penryn Nehalem Sandy AMD K10/Deneb
load movdqa 0/16 1.0 1.0 1.0 1.0 0.5 0.5
movdqu 0/16 2.4 2.0 2.0 1.0 0.5 0.5
8/16 2.4 2.0 2.0 1.4 1.3 1.0
6.6 4.9 4.6 1.4 1.3 1.0
lddqu 0/16 2.4 2.0 2.0 1.0 0.5 0.5
8/16 2.4 2.0 2.0 1.4 1.3 1.0
2.4 4.9 4.6 1.4 1.3 1.0
store movdqa 0/16 4.5 1.0 1.0 1.0 1.0 1.0
movdqu 0/16 8.0 6.2 4.1 1.0 1.0 2.0
8/16 8.0 4.1 4.1 1.5 1.6 2.0
30.6 10.1 9.7 1.5 1.6 2.0

次にレイテンシです。SSE ロード命令は xmm レジスタをアドレスとして使うことはできないので、ロードだけのレイテンシを直接計測する方法は原理的に存在しません。代わりに「ロードしたデータを movd で汎用レジスタにコピーする」を繰り返した場合のレイテンシを測ります。また、対照群として movd でデータを xmm レジスタと汎用レジスタとの間で行ったり来たりする場合のレイテンシも測っています。movd のレイテンシもマイクロアーキテクチャによって異なるため、以下の表の数字をマイクロアーキテクチャ間で比較することはできません(目安ぐらいにはなりますが)。なお、ストアの場合、レイテンシを計測する方法は無いので測りません。

命令 アライメント Prescott Conroe Penryn Nehalem Sandy AMD K10/Deneb
movd-movd 13.0 4.0 4.0 4.0 2.0 11.5
movd-movdqa 0/16 17.8 4.3 4.3 6.9 6.9 10.0
movd-movdqu 0/16 22.9 7.9 7.1 6.9 6.9 10.0
8/16 22.9 7.9 7.1 7.9 8.2 13.0
32.1 11.5 10.7 7.9 8.2 13.0
movd-lddqu 0/16 24.9 7.9 7.1 6.9 6.9 10.0
8/16 24.9 7.9 7.1 7.9 8.2 13.0
24.9 11.5 10.7 7.9 8.2 13.0

Prescott: PentiumD 805 (Smithfield)
Conroe: Core 2 Quad Q6600 (Kentsfield)
Penryn: Core 2 Duo E8200 (Wolfdale)
Nehalem: Core i3-380M (Arrandale なので厳密には Westmere)
Sandy: Core i7-2600K
K10/Deneb: Phenom II 910e

えーといろいろと衝撃的な結果です。

  • Prescott は遅いだろうとは思っていたが、これほどとは思わなかった。アライメントされていない movdqu とはいえ 30クロックって何よ。
  • Prescott 以外では lddqu と movdqu の性能は全く同じであり、lddqu は movdqu へのエイリアスだと考えられる。lddqu の存在意義って…
  • Prescott では lddqu は特有の挙動を持ち、いかなるアライメントに対しても一定のスループットとレイテンシとなるが、Prescott 以外では movdqu へのエイリアスであり、アライメントによって性能が変化する。
  • 16で割って8余るアドレスへのアクセスの場合、Penryn まででは16で割り切れるアドレスと同じ性能となるが、Nehalem 以降では端数のあるアドレスと同じ性能となる。
  • Nehalem 以降では端数のあるアドレスへのアクセス(ロードもストアも)が劇的に高速化されていて、16で割り切れるアドレスへのアクセスと遜色がない。上の8余るアドレスへのアクセスの挙動の変化はこの高速化を踏まえた妥協かもしれない。
  • Nehalem 以降では16で割り切れるアドレスに対して movdqa の代わりに movdqu を使ってもペナルティは一切ない。movdqa の存在意義って…
  • Sandy Bridge ではロードユニットが2つあるので、ロードのスループットの逆数は 0.5 となる。(2つあることは公表されている)
  • K10/Deneb においては、レイテンシは大きめであるものの、スループットは Sandy Bridge と遜色がないどころかロードについては上回っている。

K10 は正直ナメてました(最初計測ミスかと思った)。K10 でこんな感じなので、俄然 Bulldozer/Piledriver に興味が出てきました。お金ないので誰か代わりに測ってください。

しかし、こんな結果を見ると Nehalem 以降を推奨環境にしたくなりますねぇ…

Trackback

6 comments untill now

  1. ut項目しか見てなかった・・・ @ 2013-05-30 14:47

    algorithm cycles
    —————————————-
    movdqa_ld_tp 00230000 0.502
    movdqu_ld_tp 00230000 0.502
    movdqu_ld_tp 00230001 1.417
    movdqu_ld_tp 00230002 1.414
    movdqu_ld_tp 00230004 1.445
    movdqu_ld_tp 00230008 1.386
    lddqu_ld_tp 00230000 0.501
    lddqu_ld_tp 00230001 1.414
    lddqu_ld_tp 00230002 1.428
    lddqu_ld_tp 00230004 1.442
    lddqu_ld_tp 00230008 1.417
    movdqa_st_tp 00230000 2.681
    movdqu_st_tp 00230000 2.800
    movdqu_st_tp 00230001 5.004
    movdqu_st_tp 00230002 5.004
    movdqu_st_tp 00230004 5.004
    movdqu_st_tp 00230008 5.004
    —————————————-
    movd_movd_lt 00000000 18.200
    movd_movdqa_ld_lt 00230000 13.358
    movd_movdqu_ld_lt 00230000 13.358
    movd_lddqu_ld_lt 00230000 13.375
    movd_movdqu_ld_lt 00230001 14.449
    movd_lddqu_ld_lt 00230001 14.450
    movd_movdqu_ld_lt 00230002 14.449
    movd_lddqu_ld_lt 00230002 14.449
    movd_movdqu_ld_lt 00230004 14.449
    movd_lddqu_ld_lt 00230004 14.471
    movd_movdqu_ld_lt 00230008 14.449
    movd_lddqu_ld_lt 00230008 14.449
    —————————————-
    movd_movdqa_ld_lt 00230000 13.486
    movd_movdqu_ld_lt 00230000 13.358
    movd_lddqu_ld_lt 00230000 13.358
    一応報告しときます
    vctestも試してみたんですがこちらの環境じゃ(8)
    選択肢が無圧縮以外でてきませんでしたx86x64とも。
    他のアプリではut選べるのですが

  2. ut項目しか見てなかった・・・ @ 2013-05-30 15:07

    y4mとかutとか違うフォーマット選んでました。
    420デコード優先 元動画1280×720 30fps
    Size: 1194587192/4979404800 (23.991%, 4.1683)
    Encode time: 7496.496552ms/1801f = 4.162408ms/f = 240.245558 fps
    Decode time: 9459.200890ms/1801f = 5.252194ms/f = 190.396633 fps
    Random access time: 5.252194ms/f
    422デコード優先
    Size: 1486042108/4979404800 (29.844%, 3.3508)
    Encode time: 5179.988658ms/1801f = 2.876174ms/f = 347.684159 fps
    Decode time: 5303.568051ms/1801f = 2.944791ms/f = 339.582708 fps
    Random access time: 2.944791ms/f
    こんな感じでした

  3. ut項目しか見てなかった・・・ @ 2013-05-30 15:11

    CPUはA10-5800K 3.8Gターボなしです
    何度もすみません

  4. 梅澤 威志 @ 2013-05-30 21:36

    ありがとうございます。
    アラインされていない状態でのロードのスループットが低下しているのは残念ですが、アラインされている状態でのストアのスループットが movdqu と movdqa とで同じになったなのは考えることが少なくなっていいですね。
    vctestの方は元動画はRGB24でしょうか?

  5. ut項目しか見てなかった・・・ @ 2013-06-02 10:02

    えーとAviutlの無圧縮です。どんなフォーマットなのかわかりません。すみません。

  6. 梅澤 威志 @ 2013-06-02 13:22

    AviUtl の「無圧縮」で出力したのなら RGB24 ですね。どうもどうも。

Add your comment now