Performance 记忆山的时间局部化

Performance 记忆山的时间局部化,performance,x86,intel,cpu-architecture,cpu-cache,Performance,X86,Intel,Cpu Architecture,Cpu Cache,在教科书中,对内存山的描述表示工作大小的增加会恶化时间局部性,但我觉得大小和步幅因素只会对空间局部性产生影响,因为当更多数据稀疏地存储在较低级别的缓存中时,吞吐量会降低 这里的时间位置在哪里?据我所知,这意味着在不久的将来会再次引用相同的特定内存地址,如以下答案所示: 此图是通过顺序遍历数组的固定大小元素生成的。stride参数指定两个顺序访问的元素之间要跳过的元素数。size参数指定数组的总大小(包括可以跳过的元素)。测试的主循环如下所示(您可以从以下位置获取代码): for(i=0;i=2

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

这里的时间位置在哪里?据我所知,这意味着在不久的将来会再次引用相同的特定内存地址,如以下答案所示:


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

for(i=0;i
该循环如图6.40所示。书中没有显示或提到的是,此循环执行一次以预热缓存层次结构,然后测量多次运行的内存吞吐量。所有运行(在预热缓存上)的最小内存吞吐量是绘制的

大小和步幅参数一起影响时间局部性(但只有步幅影响空间局部性)。例如,32k-s0配置具有与64k-s1配置相似的时间局部性,因为对每一行的第一次访问和最后一次访问由相同数量的缓存线交错。如果将“大小”保持在特定值并沿步幅轴移动,则在较低步幅下重复访问的某些线在较高步幅下将无法访问,从而使其时间位置基本为零。可以正式定义时间局部性,但我不会这样做来回答这个问题。另一方面,如果将步幅保持在特定值并沿尺寸轴移动,则每个访问线的时间位置将随着尺寸的增大而变小。然而,性能恶化并不是因为每个接入线路的时间位置一致较低,而是因为工作集较大

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


顺便说一句,其他处理器上的内存山也可以找到,也可以找到。您可以使用或脚本创建三维山体图。

引用教科书:
。。。size的值越小,工作集的大小越小,因此时间局部性越好。步长值越小,空间局部性越好n/(n-1)
(只有强制未命中,没有容量或冲突未命中)。定义有用的缓存线有点棘手,因为真正重要的是在返回到之前的缓存线之间,您还需要接触多少其他缓存线,而不是时间。
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];
}