【问题标题】:Cache hits, misses and prediction - impact on performance缓存命中、未命中和预测 - 对性能的影响
【发布时间】:2013-12-23 03:05:04
【问题描述】:

我编写了以下玩具基准。

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 的推理也适用于大于该值的值。

谢谢!

【问题讨论】:

  • 您是否考虑过对打印语句缓存的巨大影响?
  • 平均时间的不断增加是否与软页面错误有关?

标签: c caching cpu microbenchmark


【解决方案1】:

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

随着步幅的增加,速度降低的原因有很多,比如突发读取、缓存对齐和不同的内存库。

【讨论】:

  • 感谢您的回答!是的,这是我使用的代码。实际上它是 4MByte,而不是 16。让我感到困惑的是为什么在 stride=128 时下降到接近 0 结合之后的持续增加......
  • 对不起,我错过了,但 4 MB 仍然是我使用的 PC 上的 RAM。我的电脑在 128 时没有下降,但从 RAM 和一些缓存中突发读取可能是 128 字节。需要查看添加字符的指令。
猜你喜欢
  • 2022-08-07
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多