【发布时间】:2021-03-04 15:21:15
【问题描述】:
对于缓存的写入分配策略,当发生写入未命中时,会从主内存中获取数据,然后通过写入命中进行更新。
我的问题是,假设写命中的回写策略,如果 CPU 立即更新数据,为什么要从主内存读取数据?难道我们不能直接写入缓存而不从主存中获取数据吗?
【问题讨论】:
标签: cpu-architecture cpu-cache
对于缓存的写入分配策略,当发生写入未命中时,会从主内存中获取数据,然后通过写入命中进行更新。
我的问题是,假设写命中的回写策略,如果 CPU 立即更新数据,为什么要从主内存读取数据?难道我们不能直接写入缓存而不从主存中获取数据吗?
【问题讨论】:
标签: cpu-architecture cpu-cache
在命中 L1d 缓存的商店中,您无需获取或 RFO 任何内容,因为该行已经独占。
通常您只存储到整行的一部分,因此您需要整行的副本以使其处于修改状态。您需要执行 Read For Ownership (RFO ) 如果您还没有该行的有效共享副本。 (您可以通过使其他副本无效来提升为 Exclusive 然后修改。MESI)。
全行存储(如 x86 AVX-512 vmovdqa [rdi], zmm0 64 字节存储)可以只是无效而不是读取所有权,并且只需等待确认没有其他内核具有该行的有效副本。 IDK 如果这真的发生在 AVX-512 商店,特别是在当前的 x86 微架构中。
跳过读取(并且只是使任何其他副本无效)肯定确实在某些情况下在某些 CPU 中发生。例如在微码实现x86所使用的store协议中rep stos和rep movs,基本都是memset/memcpy。因此,对于大量数据,它们肯定会存储完整的行,并且避免首先读取的内存流量是值得的。请参阅我在What setup does REP do? 中引用的 Andy Glew 的 cmets - 他在英特尔工作时设计了 P6 (Pentium Pro) 快速字符串微码,并表示其中包含无 RFO 存储协议。
【讨论】: