记忆山的时间地点

Temporal locality in memory mountain

csapp教科书中,记忆山的描述表示增加工作尺寸会恶化时间局部性,但我觉得sizestride因素都只对空间局部性有贡献,因为当更多数据稀疏地存储在较低级别的缓存中时,吞吐量会降低。

时间局部性在哪里发挥作用?据我所知,这意味着在不久的将来再次引用相同的特定内存地址,如以下答案所示:What is locality of reference?

此图是通过顺序遍历数组的 fixed-size 个元素生成的。 stride 参数指定要在两个顺序访问的元素之间跳过的元素数。 size 参数指定数组的总大小(包括可能被跳过的元素)。测试的主循环如下所示(您可以从 here 获取代码):

for (i = 0; i < size / sizeof(double); i += stride*4) {
    acc0 = acc0 + data[i];     
    acc1 = acc1 + data[i+stride];
    acc2 = acc2 + data[i+stride*2]; 
    acc3 = acc3 + data[i+stride*3];
}

该循环如图6.40所示。书中没有显示或提及的是,该循环执行一次以预热缓存层次结构,然后测量 运行 秒的内存吞吐量。所有 运行 的最小内存吞吐量(在预热缓存上)是绘制的那个。

大小和步幅参数共同影响时间局部性(但只有步幅影响空间局部性)。例如,32k-s0 配置与 64k-s1 配置具有相似的时间局部性,因为对每一行的第一次访问和最后一次访问由相同数量的缓存行交错。如果您将大小保持在特定值并沿着步幅轴前进,则以较低步幅重复访问的某些行将不会以较高步幅访问,从而使它们的时间局部性基本上为零。可以正式定义时间局部性,但我不会那样做来回答问题。另一方面,如果您将步幅保持在特定值并沿着大小轴移动,则每条访问行的时间局部性会随着大小的增加而变小。但是,性能下降并不是因为每个访问行的时间局部性都较低,而是因为工作集大小较大。

我认为大小轴比时间局部性更能说明工作集大小(循环在执行期间要访问的内存量)对执行时间的影响。为了观察时间局部性对性能的影响,应该将此循环的第一个 运行 的内存吞吐量与同一循环(相同大小和步幅)的第二个 运行 的内存吞吐量进行比较。在循环的第二个 运行 中,每个访问的缓存行的时间局部性增加相同的量,如果缓存层次结构针对时间局部性进行了优化,则第二个 运行 的吞吐量应该比那个更好第一个。通常,应绘制同一循环的每个 N 顺序调用的吞吐量,以查看时间局部性的全部影响,其中 N >= 2.

顺便说一句,其他处理器上的内存山可以找到here and here. You can create a 3D mountain plot using this or this脚本。