当我使用 x86_64 CAS 指令时,然后只锁定一个高速缓存行或完全锁定 L3 高速缓存?
When I use the x86_64 CAS-instruction, then locked only one cache line or the L3-cache entirely?
当我使用x86_64 CAS指令LOCK CMPXCHG
时,即while atomic(读取值,比较并写回结果),此时被锁定的是:
- 三级缓存中只有一个缓存行? (此时没有一个核心不能read/write from/to L3中的这个缓存行)
- 或者完全是 L3 缓存?
(此时没有一个核心不能read/write from/to L3-cache)
x86_64 Intel CPU 使用的是真的吗?
- 高速缓存行独占状态的第一个方法 (MOESI/MESIF)
- 除独占之外的任何状态的二次方法
两者都不准确。第二个类似于总线锁上实际发生的情况,在现代 x86 CPU 中,当常规锁无法工作时,这是(希望如此)罕见且病态的情况。它在旧的 486 / 早期的 Pentium 上很常见,但在较新的产品上,常见的情况要简单得多 - 你将行锁定在缓存中,但由于你想尽可能快地进行读取 - 修改 - 写入 -在 L3 中这样做也没有意义。相反,您将选择最接近操作核心的高速缓存——可能是 L1 或某种等效的内部结构。
即使使用简单的 MESI,您也可以保证原子 RMW 在缓存中安全地完成 - 您首先获得该行的所有权(就像任何正常写入需要的那样),然后您可以在您执行原子流时执行肯定知道没有其他核心有这条线。唯一的问题是侦听在理论上可能会出现在中间,因此解决方案通常是简单地阻止对该线路的侦听,直到 RMW 完成。但是,在此期间允许任何其他 activity 没有问题(例如来自同一核心的其他请求,或进入的窥探。唯一的其他限制是关于内存排序,但这通常在内存中处理单元(仍然有顺序的概念)而不是在缓存中。
另请参阅此答案中的手册部分 - x86 LOCK question on multi-core CPUs
当我使用x86_64 CAS指令LOCK CMPXCHG
时,即while atomic(读取值,比较并写回结果),此时被锁定的是:
- 三级缓存中只有一个缓存行? (此时没有一个核心不能read/write from/to L3中的这个缓存行)
- 或者完全是 L3 缓存? (此时没有一个核心不能read/write from/to L3-cache)
x86_64 Intel CPU 使用的是真的吗?
- 高速缓存行独占状态的第一个方法 (MOESI/MESIF)
- 除独占之外的任何状态的二次方法
两者都不准确。第二个类似于总线锁上实际发生的情况,在现代 x86 CPU 中,当常规锁无法工作时,这是(希望如此)罕见且病态的情况。它在旧的 486 / 早期的 Pentium 上很常见,但在较新的产品上,常见的情况要简单得多 - 你将行锁定在缓存中,但由于你想尽可能快地进行读取 - 修改 - 写入 -在 L3 中这样做也没有意义。相反,您将选择最接近操作核心的高速缓存——可能是 L1 或某种等效的内部结构。
即使使用简单的 MESI,您也可以保证原子 RMW 在缓存中安全地完成 - 您首先获得该行的所有权(就像任何正常写入需要的那样),然后您可以在您执行原子流时执行肯定知道没有其他核心有这条线。唯一的问题是侦听在理论上可能会出现在中间,因此解决方案通常是简单地阻止对该线路的侦听,直到 RMW 完成。但是,在此期间允许任何其他 activity 没有问题(例如来自同一核心的其他请求,或进入的窥探。唯一的其他限制是关于内存排序,但这通常在内存中处理单元(仍然有顺序的概念)而不是在缓存中。
另请参阅此答案中的手册部分 - x86 LOCK question on multi-core CPUs