首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原子操作有多昂贵?

原子操作有多昂贵?
EN

Stack Overflow用户
提问于 2015-09-15 16:32:34
回答 2查看 3.8K关注 0票数 9

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

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

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

  1. 与核心A无关
  2. 正在执行与核心A相同进程的不同线程。
  3. 正在执行原子操作
  4. 正在执行原子操作,并且正在执行与核心A相同进程的不同线程。
  5. 正在执行任何与内存相关的操作,即。装载,储存,..。
  6. 是否在同一内存区域(缓存行、页)执行任何与内存相关的操作?作为核心A
EN

回答 2

Stack Overflow用户

发布于 2015-09-15 16:55:08

许多人认为原子操作很便宜。然而,由于原子操作是一种推广,所以它不一定是正确的。原子操作有三种基本类型:

  1. 原子保存
  2. 原子负载
  3. 原子CompareAndSet (增量/递减/等)

前两者通常都比较便宜(或者,我们都知道,它们的成本与英特尔上的非原子朋友完全一样)。它们确实设置了内存屏障,但这些障碍只与执行它们的CPU相关,CPU正在努力提高屏障的效率。然而,在争论中,第三种可能并不便宜。原子CAS和朋友实际上在循环中执行操作,直到成功为止,因此在争用时执行操作可能需要大量时间。

票数 6
EN

Stack Overflow用户

发布于 2016-02-26 08:38:19

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

与核心A无关

没有效果。

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

没有效果。

正在执行原子操作

没有效果。

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

没有效果。

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

没有效果。

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

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32591204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档