【发布时间】:2019-06-14 09:17:42
【问题描述】:
我想在 intel Broadwell 了解 MESI 的更多细节。
假设一个 cpu socket 有 6 个核心 core 0 到 core 5 , 他们每个人都有自己的 L1$ 和 L2$ 并共享 L3$ , 共享内存中有一个 var X , x 位于缓存行中 称为 XCacheL ,以下是我的问题的详细信息:
T1 : 核心 0 和核心 4 和核心 5 具有 x = 100 和 XCacheL 是S共享状态,因为 3 核具有 XCacheL 的副本。
T2 : 核心 0 需要修改 x ,所以核心 0 广播无效信号,核心 4 和核心 5 接收信号 ,使他们的 XCacheL 副本无效,Core 0 将 x 修改为 200 并且 XCacheL 状态现在是M修改了。
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 是 core 0 和 core 4 状态:Shared 和 Invalidated in core 5 ,还有 L3$ 和主内存有最新的有效 XCacheL 。
T4 :核心 5 需要读取 x ,因为它的 XCacheL 副本在 T2 中Invalidated,但是这个monent XCacheL 具有 L3$ 中的正确副本,核心 5 是否需要像核心 4 那样触发读取未命中?!
我的猜测是:不需要,因为 L3$ 具有有效的 XCacheL, 所以核心 5 可以达到 L3$ 并在核心 5 中从 L3$ 到 L1$ 获得正确的 XCacheL,因此核心 5 不会触发读取未命中。
【问题讨论】:
-
在 L3 包含在内的地方,从那里读取共享行可能更快。如果不是,它们是从其他缓存转发的。这就是MESIF存在的原因。 uncore 可能只是在 QPI/UPI 链路中广播请求,而 L3、iMC 或另一个核心归位代理会响应它。这就是您所说的读取未命中(对不起,我缺乏术语)的意思,而不是核心仍然会触发它。实际上,你总是需要从内核外部触发一些东西来读取,即使是从 L1 读取。
-
读取时从 Modified 直接转换为 Shared 并非在所有处理器上都完成。有时最好使无效,因为读取很快就会变成写入,并且您只需要该行。见 - software.intel.com/en-us/forums/…
标签: caching x86 cpu-architecture cpu-cache mesi