什么是 MESI 协议中的 L3$ 角色部分

what's L3$ role part in MESI protocal

我想知道更多MESI在intel broadwell的细节。

假设一个cpu插座有6个核心core 0 to core 5, 他们每个人都有自己的 L1$ 和 L2$ 并共享 L3$ , 共享内存中有一个var X,x位于缓存行 称为 XCacheL ,以下是我的问题的详细信息:

T1:核心 0、核心 4 和核心 5 有 x = 100 和 XCacheL 是 S共享状态,因为 3 个内核具有 XCacheL 的副本。

T2 : Core 0 需要修改 x ,所以 core 0 广播无效信号, core 4 和 core 5 接收信号 ,使他们的 XCacheL 副本无效,核心 0 将 x 修改为 200 XCacheL 状态现在是 Modified .

T3:核心 4 需要读取 x 但它的 XCacheL 副本在 T2 中无效,因此它触发读取未命中,将发生以下情况:

● Processor makes bus request to memory
● Snooping cache puts copy value on the bus
● Memory access is abandoned
● Local processor caches value
● Local copy tagged S
● Source (M) value copied back to memory
● Source value M -> S

所以在 T3 之后,XCacheL 是核心 0 和核心 4 状态:Shared 和 Invalidated 在核心 5 中,还有 L3$ 和主内存具有最新的有效 XCacheL。

T4:核心 5 需要读取 x,因为它的 XCacheL 副本在 T2 中是 Invalidated,但是这个 monent XCacheL 有 L3$ 中的正确副本,核心 5 是否需要像核心 4 那样引发读取未命中?!

我的猜测是:不需要,因为 L3$ 具有有效的 XCacheL, 所以核心 5 可以达到 L3$ 并在核心 5 中从 L3$ 到 L1$ 获得正确的 XCacheL,因此核心 5 不会触发读取未命中。

您似乎在谈论 Early Snoop 算法,其中 L3 切片的缓存代理负责发送侦听。所以我就按照那个算法来回答这个问题。

所有 Broadwell 处理器都使用包容性 L3。所以是的,核心 5 将丢失其私有的 L1 和 L2 缓存,并且读取请求将发送到请求行映射到的 L3 切片的缓存代理。缓存代理确定它有该行并且它处于 S 状态。由于是读请求,缓存代理会将缓存行发送给核心5。行的状态没有改变,也没有发送任何监听。

你是对的,在你的 T4 步骤中,内核 #5 的负载将在 L3 中命中,因此不会发生内存访问。核心 #5 获得该行的另一个副本,处于共享状态。


对于像 Broadwell 这样的 CPU,所有内核共享对片上 DRAM 控制器的访问权限,您的步骤顺序为零。

环形总线连接核心(每个核心都有一片 L3 缓存)和系统代理(PCIe 链接和与其他核心的连接)和家庭代理(内存控制器)。有关显示环形总线的框图,请参阅 https://en.wikichip.org/wiki/intel/microarchitectures/broadwell_(client)#Die_Stats

单个内核不直接驱动 "the memory bus",甚至不驱动 2 或 4 个 DRAM 总线之一。内存控制器仲裁对 DRAM 的访问,并有一些缓冲来重新排序/组合访问。 (所有访问内存的东西 都会通过它,包括 DMA,所以它可以做任何它喜欢做的事,只要它让 loads/stores 看起来以某种合理的顺序发生。)

加载请求只有在 L3 缓存中未命中后才会发送到系统代理。请参阅 https://superuser.com/questions/1226197/x86-address-space-controller/1226198#1226198 以了解四核台式机的图示(它更简单,只是将内存控制器连接到系统代理,使其与 CPU 集成内存控制器之前的北桥完全一样。)


由于 Broadwell 使用包容性 L3 缓存,L3 标签可以告诉它哪个核心(如果有)具有修改或独占副本,即使 L3 本身中的行不可共享。 (即一行数据在 L3 中可能无效,但标签仍在跟踪哪个核心具有私有副本)。参见

这让 L3 标签充当侦听过滤器以减少广播。