缓存命中,未命中和预测 - 对性能的影响

时间:2013-12-23 03:05:05

标签: c caching cpu microbenchmark

我编码了以下玩具基准。

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);
}

基本上,它以不同的步幅迭代一个数组。然后我绘制了结果:

enter image description here

(结果平滑)

当stride为~128时,CPU可以适应L1 Cache中要访问的所有数据。鉴于访问的线性,可能会预测未来的读取。

我的问题是,为什么平均阅读时间会在此之后继续上升?我对stride = ~128的推理也适用于大于该值的值。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是您使用的代码吗?它只是读取16 MB的数据。我在我的PC上运行它,其中16 MB来自RAM,计算MB /秒,在步幅2时为993,在步幅999时减少到880.基于测量微秒运行时间,您的时间计算在步幅2时产生0.0040,增加步幅为999时为0.0045。

速度降低有各种各样的原因,例如突发读取,缓存对齐和不同的存储库。