cpu-architecture - 为什么在 Write Allocate 缓存策略中从主内存获取数据

标签 cpu-architecture cpu-cache

对于缓存的写分配策略,当发生写未命中时,将从主内存中获取数据,然后通过写命中进行更新。

我的问题是,假设写入命中的回写策略,如果 CPU 立即更新数据,为什么要从主内存读取数据?难道我们不能只写入缓存而不从主存中获取数据吗?

最佳答案

在 L1d 缓存中命中的存储上,您不需要获取或 RFO 任何内容,因为该行已经被独占拥有。

通常您只存储到整行的一部分,因此您需要整行的副本才能使其处于已修改状态。您需要执行“读取所有权”(RFO) ) 如果您还没有该行的有效共享副本。 (您可以将其提升为独占,然后通过使其他副本无效来进行修改。MESI)。

全线存储(如 x86 AVX-512 vmovdqa [rdi], zmm0 64 字节存储)可以直接无效,而不是读取所有权,并且只需等待确认,没有其他存储核心有该行的有效副本。 IDK 如果这种情况确实发生在 AVX-512 存储中,特别是在当前的 x86 微架构中。

在某些情况下,在某些 CPU 中,实际上确实会发生跳过读取(并且只是使任何其他副本无效)的情况。例如在微码用于实现 x86 rep stosrep movs 的存储协议(protocol)中,它们基本上是 memset/memcpy。因此,对于大量数据,它们肯定会存储整行,并且值得首先避免读取的内存流量。请参阅 Andy Glew 的评论,我在 What setup does REP do? 中引用了该评论- 他在 Intel 工作时设计了 P6(Pentium Pro)快速字符串微代码,并表示它包含无 RFO 存储协议(protocol)。

另请参阅Enhanced REP MOVSB for memcpy

关于cpu-architecture - 为什么在 Write Allocate 缓存策略中从主内存获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64942523/

相关文章:

caching - 别名的定义/含义? (CPU缓存架构)

memory-management - 为什么我们不在用户空间使用屏障

performance - 是否有任何现代 CPU 的缓存字节存储实际上比字存储慢?

caching - 我们可以在堆内存上使用非临时 mov 指令吗?

caching - 不同级别缓存(即 L1、L2 和 L3)之间的缓存一致性(MESI 协议(protocol))

caching - 内层缓存可以写回包容性外层缓存吗?

c++ - 大端和小端的程序

linux-kernel - Napi调度是谁做的

c - 如何在PowerPC架构中 "invalidate"或 "flush"范围内的CPU缓存?

javascript - 堆栈如何在其中存储值?