现代 x86 CPU 使用什么缓存一致性解决方案?

What cache coherence solution do modern x86 CPUs use?

我对高速缓存一致性系统在现代多核中的功能有些困惑 CPU。我已经看到基于侦听的协议,如 MESIF/MOESI 基于侦听的协议已在 Intel 和 AMD 处理器中使用,另一方面,基于目录的协议似乎对多核更有效,因为它们不广播但发送给特定节点的消息。

什么是 AMD 或 Intel 处理器中的现代高速缓存一致性解决方案,它是基于侦听的协议(如 MOESI 和 MESIF),还是仅基于目录的协议,或者是两者的组合(基于侦听的协议之间的通信)同一节点内的元素,以及基于节点到节点通信的目录)?

MESI 是根据侦听共享总线来定义的,但不,现代 CPUs 实际上并不是那样工作的。 每个缓存行的 MESI 状态都可以通过消息和监听过滤器(基本上是一个目录)来跟踪/更新,以避免广播这些消息,这正是英特尔 (MESIF) 和 AMD (MOESI) 实际所做的。

例如Intel CPUs 中的共享包容性 L3 高速缓存(before Skylake server) lets L3 tags act as a snoop filter; as well as tracking the MESI state, they also record which core # (if any) has a private copy of a line.

例如,带有环形总线的 Sandybridge 系列 CPU(现代客户端芯片,服务器芯片直至 Broadwell)。核心 #0 读取一行。该行在核心 #1 上处于修改状态。

  • 核心 #0 上的 L1d 和 L2 缓存中的读取未命中,导致在环形总线上向包含该行的 L3 切片发送请求(通过某个物理地址上的哈希函数进行索引)位)

  • L3 的那个切片获取消息,检查它的标签。如果此时发现 tag = Shared,则响应可以通过双向环形总线返回数据。

  • 否则,L3 标签告诉它 core #1 拥有一行的独占所有权:独占,可能已被提升为 Modified = dirty。

  • 该 L3 切片中的 L3 缓存逻辑将生成一条消息,要求核心 #1 写回该行。

  • 消息到达核心 #1 的环形总线站,并获取其 L2 或 L1d 以写回该行。

    IDK 如果一个环形总线消息可以直接被 Core #0 以及相关的 L3 缓存片读取,或者如果消息可能必须一直到 L3 片并且 然后 从那里到核心#0。 (最坏情况下的距离 = 基本上环绕整个环,而不是双向环的一半。)

这个手感超棒; 不要相信我对确切细节的话,但发送消息(如共享请求、RFO 或回写)的一般概念是正确的心智模型。 BeeOnRope 具有类似的细分步骤,涵盖微指令和存储缓冲区,以及 MESI / RFO。


在类似的情况下,核心 #1 可以在不修改它的情况下悄悄地删除该行,如果它只获得了独占所有权但从未编写过它。 (缓存中未命中的加载默认加载到独占状态,因此单独的存储不必为同一行执行 RFO)。在那种情况下,我假设它毕竟没有线路的核心必须发回消息以表明这一点。或者它可能会直接向也在环形总线上的其中一个内存控制器发送一条消息,而不是返回 L3 切片以强制它这样做。

显然,每个核心都可以并行发生这样的事情。 (并且每个核心都可以有多个正在等待的未完成请求:单个核心内的内存级并行性。在 Intel 上,L2 超级队列在某些微体系结构上有 16 个条目,而有 10 或 12 个 L1 LFB。)

四插槽和更高版本的系统在插槽之间有监听过滤器;具有 E5-xxxx CPUs Broadwell 和更早版本的双路 Intel 系统只是通过 QPI 链接互相侦听垃圾邮件。 (除非您在双路系统中使用支持四路的 CPU (E7-xxxx))。多插槽很难,因为在本地 L3 中缺失并不一定意味着是时候攻击 DRAM 了; / 另一个套接字可能修改了行。

还相关:

  • https://www.realworldtech.com/sandy-bridge/ Kanter's SnB write-up covers some about Intel's ring bus design, IIRC, although it's mostly about the internals of each core. The shared inclusive L3 was new in Nehalem (when Intel started using the "core i7" brand name), https://www.realworldtech.com/nehalem/
  • - 英特尔 CPU 具有更多内核的环形总线上的更多跳数会损害 L3 和 DRAM 延迟,因此带宽 = 最大并发/延迟。
  • 更多链接。