Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么原子操作需要独占缓存访问? 在我理解原子操作时,例如C++原子首先锁定高速缓存行,然后执行原子操作。我有两个问题:1。如果说原子比较和交换是硬件中的原子操作本身,那么为什么我们需要锁定缓存线和2。当缓存线被锁定时,另一个cpu如何等待它?它是否使用旋转锁式等待_C++_Multithreading_Cpu_Atomic - Fatal编程技术网

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

为什么原子操作需要独占缓存访问? 在我理解原子操作时,例如C++原子首先锁定高速缓存行,然后执行原子操作。我有两个问题:1。如果说原子比较和交换是硬件中的原子操作本身,那么为什么我们需要锁定缓存线和2。当缓存线被锁定时,另一个cpu如何等待它?它是否使用旋转锁式等待,c++,multithreading,cpu,atomic,C++,Multithreading,Cpu,Atomic,谢谢首先,这要看情况而定 一,。如果系统锁定高速缓存行与C++无关。这是一个如何组织缓存的问题,尤其是汇编指令如何与缓存一起工作的问题。这是cpu架构的问题 二,。编译器如何执行原子操作取决于实现。将生成哪些汇编指令来执行原子操作可能会因编译器而异,甚至在不同版本上也会有所不同 三,。正如我所知,如果不能对访问同一缓存线的其他内核执行更聪明的通知/同步,那么缓存线的完全锁定只是一种后备解决方案。但通常不仅仅涉及单个缓存。想想多级缓存体系结构。某些缓存仅对单个核心可见!因此,还需要执行更多的内存系

谢谢

首先,这要看情况而定

一,。如果系统锁定高速缓存行与C++无关。这是一个如何组织缓存的问题,尤其是汇编指令如何与缓存一起工作的问题。这是cpu架构的问题

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

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

四,。从C++的角度看,原子运算不仅仅是一个运算。真正发生的事情取决于原子操作的内存排序选项。由于原子操作通常用于线程间同步,因此对于单个原子RMW操作,必须做更多的事情!要想知道必须做什么,你应该给一个机会。它详细介绍了记忆障碍和记忆顺序

五,。如果真的发生这种情况,锁定缓存线不应在其他内核上导致自旋锁或其他事情,因为对缓存线本身的访问只需要一些时钟周期。根据体系结构的不同,它只是将另一个内核保存一些周期。在不同的管道中,休眠堆芯可能会并行执行其他操作。但是,嘿,这是非常具体的硬件

正如已经作为注释给出的:看一看,它给出了一些关于缓存一致性和锁定的提示

这不仅仅是在引擎盖下锁定。我相信你的问题只触及表面


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

您读过这篇文章吗:对于多核,原子更改必须对每个核有效。由于另一个内核可能缓存了相同的存储,因此它必须使该存储失效,以允许它看到更改。嗯,这是一个H/W问题,具体如何做。我不确定C++是否与此相关,除了它确实提供了STD::原子,如果有可用的话,可以访问H/W特性。请注意,如果H/W锁不适用于锁定类型,std::atomic可能会退回到其他锁定。这种思维模式有点过于简单,无法真正取得进展,但处理器制造商将其内存控制器视为商业秘密,因此并没有很多方法使其更准确。每个处理器都有一种方法,可以用一组特定的指令来自动更新内存。这就是std::atomic使用这些指令所做的一切。当这样的更新正在进行时,其他内核肯定会被暂停,这可能会有点不走运。或者写非最佳代码。我只是想知道,当硬件的原子操作本身就是原子操作时,为什么需要独占缓存线访问。。。