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

时间:2019-03-09 09:03:22

标签: c++ multithreading cpu atomic

据我了解,原子操作(例如c ++原子)首先锁定高速缓存行,然后执行原子操作。我有两个问题:1.如果说原子比较和交换是硬件中的原子操作本身,为什么我们需要锁定高速缓存行;以及2.当高速缓存行被锁定时,另一个CPU如何等待它?它使用自旋锁样式等待吗?

谢谢

1 个答案:

答案 0 :(得分:1)

首先:取决于!

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

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

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

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

5。)锁定高速缓存行(如果确实发生这种情况)不应导致自旋锁或其他内核上的其他事情,因为对高速缓存行本身的访问仅花费了一些时钟周期。根据架构的不同,它只是简单地“持有”另一个内核一段时间。可能发生的情况是,“休眠”核心可以在其他管道中并行执行其他操作。但是,这是非常特定于硬件的。

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

除了锁定引擎盖外,还有很多其他功能。我相信您的问题只会在表面上出现!

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