作者:phpxiaofei | 来源:互联网 | 2023-05-26 10:00
当我使用x86_64 CAS指令时LOCK CMPXCHG
,即原子(读取值,比较并写回结果),此时锁定的内容:
L3缓存中只有一个缓存行?(此时没有一个核心无法读取/写入L3中的此缓存行)
或L3缓存完全?(此时没有一个核心无法读取/写入L3缓存)
这是真的吗,x86_64 Intel CPU使用?
独占缓存行状态(MOESI/MESIF)的1-aproach
除了Exclusive之外的任何州的第二个方法
Leeor..
6
两者都不准确.第二种类似于总线锁上实际发生的情况,在现代x86 CPU中,当常规锁无法工作时,这是一种(希望)罕见且病态的情况.它曾经在旧的486 /早期Pentiums上很常见,但在较新的产品上,常见的情况要简单得多 - 你将线路锁定在缓存中,但是因为你想尽可能快地进行读取 - 修改 - 写入 - 在L3中这样做也没有意义.相反,您将选择最接近操作核心的缓存 - 可能是L1或某些等效的内部结构.
即使使用简单的MESI,您也可以保证原子RMW在缓存中安全地完成 - 您首先获得该行的所有权(就像任何正常的写入所需),然后当您确定不知道没有时,您可以执行原子流其他核心有这条线.唯一的问题是窥探可能在理论上处于中间位置,因此解决方案通常只是阻止此行的窥探直到RMW完成.但是,在此期间允许任何其他活动没有问题(例如来自同一核心的其他请求,或窥探进入.唯一的另一个限制是关于内存排序,但通常在内存单元中处理(其中有仍然是一个秩序的概念)而不是在缓存.
另请参阅本答案中的手册部分- 多核CPU上的x86 LOCK问题
1> Leeor..:
两者都不准确.第二种类似于总线锁上实际发生的情况,在现代x86 CPU中,当常规锁无法工作时,这是一种(希望)罕见且病态的情况.它曾经在旧的486 /早期Pentiums上很常见,但在较新的产品上,常见的情况要简单得多 - 你将线路锁定在缓存中,但是因为你想尽可能快地进行读取 - 修改 - 写入 - 在L3中这样做也没有意义.相反,您将选择最接近操作核心的缓存 - 可能是L1或某些等效的内部结构.
即使使用简单的MESI,您也可以保证原子RMW在缓存中安全地完成 - 您首先获得该行的所有权(就像任何正常的写入所需),然后当您确定不知道没有时,您可以执行原子流其他核心有这条线.唯一的问题是窥探可能在理论上处于中间位置,因此解决方案通常只是阻止此行的窥探直到RMW完成.但是,在此期间允许任何其他活动没有问题(例如来自同一核心的其他请求,或窥探进入.唯一的另一个限制是关于内存排序,但通常在内存单元中处理(其中有仍然是一个秩序的概念)而不是在缓存.
另请参阅本答案中的手册部分- 多核CPU上的x86 LOCK问题