在尝试确定给定 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
近似恒定),但事实并非如此,事实上,它将时间差减少到不存在,为什么会这样?