在csapp教科书中,对记忆山的描述表明工作量的增加使时间局部性恶化,但我觉得size
和stride
因子都仅对空间局部性起作用,因为当将更多数据稀疏地存储在较低级别的缓存中时,吞吐量会降低。
这里的时间地点在哪里?据我所知,这意味着在不久的将来再次引用相同的特定内存地址,如以下答案所示:What is locality of reference?
答案 0 :(得分:2)
此图是通过顺序遍历数组的固定大小的元素而生成的。 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。