x86命令の所要クロック計測スレPart2

このエントリーをはてなブックマークに追加
441 ◆.MeromIYCE
>>35
cn3.exeの中身を見ると、mov eax,[eax]を16回続けてloop命令を置くループがある。
これならオーバーヘッドなどないと思ったが、Athlon64の最適化ガイドによると
loop命令はVectorPath(デコードが大変)でレイテンシ9(Bartonでは違うかもしれない)。
だが、そんなの並列実行すればいいだけだし、命令あたり1clk(ループ全体で16clk)も遅れる
というのは考えにくい。一応、loop命令は遅いから使うなと書いてあるけど。

PentiumMでは、loop命令の空ループは6clkで、並列実行で完全に隠蔽できる。
誰かjnzで追試お願い。


32byte strideで遅くなる現象はPentiumMでも起こる。16byteだと起こらない。
32KB strideで遅くなる現象は128KB以上のときPentiumMでも起こる。

32byteのは、今は全くわからないが、考えてわかる問題のような気がする。
32KBの方はPen4の64KBと似た現象と思えなくもない。


PentiumMは、L1は32KB、4KB*8Way。L2は2MB、256KB*8Way。
依存チェーンを作ってメモリレイテンシを測定した。

64KBおき8回(stride=64KB,size=512KB)だと、レイテンシは3.0clk。
32MBおき4回(stride=32MB,size=128MB)でも3.0clk。
完全にL1に乗るので当然の結果。

128KBおき8回(stride=128KB,size=1MB)だと、レイテンシは8.0clk。
L1に乗っていて、普通にいけば3clkのはずが遅い。
RDPMCを使うと、メモリアクセスの回数がなぜか通常の倍になっているが、
メインメモリにもL2にも読みに行っていない。
45デフォルトの名無しさん:2006/01/20(金) 15:01:52
>>44
> 128KBおき8回(stride=128KB,size=1MB)だと、レイテンシは8.0clk。
> L1に乗っていて、普通にいけば3clkのはずが遅い。
> RDPMCを使うと、メモリアクセスの回数がなぜか通常の倍になっているが、
> メインメモリにもL2にも読みに行っていない。

DTLBはヒットしてる?
46デフォルトの名無しさん:2006/01/20(金) 15:55:48
PenMってDTLBミスはカウントできなかったっけ?
DothanのDTLBは4KBページで32set*4way=128entriesのようなので
4KB*32=128KBおきにアクセスした場合、
4つまでしか格納できないかと思ったので。
471 ◆.MeromIYCE :2006/01/22(日) 20:59:22
>>45
PenMのDTLBは、4KB*128entryの4Wayか。
つまり512KBで4Wayのキャッシュみたいな感じ。
それで当たりっぽいですな。

64KBおき16回(stride=64KB,size=1MB)だと、レイテンシは15.0clk。
L1ミスL2ヒットで、10clkのはずだが、TLBミスで5clk食われて15clkということだろう。
メモリアクセスの回数が倍なのも、毎回L1上のページテーブルにアクセスするからだ。
TLBの存在が測定にかかったのは初めてだ。

で、Bartonの場合だが、DTLBのL1が4KB*32entryのFull、L2が4KB*256の4Way。
32KBおき8回のアクセスをすると、32回以下なのでL1DTLBに完全ヒットするはず。
むしろ、4KBおき64回のときにL1DTLBミスしてるはずだが、L2キャッシュの遅さに
隠れてしまっているのかな。
排他処理をしている場合、純粋な反応速度と帯域による時間に加えて、
排他処理の時間もレイテンシに加算されるので、そこに並列実行の余地があるのかも。