原子操作有多贵?

时间:2015-09-15 16:32:35

标签: multithreading cpu atomic atomicity

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

很明显,原子操作可能比非原子操作慢,至少在不断的规模上。我担心的是其他CPU同步来执行原子操作。

我想知道核心A上的原子操作执行是否(如果和多少)影响其他核心的性能:

  1. 与核心A无关;
  2. 正在执行与核心A
  3. 相同进程的不同线程
  4. 正在执行原子操作
  5. 正在执行原子操作,并且正在执行与核心A相同的进程的不同线程
  6. 正在执行任何与内存相关的操作,即。加载,存储,...
  7. 正在相同的内存区域(缓存行,页面?)中执行与核心A
  8. 相关的任何内存相关操作

2 个答案:

答案 0 :(得分:3)

许多人认为原子操作很便宜。然而,它并非必然,因为原子操作是一种概括。有三种基本类型的原子操作:

  1. 原子保存
  2. 原子载荷
  3. Atomic CompareAndSet(递增/递减/等)
  4. 前两个通常或多或少便宜(或者,我们都知道,与英特尔的非原子朋友的成本完全相同)。它们确实存在内存障碍,但障碍只与执行它们的CPU相关,并且CPU正在努力使障碍有效。但是,第三个可能在竞争中并不那么便宜。 Atomic CAS和朋友实际上是在循环中进行操作,直到成功为止,因此在争用中可能需要很长时间才能执行操作。

答案 1 :(得分:3)

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

  

与核心A没有任何关系

没效果。

  

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

没效果。

  

正在执行原子操作

没效果。

  

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

没效果。

  

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

没效果。

  

正在同一内存区域(缓存行,页面?)中执行与内核A相关的任何内存相关操作

高速缓存行必须由执行原子操作的核心(从在其高速缓存中具有它的任何其他核心窃取它)专门获取,并且在原子操作完成到高速缓存之前不能被另一个核心访问和缓存间流量同步它,以便它在另一个核心中共享或独占。

原子操作的主要成本是执行原子指令的核心的管道。因为原子操作必须在一个明确定义的位置一次完成,所以它(大多数)不能与其他操作重叠。对于超标量CPU而言,这是一个巨大的代价,它通过在处理的各个阶段保持大量指令来提高性能。