Dothan-1.1GHzとPC2100にてメモリアクセスの考察。
数字は、基本的に以前上げたメモリベンチの32MBでの数値を四捨五入したもの。
ただ、これって繰り返し実行すると147clkが156clkになったりするんだよねぇ。
clflushを使って予め測定対象をキャッシュから追い出しても同じ傾向。
ただし、少し速くなる。ライトバックの手間が少し減るためだと思われる。


普通にシーケンシャルリードすると、64byte(キャッシュラインサイズ)につき47clk。
L2へのHWプリフェッチが効いているはず。
BIOSでL2を切ると75clkに遅くなるが、これがHWプリフェッチだけのためかは不明。
64byte毎に1回のロードをすると、1回あたり40clk。L2オフでは60clk。
64byteを転送しているはずだが、リタイヤできないロード命令が少ないために並列性が上がる。
prefetcht0またはprefetchntaを使うと、L2がオンでもオフでも39clk。
プリフェッチ命令はデータ転送が完了しなくてもリタイヤできるので、更に速くなる。
また、ソフトプリフェッチが順調に効けばHWプリフェッチの追加効果は無い様子。

次にストア。
普通のシーケンシャルライトは64byteで141clk。
これは(なぜかロードの場合と違って)64byte毎に1回のアクセスでも変わらない。
L2をオフにすると若干遅くなるようにも見える(1〜2clk程度)。
動作としては、64byteがメモリ−キャッシュ間を往復している。

movntqの動作は、L1ヒットならL1に書き込んでライトバックはしない。
L1にヒットしないときは、直接メモリに書き込む。
どちらにしろ、L2にキャッシュされたアドレスだったらL2の該当ラインの無効化が必要。
movntqを使うと40clk。ノーマルロードの47clkより速いのは、内部に工夫が?
更に、64byte毎に1回のmovntqなら33clkまで高速化する。
これは、他のアクセス方法と違って64byteでなく8byteの転送で済むからだろう。

えーと、今回は基礎知識だけで終わり。
ロードした直後にmovntqでストアするのを思いついて測定しようと思うが、どうでしょ。