Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading MESI缓存协议_Multithreading_Caching_Multiprocessing_X86 64_Mesi - Fatal编程技术网

Multithreading MESI缓存协议

Multithreading MESI缓存协议,multithreading,caching,multiprocessing,x86-64,mesi,Multithreading,Caching,Multiprocessing,X86 64,Mesi,我在读关于的,我想这是现代多核x86处理器中使用的协议(如果我错了,请纠正我)。现在那篇文章在一个地方这样说 保存处于修改状态的行的缓存必须侦听(截取)所有行 尝试读取(从系统中的所有其他缓存)的 对应的主存位置,并插入其保存的数据。这是 通常通过强制读取退出(即稍后重试),然后写入来完成 将数据传输到主存,并将缓存线更改为共享状态 现在我不明白的是为什么数据需要写入主内存。难道缓存一致性不能让缓存中的内容保持同步而不进入内存吗(当然,除非缓存线确实被逐出)?我的意思是,如果一个内核不断地读取,

我在读关于的,我想这是现代多核x86处理器中使用的协议(如果我错了,请纠正我)。现在那篇文章在一个地方这样说

保存处于修改状态的行的缓存必须侦听(截取)所有行 尝试读取(从系统中的所有其他缓存)的 对应的主存位置,并插入其保存的数据。这是 通常通过强制读取退出(即稍后重试),然后写入来完成 将数据传输到主存,并将缓存线更改为共享状态

现在我不明白的是为什么数据需要写入主内存。难道缓存一致性不能让缓存中的内容保持同步而不进入内存吗(当然,除非缓存线确实被逐出)?我的意思是,如果一个内核不断地读取,而另一个内核不断地写入,为什么不将数据保存在高速缓存中,并不断更新高速缓存中的数据呢。为什么要执行写回主内存的操作

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

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

让我们把处理器A的
行修改一下。现在处理器B正试图从主内存中读取相同的缓存(由A修改)。由于主存中的内容现在无效(因为A修改了内容),所以A会窥探该行的任何其他读取尝试。因此,为了允许处理器B(和其他处理器)读取该行,A必须将其写回主存

为什么不将数据保存在缓存中,并不断更新缓存中的数据呢


你是对的,这就是通常所做的。但在这里,情况并非如此。其他人(本例中的处理器B)正在尝试读取。因此,A必须将其写回并将缓存线状态设置为“共享”,因为A和B现在都在共享缓存线。

MESI协议不允许多个缓存将同一缓存线保持在“已修改”状态。因此,如果一个缓存线被修改并希望从其他处理器的缓存中读取,那么必须先将其写入主内存,然后再读取,这样两个处理器的缓存现在共享该缓存线(共享状态)

,因为缓存通常无法直接写入彼此(因为这将占用更多带宽)

现在我不明白的是为什么数据需要写入主内存。伪善说教 缓存一致性只是使缓存中的内容保持同步,而无需 内存(当然,除非缓存线确实被逐出)

这确实发生了

我的笔记本电脑上有一个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在处理事情上可能就不那么聪明了。

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

将块保持在“修改”状态的处理器捕获调用,并在总线上发出一个副本(保存块ID和值),同时将其自身的副本状态更改为“共享”。请求处理器接收此副本,将块写入其本地缓存并将其标记为“共享”

这取决于所属处理器发出的拷贝是否进入主内存


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

我所说的不写入内存的意思是,我们不能这样做,即缓存一致性机制从写入内核的缓存中读取数据,并将其传递给读取它的人。是否有必要先在内存中写入,然后再从内存中读取。读内核不能直接从写内核的缓存中读取吗?修改后的行只能由处理器保留,只要它是唯一具有此副本(MESI)的处理器。你说的做不到,因为它更贵。假设A和B都共享该行,B直接从A的缓存线获取该行,而其他人(例如C)需要该行进行写操作,那么A和B都将一直监视该行。随着共享副本的增加,由于所有“共享”处理器都进行了窥探,因此它将对性能产生更大的影响。这就是为什么不这样做。此外,MESI使用写回缓存尽可能减少对主内存的写回。
   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