为什么原子操作需要独占缓存访问?

Why does atomic operation need exclusive cache access?

在我的理解中,原子操作(例如c++ atomic)是先锁定缓存行,然后再进行原子操作。我有两个问题:1. 如果我们说原子比较和交换本身在硬件中是原子操作,为什么我们需要锁定缓存行和 2. 当缓存行被锁定时,另一个 cpu 如何等待它?它使用自旋锁式等待吗?

谢谢

首先:视情况而定!

1.) 如果系统锁定缓存行与c++无关。这是一个缓存如何组织的问题,尤其是汇编程序指令如何与缓存一起使用。这是 cpu 架构的问题!

2.) 编译器如何执行原子操作取决于实现。将生成哪些汇编程序指令来执行原子操作可能因编译器而异,甚至在不同版本上也不同。

3.) 据我所知,如果无法执行访问相同缓存行的其他内核的 "more clever" notification/synchronization,缓存行的完全锁定只是后备解决方案。但是通常不仅仅涉及单个缓存。想想多级缓存架构。有些缓存只对单个内核可见!因此,需要执行更多的内存系统操作,如锁定一行。如果涉及多个内核,您还必须从不同的缓存级别移动数据!

4.) 从c++的角度来看,原子操作不仅仅是一个单一的操作。真正会发生什么取决于原子操作的内存排序选项。由于原子操作经常用于线程间同步,因此对于单个原子 RMW 操作必须做更多的事情!要了解所有必须完成的工作,您应该给 https://www.cplusplusconcurrencyinaction.com/ 一个机会。它详细介绍了内存屏障和内存排序。

5.) 锁定高速缓存行(如果确实发生这种情况)不应导致自旋锁或其他内核上的其他问题,因为对高速缓存行本身的访问只需要一些时钟周期。根据架构,它只是 "holds" 另一个核心一些周期。 "sleeping" 核心可能会在不同的管道中并行执行其他事情。但是,嘿,这是非常特定于硬件的。

正如已经给出的评论:看一下 https://fgiesen.wordpress.com/2014/08/18/atomics-and-contention/,它给出了缓存一致性和锁定会发生什么的一些提示。

引擎盖下的锁定功能远不止于此。我相信你的问题只是表面上的问题!

实际使用:别想了!编译器供应商和 cpu 架构师做得很好。作为程序员,您应该衡量您的代码性能。从我的角度来看:无需考虑如果缓存行被锁定会发生什么。您必须编写好的算法并考虑程序数据的良好内存组织和线程之间的较少相互关系。