ecx=1にすると、またわからない結果が。
L1ヒットで2clkはOK。
L2ヒットでは6clkだが、1MB以上だと急に18clkになる。
メインメモリだと、159clkから1000clkオーバーまでバラバラ。だんだん増えていく傾向はある。

ちなみにシーケンシャルリードならメモリも5.6clk/8byteLoad。
プリフェッチなしのL2が2clk/8byteLoadだからけっこうな帯域。まあ、コアが1.1GHzだけど。
(HWプリフェッチは有り)

64byteおきにロードするとL2が6.1clk/Load。これは以前やった。
メモリは40clk/Loadだった。64byteのキャッシュラインを40clkで満たすなら妥当なところ。

prefetcht0 [esi+512] を使うとL2が1.5clk/Load、メモリが5.0clk/Loadまでいった。
この5.0clkに8を掛けると40になる。多分40clkで64byte転送でOK。
メモリに対してはなぜかmov eax,[esi+512] プリフェッチが全く効かなかった。


ストアは18clk/8byte。
prefetcht0を入れても、L2の効く範囲しか速くならないが、prefetchntaにすると12clk/8byte。
プリフェッチをやめてmovntq(キャッシュを通さずメモリに書き込む)を使うと、
5clk/8byteになり、ロードとほぼ同じ帯域で書ける。

普通にmovqでストアすると、
まずメモリからL1に読み込み、そこに書き込んで、L2に追い出され、メモリに書き戻す、
という手順を踏む。
ライトスルー方式のキャッシュだとどうだろ。常にmovntqなのか、読み込むのか。
ライトアロケートが付いてるかどうかか?
prefetchntaはL2を使わないので効果があったのだろう。
movntqだと余計な読み込みがないので速い。
ただし、書き込んだものを読もうとしてもキャッシュに乗ってないのであしからず。