【问题标题】:Temporal locality in memory mountain记忆山中的时间局部性
【发布时间】:2019-11-05 08:06:16
【问题描述】:

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

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

【问题讨论】:

  • 引用教科书:... Smaller values of size result in a smaller working set size, and thus better temporal locality. Smaller values of stride result in better spatial locality. ...
  • 您对“时间局部性”的理解是正确的,我相信。假设以恒定的访问速率完全随机访问数据,请注意较小的工作大小意味着任何给定的内存地址将被更频繁地访问。这将直接转化为改进的时间局部性。相反,随着工作大小的增加,每个内存地址的访问频率都会降低。考虑在整个工作数据集中重复循环的退化示例。集合越小,您完成循环和重复的频率就越高,从而访问与以前相同的地址。
  • 时间局部性取决于数据集遍历的性质,因此无论其大小如何,它都以顺序步幅存在。但是,由于必须通过有限机制来利用时间局部性,因此在较小的数据集上提取存储会更容易。
  • 顺便说一句,您的链接上的定义有点不对,试图在那里详细说明。

标签: performance x86 intel cpu-architecture cpu-cache


【解决方案1】:

此图是通过顺序遍历数组的固定大小元素生成的。 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。

顺便说一下,herehere 可以找到其他处理器上的内存山。您可以使用 thisthis 脚本创建 3D 山图。

【讨论】:

  • 您可能会争辩说,在返回前一个缓存行之前接触更多缓存行是较低的时间局部性。所以更大的尺寸=更少的时间局部性。您的定义似乎类似于程序生命周期内对高速缓存行的访问次数,因此理论上的最大命中率 = n / (n-1)(只有强制未命中,没有容量或冲突未命中)。有用地定义它有点棘手,因为真正重要的是您在返回到较早的缓存行之间接触了多少其他缓存行,而不是真正的 time
猜你喜欢
  • 2014-05-11
  • 2020-09-19
  • 2011-03-05
  • 2011-12-16
  • 2011-11-16
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2014-01-29
相关资源
最近更新 更多