Multithreading 原子操作有多昂贵?

Multithreading 原子操作有多昂贵?,multithreading,cpu,atomic,atomicity,Multithreading,Cpu,Atomic,Atomicity,我正在深入研究多线程编程,并考虑使用原子操作进行无锁引用计数 很明显,原子操作可能比非原子操作慢,至少在恒定范围内是这样。我担心的是执行原子操作的其他CPU同步 我想知道在core A上执行原子操作是否(如果,以及在多大程度上)会影响其他core的性能: 与核心A无关 正在执行与核心A相同进程的不同线程 正在执行原子操作 正在执行原子操作,并且正在执行与核心A相同进程的不同线程 正在执行任何与内存相关的操作,即加载、存储 是否在与核心相同的内存区域(缓存线、页面?)中执行任何与内存相关的操作 许

我正在深入研究多线程编程,并考虑使用原子操作进行无锁引用计数

很明显,原子操作可能比非原子操作慢,至少在恒定范围内是这样。我担心的是执行原子操作的其他CPU同步

我想知道在core A上执行原子操作是否(如果,以及在多大程度上)会影响其他core的性能:

  • 与核心A无关
  • 正在执行与核心A相同进程的不同线程
  • 正在执行原子操作
  • 正在执行原子操作,并且正在执行与核心A相同进程的不同线程
  • 正在执行任何与内存相关的操作,即加载、存储
  • 是否在与核心相同的内存区域(缓存线、页面?)中执行任何与内存相关的操作

  • 许多人认为原子能操作很便宜。然而,这不一定是真的,因为原子操作是一种推广。原子操作有3种基本类型:

  • 原子拯救
  • 原子负荷
  • 原子比较数据集(递增/递减/etc)

  • 前两个通常或多或少便宜(或者,我们都知道,它们的成本与它们在英特尔的非原子朋友完全相同)。它们确实会设置内存障碍,但这些障碍只与执行它们的CPU有关,CPU正在努力使这些障碍更有效。然而,在争论中,第三种可能并不便宜。原子CA和friends实际上在循环中执行操作,直到成功,因此在争用情况下执行操作可能需要相当长的时间。

    我将原子读修改写操作与现代x86 CPU上相应的非原子操作进行比较

    与核心A无关

    没有效果

    正在执行与核心A相同进程的不同线程

    没有效果

    正在执行原子操作

    没有效果

    正在执行原子操作,并且正在执行与核心A相同进程的不同线程

    没有效果

    正在执行任何与内存相关的操作,即加载、存储

    没有效果

    是否在与核心相同的内存区域(缓存线、页面?)中执行任何与内存相关的操作

    缓存线必须由执行原子操作的内核独占获取(从缓存中有缓存线的任何其他内核中窃取),并且在原子操作完成以缓存和缓存间通信同步之前,另一个内核无法访问该缓存线,以使其在另一个内核中共享或独占

    原子操作的主要成本是执行原子指令的核心管道。因为原子操作必须在一个定义明确的地方同时进行,所以它(大部分)不能与其他操作重叠。对于超标量CPU来说,这是一个巨大的惩罚,它通过在不同的处理阶段保留大量指令来获得性能。

    可能的重复