pyt*_*nic 9 multithreading caching x86-64 multiprocessing mesi
我正在阅读有关MESI snooping缓存一致性协议的内容,我想这是现代多核x86处理器中使用的协议(如果我错了,请纠正我).现在那篇文章在一个地方说了这个.
保持处于Modified状态的行的高速缓存必须窥探(拦截)相应主存储器位置的所有尝试读取(来自系统中的所有其他高速缓存)并插入其保存的数据.这通常通过强制读取(即稍后重试),然后将数据写入主存储器并将高速缓存行更改为共享状态来完成.
现在我不明白为什么数据需要写在主存中.无法缓存一致性只是保持缓存中的内容同步而不进入内存(除非缓存行真的被逐出)?我的意思是如果一个核心不断读取而另一个核心不断写入,为什么不将数据保存在缓存中,并不断更新缓存中的数据.为什么会产生写回主存的性能?
换句话说,读取数据的核心是不是可以直接从写入核心的缓存中读取并相应地修改它们的缓存?
小智 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确实可以不那么聪明.
我不明白的是为什么数据需要写入主存
让我们的处理器 A 有这条modified线。现在,处理器 B 正尝试从主内存读取相同的高速缓存(由 A 修改)行。由于主存储器中的内容现在无效(因为 A 修改了内容),因此 A 正在监听该行的任何其他读取尝试。因此,为了允许处理器 B(和其他处理器)读取该行,A 必须将其写回主内存。
Run Code Online (Sandbox Code Playgroud)I mean if one core is constantly reading and the other constantly writing,为什么不将数据保留在缓存中,并不断更新缓存中的数据。
你是对的,这就是通常所做的。但在这里,情况并非如此。其他人(在我们的示例中是处理器 B)正在尝试读取。因此 A 必须将其写回并使缓存行状态为 ,shared因为 A 和 B 现在都共享缓存行。