第11章 手が届く範囲にモノがあると便利だよね(キャッシュメモリ) にCPUのキャッシュを外すサンプルコードが載っていました。 試しにWSL上で動かしてみます。
access_memory_in_order : 0.244438 sec
access_memory : 1.923961 sec
おお、Core i7でも同じように差が出ます。
コンパイルはこんな感じです。
clang -O0 -o access_memory access_memory.c
今気がつきましたが、本に載っているのはmemory_access
です。誤植でしょうか?
アーリーアクセスできてたので、そのとき気がついて、伝えられてれば・・・と残念です。
最適化オプション
-O0
が気になります。
変えるとどうなるのでしょうか?
> clang -O1 -o access_memory access_memory.c > ./access_memory access_memory : 2.474425 sec
あれ?遅くなりました。 そういうこともあるんですね。
GCC
次はGCCを使ってみます。
> gcc -O0 -o access_memory access_memory.c > ./access_memory access_memory : 1.863295 sec
> gcc -O1 -o access_memory access_memory.c > ./access_memory access_memory : 2.360995 sec
大体同じ結果になりました。
バッファサイズ
次にバッファサイズを変えてみます。
0x200
access_memory : 0.001568 sec
マッハです。これはキャシュヒットしてそうです。
0x1000
access_memory : 0.411469 sec
キャッシュが外れてそうです。
0x800
access_memory : 0.094881 sec
ヒット
0xC00
access_memory : 0.216819 sec
ミス
0xA00
access_memory : 0.125575 sec
ミス
0x900
access_memory : 0.106271 sec
ミス。この辺に境界がありそうです。 あれ?よく見たら0x800と大して差がありません。 0x800はキャッシュミスしてそうです。 もっと小さくても良さそうですね。
すっかり忘れてたけで、下のリンクから購入されると僕に紹介料が入る仕組みがあるみたいです。