4

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

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

4

1 回答 1

5

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

例如,英特尔 CPU 中的共享包容性 L3 缓存(在 Skylake 服务器之前)让 L3 标签充当窥探过滤器;除了跟踪 MESI 状态外,它们还记录哪个核心#(如果有)拥有行的私有副本。 英特尔酷睿 i7 处理器中使用了哪种缓存映射技术?

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

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

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

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

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

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

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

这是超级手波;在具体细节上不要相信我的话,但是发送共享请求、RFO 或回写等消息的一般概念是正确的心理模型。 BeeOnRope的答案是类似的细分为涵盖 uops 和存储缓冲区以及 MESI / RFO 的步骤。


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

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

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

还有相关的:

于 2020-05-31T10:56:55.577 回答