我编码了以下玩具基准。
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的推理也适用于大于该值的值。
谢谢!
答案 0 :(得分:0)
这是您使用的代码吗?它只是读取16 MB的数据。我在我的PC上运行它,其中16 MB来自RAM,计算MB /秒,在步幅2时为993,在步幅999时减少到880.基于测量微秒运行时间,您的时间计算在步幅2时产生0.0040,增加步幅为999时为0.0045。
速度降低有各种各样的原因,例如突发读取,缓存对齐和不同的存储库。