关于“每个程序员应该了解内存的内容”中包含的关于缓存和预取的一个示例

时间:2018-03-22 17:57:45

标签: caching optimization cpu-architecture micro-optimization prefetch

在他出色的出版物中,乌尔里希·德雷珀(Ulrich Drepper)超越了一个我无法完全理解的测试基准。

他在谈论缓存和预取。他首先展示了一个测试,他正在访问一个每个16字节的元素数组(一个指针和一个64位整数,每个元素都有一个指向下一个的指针,但这在这里并不完全相关,并且,对于每个元素,他会增加它的价值是一个。

然后他继续展示他正在访问同一个数组的另一个测试,但这次他在每个元素中存储了它的值与下一个元素的值的总和。

然后比较这两个测试的数据,他表明,当工作集小于总L2D $大小(但大于总L1D $大小)时,第二个测试的性能优于第一个,并且他的动机是从下一个元素的读取充当“强制预取”,从而提高性能。

现在,我不明白的是,当我们不仅仅预取那条线而是实际读取它并在之后立即使用该数据时,该读取怎么能充当预取?难道不应该像第一次测试中访问新元素时那样读取停顿吗?事实上,在我看来,我看到第二个例子与第一个例子非常相似,唯一的区别是我们存储在前一个元素中,而不是在最近的元素中(并且我们将两个相加而不是递增)

为了更准确地引用实际文本,有关测试将在第22页第三段中讨论,其相对图表是下一页的图3.13。

最后,我会在这里报告相关的图表,裁剪出来。第一个测试对应蓝色“Inc”线,第二个测试对应绿色“Addnext0”线。作为参考,红色的“Follow”行不执行写操作,只执行顺序读取。

enter image description here

0 个答案:

没有答案