问题描述
我们知道,脏的受害者数据不会立即写回 RAM,它会被隐藏在存储缓冲区中,然后在时间允许的情况下再写回 RAM。此外,存储转发技术,如果您在将值刷新到缓存/内存之前对同一核心上的相同位置执行后续 LOAD,则存储缓冲区中的值将被“转发”,您将获得该值刚刚存储。这可以与缓存访问并行完成,因此不会减慢速度。
我的问题是 - 在存储缓冲区和存储转发的帮助下,存储未命中不一定需要处理器(对应内核)停止。因此,存储未命中不会影响总缓存未命中延迟,对吗?
谢谢。
解决方法
DRAM 延迟非常高,因此当缓存未命中存储停止其进度时,存储缓冲区很容易填满并停止向后端分配新的存储指令。存储缓冲区 decouple / insulate execution from cache misses 的能力受到其有限大小的限制。不过,它总是对一些有所帮助。您说得对,商店更容易隐藏缓存未命中延迟。
对于像 x86 的 TSO 这样的强有序内存模型来说,停止和填满存储缓冲区更像是一个问题:存储只能按照程序顺序从存储缓冲区提交到 L1d 缓存中,因此任何缓存未命中的存储都会阻塞 store-buffer直到 RFO(读取所有权)完成。尽早启动 RFO(在存储到达存储缓冲区的提交结束之前,例如在退休时)可以通过在数据需要到达之前让 RFO 处于运行状态来隐藏一些这种延迟。
连续存储到相同缓存行可以合并到一个缓冲区中,当数据从RAM(或来自另一个拥有所有权的内核)到达时,它们可以立即提交。有一些证据表明,英特尔 CPU 确实会这样做,在不会违反内存排序规则的有限情况下。
- 有关@BeeOnRope 在英特尔 Skylake 上的 RFO 数据到达之前对 LFB 提交的实验性测试的链接,请参阅 Why doesn't RFO after retirement break memory ordering?。