我编码了下面的玩具基准。
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缓存中要访问的所有数据。考虑到访问的线性度,未来的读取可能会被预测。
我的问题是,为什么阅读的平均时间会在那之后持续上升?我对stride=~128的推理也适用于大于该值的值。
谢谢!
最佳答案
这是你用的密码吗?它所做的就是从16MB读取数据。我在我的电脑上运行它,16MB来自RAM,计算MB/秒,在第2步是993,在第999步是880。基于测量微秒的运行时间,您的时间计算在第2步产生0.0040,在第999步增加0.0045。
有各种各样的原因可以降低速度,如突发读取、缓存对齐和不同的内存库。
关于c - 缓存命中,未命中和预测-对性能的影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20736452/