調べたこと、作ったことをメモしています。
こちらに移行中: https://blog.shimazu.me/

cpuid on Core2 Duo P9400

#define CPUID( id, a, b, c, d )\
    asm volatile (\
        "mov %4, %%eax\n\t"                           \
        "cpuid\n\t"                                 \
        "mov %%eax, %0\n\t"                           \
        "mov %%ebx, %1\n\t"                           \
        "mov %%ecx, %2\n\t"                           \
        "mov %%edx, %3\n\t"                           \
        : "=m" (a), "=m" (b), "=m" (c), "=m" (d)    \
        : "m" (id)                                  \
        : "eax", "ebx", "ecx", "edx" )

上記のようなコードを利用して、id=2のcacheについて調べてみた。
結果は以下。

15 :: data L1 cache, 32 KB, 8 ways, 64 byte lines
14 :: data TLB, 4K pages, 4 ways, 256 entries
13 :: code L1 cache, 32 KB, 8 ways, 64 byte lines
12 :: code and data L2 cache, 6144 KB, 24 ways, 64 byte lines
11 :: null descriptor (=unused descriptor)
10 :: null descriptor (=unused descriptor)
 9 :: null descriptor (=unused descriptor)
 8 :: null descriptor (=unused descriptor)
 7 :: null descriptor (=unused descriptor)
 6 :: L0 data TLB, 4M pages, 4 ways, 16 entries
 5 :: L0 data TLB, 4K pages, 4 ways, 16 entries
 4 :: 64 byte prefetching
 3 :: data TLB, 4M pages, 4 ways, 32 entries
 2 :: code TLB, 4K pages, 4 ways, 128 entries
 1 :: code TLB, 4M pages, 4 ways, 4 entries and code TLB, 2M pages, 4 ways, 8 entries

ということで、L1 cacheは32KBで、それは8way associativeで1lineあたり64byteらしい。
で、COLUMNを16(つまり64byte)として、ROWの値を可変にしてx軸、rdtscの値をy軸としたグラフが以下。
xが小さい( =つかうメモリが少ない)ときはL1キャッシュから値を引っ張ってくるので緑のグラフと赤のグラフはあまり変わらないが、ある程度でいきなり緑が遅くなる。これはおそらくL1キャッシュの追い出しが起こるせいだと考えられる。
詳しくはもうちょっと頑張らないといけない気がするけど、とりあえずこんな感じ。