当我使用x86_64 CAS指令时,只能完全锁定一个缓存行或L3缓存?

Ale*_*lex 3 concurrency multithreading x86-64 compare-and-swap cpu-cache

当我使用x86_64 CAS指令时LOCK CMPXCHG,即原子(读取值,比较并写回结果),此时锁定的内容:

  1. L3缓存中只有一个缓存行?(此时没有一个核心无法读取/写入L3中的此缓存行)
  2. 或L3缓存完全?(此时没有一个核心无法读取/写入L3缓存)

这是真的吗,x86_64 Intel CPU使用?

  • 独占缓存行状态(MOESI/MESIF)的1-aproach
  • 除了Exclusive之外的任何州的第二个方法

Lee*_*eor 6

两者都不准确.第二种类似于总线锁上实际发生的情况,在现代x86 CPU中,当常规锁无法工作时,这是一种(希望)罕见且病态的情况.它曾经在旧的486 /早期Pentiums上很常见,但在较新的产品上,常见的情况要简单得多 - 你将线路锁定在缓存中,但是因为你想尽可能快地进行读取 - 修改 - 写入 - 在L3中这样做也没有意义.相反,您将选择最接近操作核心的缓存 - 可能是L1或某些等效的内部结构.

即使使用简单的MESI,您也可以保证原子RMW在缓存中安全地完成 - 您首先获得该行的所有权(就像任何正常的写入所需),然后当您确定不知道没有时,您可以执行原子流其他核心有这条线.唯一的问题是窥探可能在理论上处于中间位置,因此解决方案通常只是阻止此行的窥探直到RMW完成.但是,在此期间允许任何其他活动没有问题(例如来自同一核心的其他请求,或窥探进入.唯一的另一个限制是关于内存排序,但通常在内存单元中处理(其中有仍然是一个秩序的概念)而不是在缓存.

另请参阅本答案中的手册部分- 多核CPU上的x86 LOCK问题