@ledsun blog

無味の味は佳境に入らざればすなわち知れず

もっとCPUの気持ちが知りたいですか? 第11章 手が届く範囲にモノがあると便利だよね(キャッシュメモリ)

peaks.cc

第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はキャッシュミスしてそうです。 もっと小さくても良さそうですね。

すっかり忘れてたけで、下のリンクから購入されると僕に紹介料が入る仕組みがあるみたいです。