今度はロードストア命令を測定してみました。
条件は以下の通りです。
- 命令もデータもすべて 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 以降を推奨環境にしたくなりますねぇ…
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選べるのですが
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
こんな感じでした
CPUはA10-5800K 3.8Gターボなしです
何度もすみません
ありがとうございます。
アラインされていない状態でのロードのスループットが低下しているのは残念ですが、アラインされている状態でのストアのスループットが movdqu と movdqa とで同じになったなのは考えることが少なくなっていいですね。
vctestの方は元動画はRGB24でしょうか?
えーとAviutlの無圧縮です。どんなフォーマットなのかわかりません。すみません。
AviUtl の「無圧縮」で出力したのなら RGB24 ですね。どうもどうも。