我读到了关于MESI窥探缓存一致性协议的文章,我猜这是现代多核x86处理器中使用的协议(如果我错了,请纠正我)。现在这篇文章是在一个地方写的。
在修改状态下保存一行的缓存必须窥探(截取)所有尝试读取(从系统中所有其他缓存中读取)相应的主内存位置,并插入它所保存的数据。这通常是通过迫使read退出(即稍后重试),然后将数据写入主内存,并将缓存行更改为共享状态来完成的。
现在我不明白的是,为什么需要在主内存中写入数据。缓存一致性不能使缓存中的内容保持同步而不进入内存(当然,除非缓存行被真正逐出)?我的意思是,如果一个内核一直在读取,而另一个内核一直在写,为什么不将数据保存在缓存内存中,并不断更新缓存中的数据呢?为什么要产生写回主内存的性能?
换句话说,核心不能读取数据,直接从写核心的缓存读取并相应地修改它们的缓存吗?
发布于 2012-04-07 21:28:07
现在我不明白的是,为什么需要在主内存中写入数据。缓存一致性不能使缓存中的内容保持同步而不进入内存(当然,除非缓存行被真正逐出)?
这确实发生了。
我的笔记本电脑上有一个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-07 20:57:23
MESI协议不允许多个缓存保持相同的modified状态。因此,如果一条缓存行被修改,并希望从其他处理器的缓存中读取,那么首先必须将其写入主存,然后再读取,这样两个处理器的缓存现在都会share这一行(共享状态)。
发布于 2012-04-07 21:03:27
因为缓存通常不能直接写入对方(因为这将占用更多的带宽)。
https://stackoverflow.com/questions/10058243
复制相似问题