个月协议的缓存(MESI cache protocol)

2019-09-16 10:22发布

我正在读关于MESI监听高速缓存一致性协议 ,这是我的猜测是,在现代多核x86处理器所使用的协议(请纠正我,如果我错了)。 现在,文章在一个地方说这个。

其保持线修正的状态的高速缓存必须探听(截距)所有尝试的读取(从系统中的所有其它高速缓存的)对应的主存储器位置的,并插入数据,它保持。 这通常是通过迫使读取到回退(即,重试后),然后将数据写入到主存储器并改变高速缓存线变为共享状态来完成。

现在我不明白的是,为什么需要数据在主存储器写入。 不能高速缓存一致性只是不断在高速缓存中的内容同步,而不要去内存(除非高速缓存行是真正ofcourse驱逐)? 我的意思是,如果一个核心,就是不断地阅读和其他不断写作,为什么不保持在高速缓冲存储器中的数据,并保存在缓存中更新数据。 为什么招致写回主存储器的性能?

换句话说,无法读取数据的核心,直接从写作核心的缓存中读取,并相应修改其缓存?

Answer 1:

现在我不明白的是,为什么需要数据在主存储器写入。 不能高速缓存一致性只是不断在高速缓存中的内容同步,而不要去内存(除非高速缓存行是真正ofcourse驱逐)?

这不会发生。

我有我的笔记本电脑的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确实可能的事情一样聪明。



Answer 2:

MESI协议不允许多于一个高速缓存保持相同的高速缓存线处于modified状态。 所以,如果一个高速缓存行被修改,并希望从其他processor's缓存读取,那么它必须首先写入主存储器中,然后阅读,这样既processor's缓存现在share该行(共享状态)



Answer 3:

因为高速缓冲存储器通常不是能够直接写入到彼此(因为这将需要更多的带宽)。



Answer 4:

我不明白的是,为什么需要数据在主存储器写入

让我们处理器中的有modified线。 现在处理器B被试图读取同一高速缓存(通过改进的)线从主存储器中。 由于在主存储器中的内容现在是无效的(因为A修改内容),A的窥探该行的任何其他尝试读取。 因此,为了允许处理器B(和其他)来读取该行,A具有将它写回主存储器。

 I mean if one core is constantly reading and the other constantly writing, 

为什么不保持在高速缓冲存储器中的数据,并保存在缓存中更新数据。

你是正确的,这就是通常做。 但在这里,这是情况并非如此。 别人(处理器B在我们的例子中)正在努力读书。 所以必须写回并使缓存行状态shared ,因为A和B现在共享高速缓存行。



Answer 5:

所以,其实我不认为读缓存已去到主内存。 在MESI,当处理器请求由它的对等体的一个经修饰的一个块时,它发出总线(或任何互连培养基),这些被广播到每一个处理器上的读未命中。

其持有的“修改”状态的块处理器赶上呼叫,并出具一份回到了巴士 - 拿着块ID和价值 - 而改变其对“共享”自己的副本状态。 此副本回来由请求处理器接收到的,在它的本地高速缓存,这将写入块将其标记为“共享”。

这取决于是否执行由所属的处理器回发的副本保存到主内存,还是不行。

编辑:注意,MOESI协议添加一个“拥有的”状态,这是非常相似的“共享”,并且允许处理器保持一个块的一个副本,在占用状态,该值在总线上拷贝回来,如果它捕获一广播读/写错过该块。



文章来源: MESI cache protocol