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

问题描述 投票:0回答:1

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

谢谢

c++ multithreading cpu atomic
1个回答
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架构师做得非常好。作为程序员,您应该测量代码性能。从我的角度来看:如果缓存线被锁定,则无需考虑会发生什么。您必须编写好的算法并考虑程序数据的良好内存组织以及线程之间的相互关系。

© www.soinside.com 2019 - 2024. All rights reserved.