4

我想在 intel Broadwell 中了解 MESI 的更多细节。

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

T1:核心 0 和核心 4 和核心 5 的 x = 100 并且 XCacheL处于共享状态,因为 3 个核心具有 XCacheL 的副本。

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

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 状态:共享,并且I在核心 5 中无效,并且 L3$ 和主内存具有最新的有效 XCacheL。

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

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

4

2 回答 2

2

看起来您在谈论Early Snoop算法,其中 L3 切片的缓存代理负责发送窥探。所以我会根据那个算法来回答这个问题。

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

于 2019-01-21T20:11:43.007 回答
2

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


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

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

单个内核不直接驱动“内存总线”,甚至不驱动 2 或 4 条 DRAM 总线之一。内存控制器仲裁对 DRAM 的访问,并有一些缓冲来重新排序/组合访问。(访问内存的所有内容都经过它,包括 DMA,因此它可以做任何它喜欢的事情,只要它呈现以某种合理的顺序发生的加载/存储。)

加载请求在 L3 缓存未命中之前不会发送到系统代理。有关四核桌面的说明,请参见https://superuser.com/questions/1226197/x86-address-space-controller/1226198#1226198 (更简单,只需将内存控制器连接到系统代理,使它与 CPU 集成内存控制器之前的北桥完全一样。)


由于 Broadwell 使用包含 L3 缓存,L3 标签可以告诉它哪个(如果有)核心具有修改或独占副本,即使 L3 本身中的行不可共享。(即一行的数据在 L3 中可能是无效的,但标签仍在跟踪哪个核心有私有副本)。请参阅英特尔酷睿 i7 处理器中使用了哪种缓存映射技术?

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

于 2019-01-21T23:20:01.667 回答