9

我正在阅读MESI snooping cache coherence protocol,我猜这是现代多核 x86 处理器中使用的协议(如果我错了,请纠正我)。现在那篇文章在一个地方说了这一点。

保持处于修改状态的行的高速缓存必须侦听(拦截)相应主内存位置的所有尝试读取(来自系统中的所有其他高速缓存)并插入它所拥有的数据。这通常通过强制读取后退(即稍后重试),然后将数据写入主存储器并将高速缓存行更改为共享状态来完成。

现在我不明白的是为什么需要将数据写入主存储器。缓存一致性不能在不进入内存的情况下保持缓存中的内容同步(除非缓存行确实被驱逐了)?我的意思是,如果一个内核不断读取,另一个内核不断写入,为什么不将数据保留在缓存中,并不断更新缓存中的数据。为什么会产生回写到主存的性能?

换句话说,读取数据的核心不能直接从写入核心的缓存中读取并相应地修改他们的缓存吗?

4

5 回答 5

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 确实可能不太聪明。

于 2012-04-07T21:28:07.773 回答
3

MESI 协议不允许多个缓存将同一缓存行保持在一个modified状态。因此,如果一个高速缓存行被修改并想从其他处理器的高速缓存中读取,则必须先将其写入主存储器然后再读取,以便两个处理器的高速缓存现在都share在该行(共享状态)

于 2012-04-07T20:57:23.420 回答
2

因为缓存通常不能直接相互写入(因为这会占用更多带宽)。

于 2012-04-07T21:03:27.440 回答
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 现在都共享缓存线。

于 2012-04-07T20:56:36.477 回答
1

所以实际上我不认为读取缓存必须进入主内存。在 MESI 中,当一个处理器请求一个由它的对等体修改的块时,它会在总线(或任何互连介质)上发出读取未命中,该读取未命中将广播到每个处理器。

将块保持在“已修改”状态的处理器捕获调用,并在总线上发回一份副本 - 保存块 ID 和值 - 同时将其自己的副本状态更改为“共享”。请求处理器接收到这个复制回来,它将把块写入它的本地缓存并将其标记为“共享”。

由拥有的处理器发出的副本是否进入主存储器取决于实现。

编辑:请注意,MOESI 协议添加了一个与“共享”非常相似的“拥有”状态,并允许持有处于拥有状态的块副本的处理器在捕获广播时复制回总线上的值此块的写/读未命中。

于 2014-11-24T20:46:49.447 回答