17

据我所知,硬件预取器至少会检测并获取内存中的恒定步幅。此外,它可以监控数据访问模式,无论这意味着什么。这让我想知道,硬件预取器是根据存储在内存中的实际数据做出决定,还是纯粹基于程序表现出的行为?

我问的原因是因为我偶尔会使用“非本地”指针作为指针。一个简单的例子是一个预先分配的数组,以及索引这个数组的小整数而不是指针。如果我需要存储大量这样的“指针”,那么节省的内存可以快速增加,进而通过使用更少的内存间接提高缓存性能。

但据我所知,这可能会干扰硬件预取器的工作方式。或不!

我当然可以想象,不管现实与否,一个预取单元检查进入 L1 缓存的本地指针地址的缓存行,并开始将它们提取到 L2 或类似的东西中。在那种情况下,我节省内存的巧妙技巧突然显得不那么聪明了。

那么,现代硬件预取器到底是做什么的呢?它们会被“非本地”指针绊倒吗?

4

2 回答 2

21

硬件预取器看不到指针,它看到的是内存地址。它不关心地址来自哪里,也不关心它在您编写的 C++ 程序中的类型。它只是查看 CPU 被告知读取或写入的地址。

所以不,对数组进行索引不会是 CPU 以前从未遇到过的可怕新事物。

于 2013-11-13T13:06:07.277 回答
10

链接数据结构 (LDS) 预取仍然是计算机体系结构中的一个已知问题。我不熟悉任何真正做到这一点的现代 CPU,但理论上这是可能的。多年来,有几篇学术论文提出了一些变化:

  1. 一个专用的硬件,可以检测提取的缓存行中的类似地址的值,并向这些地址发出预取。
  2. 一种编译器辅助技术,编译器识别数据结构依赖关系并插入软件预取或其他提示。

这两种方法都可能受到您的技术的影响(第一种方法会变得无用,如果编译器足够聪明,第二种方法可能会起作用)。

当然,你必须在这样的机器上实际运行,所以它只是理论上的,如果它适合你,你不应该改变你的实践,但它表明分析应该是每个微架构的特定的,并且系统,以及在一种情况下对您有帮助的方法,在另一种情况下可能效率较低。
一般来说 - 不要只相信 CPU 做或不做一些优化(除非有文档记录),总是检查你得到预期的行为。

顺便说一句,请注意,即使硬件看到内存的内容,它仍然在虚拟地址空间中 - 硬件无论如何都必须对物理地址进行某种转换才能使用它,所以在某种意义上没有必须是任何额外的开销。

一些参考书目:

于 2013-11-13T13:45:22.847 回答