特定のCPUのキャッシュサイズを決定する際に、次のようにメモリ/キャッシュへのメモリアクセスの時間を計ろうとしました。
lengthMod = sizes[i]/sizeof(int) - 1; // where sizes[i] is something like 1024, 2048 ...
for (unsigned int k = 0; k < REPS; k++) {
data[(k * 16) & lengthMod]++;
}
1, 0.52
4, 0.52
8, 0.52
16, 0.52
32, 0.52
64, 1.11 // << note the jump in timing. L1 cache size is 32K
128, 1.12
256, 1.19
したがって、lengthModが2の累乗でない場合、これを行うことはできないと思います。だからやってみた
lengthMod = sizes[i]/sizeof(int);
for (unsigned int k = 0; k < REPS; k++) {
data[(k * 16) % lengthMod]++;
}
1, 2.67
4, 2.57
8, 2.55
16, 2.51
32, 2.42
64, 2.42 // << no jump anymore ...
128, 2.42
256, 2.42
それから、私が期待したタイミングの増加はもう存在しないことがわかります...私は増加する時間を期待しましたが、それはすべての値に適用されるべきですか?したがって、x
を使用するときの秒の場合、秒(ほぼ一定)を&
期待しますが、そうではありません。実際、タイミングの差が存在しないようになります。なぜですか。~x+c
c