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];
}