我正在阅读MESI snooping cache coherence protocol,我想这是现代多核x86处理器中使用的协议(如果我错了,请纠正我)。现在那篇文章在一个地方说了这个。
保持处于Modified状态的行的缓存必须侦听(拦截)all 尝试读取(来自系统中的所有其他缓存) 相应的主存储器位置并插入它所拥有的数据。这是 通常通过强制读取(即稍后重试),然后写入来完成 数据到主内存并将缓存行更改为共享状态。
现在我不明白为什么数据需要写在主内存中。无法缓存一致性只是保持缓存中的内容同步而不进入内存(除非缓存行真的被逐出)?我的意思是如果一个核心不断读取而另一个核心不断写入,为什么不将数据保存在缓存中,并不断更新缓存中的数据。为什么会产生写回主存的性能?
换句话说,读取数据的核心是不是可以直接从写入核心的缓存中读取并相应地修改它们的缓存?
答案 0 :(得分:6)
现在我不明白为什么数据需要写在主内存中。斜面 缓存一致性只是使缓存中的内容保持同步而不进行操作 记忆(除非高速缓存行被真正驱逐出去)?
这确实发生了。
我的笔记本电脑上有一个看起来像这样的iCore 5;
M
N
S
L3U
L2U L2U
L1D L1D
L1I L1I
P P
L L L L
M = Main memory
N = NUMA node
S = Socket
L3U = Level 3 Unified
L2U = Level 2 Unified
L1D = Level 1 Data
L1I = Level 1 Instruction
P = Processor
L = Logical core
当两个逻辑内核在同一数据上运行时,它们不会移出到主内存;他们通过L1和L2缓存进行交换。同样,当两个处理器中的核心正在工作时,它们通过L3缓存交换数据。除非驱逐发生,否则不使用主存储器。
但更简单的CPU确实可能不那么聪明。
答案 1 :(得分:3)
MESI协议不允许多个缓存将同一缓存行保持在modified
状态。因此,如果一个缓存行被修改并希望从其他处理器的缓存中读取,那么必须先将其写入主存储器然后再读取,这样两个处理器的缓存现在share
该行(共享)状态)
答案 2 :(得分:2)
因为缓存通常无法直接相互写入(因为这会占用更多带宽)。
答案 3 :(得分:1)
我不明白为什么数据需要写入 主记忆
让处理器A拥有modified
行。现在处理器B正在尝试从主存储器读取相同的高速缓存(由A修改)。由于主内存中的内容现在无效(因为A修改了内容),A正在窥探该行的任何其他读取尝试。因此,为了让处理器B(和其他人)能够读取该行,A必须将其写回主存储器。
I mean if one core is constantly reading and the other constantly writing,
为什么不将数据保存在缓存中,并不断更新缓存中的数据。
你是对的,这就是通常做的事情。但在这里,情况并非如此。其他人(我们示例中的处理器B)正在尝试阅读。所以A必须将其写回并使缓存行状态为shared
,因为A和B现在都在共享缓存行。
答案 4 :(得分:1)
所以实际上我并不认为读取缓存必须转到主内存。 在MESI中,当处理器请求由其中一个对等体修改的块时,它在总线(或任何互连介质)上发出读取未命中,其被广播到每个处理器。
将块保存在" Modified"国家接听电话,并在公交车上发回一份副本 - 保存大小写ID和价值 - 同时将其自身的副本状态改为"共享"。请求处理器接收该副本,该处理器将块写入其本地高速缓存并将其标记为"共享"。
如果拥有处理器发出的复制回到主存,则取决于实现。
编辑:注意MOESI协议添加一个"拥有"状态非常类似于"共享",并且允许处于拥有状态的块的副本的处理器在其捕获该块的广播写/读未命中时复制该总线上的值