"非本地"指针是否会影响缓存性能?

por*_*uod 17 c c++ optimization prefetch cpu-cache

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

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

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

我可以想象,现实与否,预取单元检查进入L1缓存的缓存行以获取本机指针地址并开始将它们提取到L2或某些此类事物中.在那种情况下,我拯救记忆的聪明伎俩突然变得不那么聪明了.

那么,现代硬件预取器的作用是什么呢?他们可以被"非本地"指针绊倒吗?

jal*_*alf 21

硬件预取器没有看到指针,它看到了内存地址.它不关心地址来自何处,或者它在您编写的C++程序中的类型.它只是查看CPU被告知读取或写入的地址.

所以不,索引到数组不会是CPU以前从未遇到的可怕的新事物.

  • 究竟.在尝试理解CPU的功能时,不要考虑*类型*. (3认同)
  • @MarcClaesen:嗯,为了公平对待OP,即使在CPU表示方面,内存地址的表示方式(64位上的8个字节)与表示"已知"地址的偏移量之间也存在差异(可能只有2个)字节,如果足够的话).例如,在L1缓存中看起来像内存地址的预取内存的"新奇"优化似乎是完全合法的,并且会受到"内存节省"偏移的影响. (2认同)
  • @MSalters,它早在很久以前就被提出过了,但这个想法远非死亡.由于您仍然不知道地址,因此SW预取无法帮助您提前链接数据结构.在这种情况下,流水线操作也无济于事.一般来说,这仍然是一个悬而未决的问题. (2认同)

Lee*_*eor 10

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

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

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

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

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

一些参考书目: