【发布时间】:2018-08-05 01:16:48
【问题描述】:
我正在学习 CPU 缓存,但现在我仍然对缓存一致性协议 (MESI) 有误解。想象一下,我们有 2 个内核有一个处于共享状态的缓存线。其中一个执行读取,另一个执行写入:
;mem is cached in Shared state
Thread 1 (core 1) Thread 2 (core 2)
mov rax, [mem] mov [mem], dword 1
核心 1 能否观察到一些中间状态。我的意思是这样的:
-
Core 2将L1D中的缓存行标记为已修改,并将更改写入其中。 -
core 1的L1D缓存中的缓存行仍处于Shared状态,因此读取时恰好读取了陈旧值。 - 读取过时值后,
core 1的L1D缓存中的行已标记为无效。
英特尔的 MESI/MESIF 实施中是否可能出现这种情况?
【问题讨论】:
-
这并不重要,因为没有指令的全局排序,所以你不知道 thread1 是在 thread2 之前还是之后读取值。不过根据Peter's answer 的说法,thread2 在收到其 RFO 请求的回复之前不会执行写入操作,所以不,这不应该发生。
-
我们是否假设
[mem]驻留在单个缓存行中?它可以很容易地一分为二,得到不同的结果。 -
@BoPersson 绝对是的。其实我没想过错位...
标签: assembly intel cpu-architecture cpu-cache mesi