循环步长和缓存行

3
我正在学习缓存行以及循环步幅对缓存的影响。我看到了this这个页面,它展示了循环步幅与执行时间之间的关系。根据基准测试结果,增加循环步幅会降低执行时间,这让我非常困惑。如果我理解正确的话,假设缓存行是64字节,在第一个案例中,循环步幅仅为1,这意味着循环按顺序遍历数组元素,那么执行时间应该最短,因为16个整数(4字节x16=64字节)被加载到缓存中。执行时间在步幅为16时应最短,因为所有16个元素都被加载到同一缓存行中。当步幅增加到16以上时,执行时间应该增加,因为数组元素不在缓存行中,但页面上的图表完全相反。

running times of loop for different step values

1个回答

3
在这个例子中,长度是恒定的,因此步长越大,遍历的元素就越少。
有趣的现象是,在缓存行以下不适用,因为您无法带来部分线路。因此在小于16时,您会支付获取所有缓存行的相同惩罚。在16以上时,您开始跳过一些行。例如在32以上(128B),您每隔一行获取一次 - 因此时间减半(假设您的执行时间受内存延迟支配)。

那么,当你说“小于16时,你需要获取所有缓存行的相同惩罚”时,这是否意味着整个数组(所有元素)都被加载到缓存中,而当大于16时,数组的部分被加载到缓存中?我原本以为加载的元素数量取决于步幅。 - zer0c00l
1
缓存以64字节的粒度进行。如果您访问缓存行中的一个元素,仍然必须获取整个行。但是,如果您的跨度为两个缓存行宽度,则无需获取中间的行。如果您绘制它,您会发现任何大于64B的跨度都将允许一些跳过,而跨度越长,您将获得的跳过也就越多。 - Leeor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接