我编写了以下玩具基准。
int N = 1024*4096;
unsigned char *ary = malloc(N);
ary[0] = 1;
int stride, i;
double start, end;
int sum;
for(stride = 1; stride < N; ++stride) {
start = getCPUTime();
sum = 0;
for(i = 0; i < N; i+=stride) {
sum += ary[i];
}
end = getCPUTime();
printf("stride %d time %f sum %d\n", stride, (end - start)/(N/stride), sum);
}
基本上,它以不同的步幅遍历数组。然后我绘制了结果:
(结果被平滑)
当 stride 为 ~128 时,CPU 可以将所有要访问的数据放入 L1 Cache 中。鉴于访问的线性,未来的读取可能是可以预测的。
我的问题是,为什么在那之后平均阅读时间不断增加?我对 stride=~128 的推理也适用于大于该值的值。
谢谢!