x86命令の所要クロック計測スレPart2
■ このスレッドは過去ログ倉庫に格納されています
00441 ◆.MeromIYCE
2006/01/20(金) 14:10:26cn3.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にも読みに行っていない。
■ このスレッドは過去ログ倉庫に格納されています