对于缓存的写分配策略,当发生写未命中时,将从主内存中获取数据,然后通过写命中进行更新。
我的问题是,假设写入命中的回写策略,如果 CPU 立即更新数据,为什么要从主内存读取数据?难道我们不能只写入缓存而不从主存中获取数据吗?
最佳答案
在 L1d 缓存中命中的存储上,您不需要获取或 RFO 任何内容,因为该行已经被独占拥有。
通常您只存储到整行的一部分,因此您需要整行的副本才能使其处于已修改状态。您需要执行“读取所有权”(RFO) ) 如果您还没有该行的有效共享副本。 (您可以将其提升为独占,然后通过使其他副本无效来进行修改。MESI)。
全线存储(如 x86 AVX-512 vmovdqa [rdi], zmm0
64 字节存储)可以直接无效,而不是读取所有权,并且只需等待确认,没有其他存储核心有该行的有效副本。 IDK 如果这种情况确实发生在 AVX-512 存储中,特别是在当前的 x86 微架构中。
在某些情况下,在某些 CPU 中,实际上确实会发生跳过读取(并且只是使任何其他副本无效)的情况。例如在微码用于实现 x86 rep stos
和 rep movs
的存储协议(protocol)中,它们基本上是 memset/memcpy。因此,对于大量数据,它们肯定会存储整行,并且值得首先避免读取的内存流量。请参阅 Andy Glew 的评论,我在 What setup does REP do? 中引用了该评论- 他在 Intel 工作时设计了 P6(Pentium Pro)快速字符串微代码,并表示它包含无 RFO 存储协议(protocol)。
关于cpu-architecture - 为什么在 Write Allocate 缓存策略中从主内存获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64942523/