【问题标题】:Store misses hurt performance?商店失误影响业绩?
【发布时间】:2021-08-30 19:12:29
【问题描述】:

我们知道,脏数据不会立即写回 RAM,而是隐藏在存储缓冲区中,然后在时间允许的情况下稍后再写回 RAM。此外,存储转发技术,如果您在将值刷新到缓存/内存之前对同一核心上的同一位置执行后续 LOAD,则存储缓冲区中的值将被“转发”,您将获得刚刚存储。这可以与缓存访问并行完成,因此不会减慢速度。

我的问题是 - 在存储缓冲区和存储转发的帮助下,存储未命中不一定需要处理器(对应的核心)停止。因此,存储未命中不会影响总缓存未命中延迟,对吧?

谢谢。

【问题讨论】:

    标签: caching memory-management cpu-architecture cpu-cache


    【解决方案1】:

    DRAM 延迟非常高,因此当缓存未命中存储停止其进程时,存储缓冲区很容易填满并停止将新存储指令分配到后端。存储缓冲区到decouple / insulate execution from cache misses 的能力受到其有限大小的限制。不过,它总是对一些有所帮助。没错,商店更容易隐藏缓存未命中延迟。

    对于像 x86 的 TSO 这样的强排序内存模型来说,存储缓冲区的停滞和填满是一个更大的问题:存储只能按程序顺序从存储缓冲区提交到 L1d 缓存,因此任何缓存未命中的存储都会阻塞存储缓冲区进度,直到 RFO(读取所有权)完成。尽早启动 RFO(在存储到达存储缓冲区的提交端之前,例如在退休时)可以通过在数据需要到达之前让 RFO 运行来隐藏一些这种延迟。

    连续存储到 same 高速缓存行可以合并到一个缓冲区中,当数据从 RAM(或从另一个拥有所有权的核心)到达时,让它们都立即提交。有一些证据表明,在不违反内存排序规则的有限情况下,英特尔 CPU 确实做到了这一点。

    【讨论】:

    • 可能值得补充的是,如果在存储之后有加载,那么如果预测要序列化(通过内存消歧单元或仅 4k 对齐),那么可以在 SB 填充之前停止执行。
    • 一个后续问题,如果一个脏块从L1缓存中被逐出,是不是直接存入主存?还是先写到L2缓存,从L2驱逐出时再写回L3?是否有任何文档显示写回策略如何在真实硬件的多级缓存中工作?非常感谢。 @彼得
    • @dalglish:它被驱逐到下一级缓存,而不是一直到主内存。 L2 和 L3 当然也是回写式缓存,否则当您的阵列对于 L1d 缓存来说几乎没有太大时,某些工作负载的性能会巨大急剧下降。您可以查看 memset / memcpy vs. size 基准以查看实际效果。
    • @PeterCordes 谢谢。关于在真机上实施的回写策略,您有任何文档建议吗?
    • @dalglish:你的意思是真正的 CPU 是否会在总线流量较低时尝试清理一些脏线,这样未来的驱逐会更便宜?不确定英特尔(或 AMD)的优化手册是否提到了这一点。如果您的意思是外部缓存的替换策略,请参阅blog.stuffedcow.net/2013/01/ivb-cache-replacement - IvB 并稍后使用自适应替换而不是伪 LRU,以尝试抵抗来自时间局部性差的访问的污染。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多