原子操作的成本是多少?

2023-11-23

原子操作(任何比较和交换或原子加/减)的成本是多少?消耗多少周期?它会暂停 SMP 或 NUMA 上的其他处理器,还是会阻止内存访问? 它会刷新乱序 CPU 中的重新排序缓冲区吗?

对缓存会有什么影响?

我对现代流行的 CPU 感兴趣:x86、x86_64、PowerPC、SPARC、Itanium。


这几天我查了一些实际数据,但一无所获。 不过,我做了一些研究,将原子操作的成本与缓存未命中的成本进行了比较。

x86 LOCK 前缀的成本(包括lock cmpxchg对于原子CAS),在PentiumPro之前(如文档中所述),是内存访问(如高速缓存未命中),+停止其他处理器的内存操作,+与试图锁定总线的其他处理器的任何争用。然而,从 PentiumPro 开始,对于正常的 Writeback 可缓存内存(应用程序处理的所有内存,除非直接与硬件对话),不是阻止所有内存操作,而是仅阻止相关的缓存行(基于中的链接)@osgx 的回答).

即,核心延迟响应该线路的 MESI 共享和 RFO 请求,直到存储实际的部分之后。lock编辑操作。这称为“高速缓存锁”,并且仅影响该高速缓存行。其他核心可以同时加载/存储甚至CASing其他线。


实际上,CAS 情况可能更复杂,如上所解释的这一页,没有时间限制,但由值得信赖的工程师进行了富有洞察力的描述。 (至少对于在实际 CAS 之前执行纯加载的正常用例来说是这样。)

在讨论太多细节之前,我会说锁定操作的成本是一次缓存未命中+与同一缓存行上的其他处理器可能发生的争用,而CAS+前面的加载(几乎总是需要的,除了互斥锁,在互斥锁上你总是需要这样做) CAS 0 和 1) 可能会导致两次高速缓存未命中。

他解释说,单个位置上的加载 + CAS 实际上可能会导致两次缓存未命中,例如加载链接/条件存储(请参阅此处了解后者)。他的解释依赖于知识MESI缓存一致性协议。它对缓存行使用 4 种状态:已修改 (Modified)、独占 (Exclusive)、共享 (Shared)、I(nvalid)(因此称为 MESI),下面将根据需要进行解释。场景解释如下:

  • LOAD 导致缓存未命中 - 相关缓存行在共享状态下从内存加载(即仍然允许其他处理器将该缓存行保留在内存中;在此状态下不允许进行任何更改)。如果该位置在内存中,则跳过此高速缓存未命中。可能的成本:1 次缓存未命中。(如果缓存行处于共享、独占或修改状态,即数据位于该 CPU 的 L1 缓存中,则跳过)。
  • 程序计算要存储的新值,
  • and it runs an atomic CAS instruction.
    • 它必须避免并发修改,因此必须从其他CPU的缓存中删除缓存行的副本,以将缓存行移动到独占状态。可能的成本:1 次缓存未命中。如果它已经是独占的,即处于独占或修改状态,则不需要这样做。在这两种状态下,没有其他 CPU 持有高速缓存行,但在独占状态下,它尚未被修改。
    • 在这次通信之后,变量在我们的 CPU 的本地缓存中被修改,此时它对所有其他 CPU 都是全局可见的(因为它们的缓存与我们的缓存是一致的)。最终会按照通常的算法写入主存。
    • 尝试读取或修改该变量的其他处理器首先必须以共享或独占模式获取该缓存行,并且这样做将联系该处理器并接收缓存行的更新版本。 相反,锁定操作只会导致缓存未命中(因为将在独占状态下直接请求缓存行)。

在所有情况下,缓存行请求都可能被其他已经修改数据的处理器所阻止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原子操作的成本是多少? 的相关文章

  • 加快 pandas groupby 中的滚动总和计算

    我想按组计算大量组的滚动总和 但我很难快速地完成它 Pandas 内置了滚动和展开计算器的方法 这是一个例子 import pandas as pd import numpy as np obs per g 20 g 10000 obs g
  • 代表和结构的速度问题

    我遇到了一些与结构和委托有关的速度问题 采用以下控制台应用程序代码 public delegate string StringGetter public class LocalString public LocalString string
  • SQL 中的 JOIN 成本有多高?和/或,性能和标准化之间的权衡是什么?

    我发现了一个类似的线程 但它并没有真正抓住我想要问的本质 所以我创建了一个新线程 我知道规范化和性能之间存在权衡 我想知道划定这条线的最佳实践是什么 在我的特定情况下 我有一个消息传递系统 它具有三个不同的表 messages thread
  • 有效地从 2 个数据帧中查找日期时间范围的重叠

    关于查找日期或时间范围的重叠存在一些问题 例如 https stackoverflow com questions 9044084 efficient date range overlap calculation in python 我用这
  • 为什么 pow(int, int) 这么慢?

    我一直在做一些项目欧拉练习来提高我的 C 知识 我写了以下函数 int a 0 b 0 c 0 for a 1 a lt SUMTOTAL a for b a 1 b lt SUMTOTAL a b c SUMTOTAL a b if c
  • 样式组件如何影响性能?

    使用样式组件是否比样式表更会降低 Web 应用程序的速度 如果我关心性能并且没有任何依赖于 props 的样式 我是否应该放弃样式组件并使用样式表 当您有很多小组件时 同时使用样式化组件渲染 性能开销可能会很有意义 绝对值得测试以删除小元素
  • 慢 Eclipse Spring STS 插件

    我是 Spring 新手 安装了 Eclipse STS 插件 使用服务似乎非常慢 CPU 使用率激增 笔记本电脑只会变热 实际上风扇就像喷气发动机一样运行 直接响应服务的启动 停止 虽然下面的内容确实为我解决了 Spring STS 的所
  • isinstance(foo,types.GeneratorType)还是inspect.isgenerator(foo)?

    Python中似乎有两种方法来测试一个对象是否是生成器 import types isinstance foo types GeneratorType or import inspect inspect isgenerator foo 本着
  • STL 容器速度与数组

    我刚刚开始从事一个科学项目 其中速度非常重要 HPC 我目前正在设计数据结构 该项目的核心是双值 3D 网格 以求解偏微分方程 由于这里的速度可能比代码的简单性更重要 我想知道 STL 与通常的 C 风格数组相比如何执行 就我而言 因为它是
  • 使用map.get()时使用java Map.containsKey()是多余的

    一段时间以来 我一直想知道在最佳实践中是否允许避免使用containsKey 方法上java util Map而是对结果进行空检查get 我的理由是 两次查找值似乎是多余的 首先是查找containsKey 然后再次为get 另一方面 大多
  • 空 while 循环有什么影响?

    我知道这可能是一个有点 愚蠢 的问题 但有时 我只想循环直到条件为假 但我不喜欢让循环保持为空 所以代替 Visible true while IsRunning Visible false 我通常prefer while IsRunnin
  • 原始类型是易失性的还是同步的?

    在 Java 中 如果变量的大小小于或等于 32 位 则赋值是原子的 但如果变量的大小大于 32 位 则赋值不是原子的 在双重或长分配的情况下 使用什么 易失性 同步 会更有效 Like volatile double x y 同步不适用于
  • 如何找到 IIS 在负载/性能测试期间模拟的平均并发用户数?

    我正在使用 JMeter 进行负载测试 我正在练习通过简单地增加我的分布式 JMeter 测试用例中的线程数并启动测试来查找我们的网络服务器可以处理的最大并发线程 用户 数量 然后 我突然意识到 虽然 MAX 数字可能有用 但REAL我的网
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • 在Python列表中交换元素的最快方法

    在Python中交换两个列表元素是否有比 L a L b L b L a 或者我必须求助于Cython http cython org or Weave http www scipy org Weave或类似的 看起来 Python 编译器
  • fetchsize和batchsize对Spark的影响

    我想通过以下方式控制 RDB 的读写速度Spark直接 但标题已经透露的相关参数似乎不起作用 我可以得出这样的结论吗fetchsize and batchsize我的测试方法不起作用 或者它们确实会影响阅读和写作方面 因为测量结果基于规模是
  • jQuery mousemove 性能 - 节流事件?

    我们面临着与 mousemove 连接的 jQuery 事件传播性能问题 我们有一个屏幕填充画布 需要跟踪用户是否在其上拖动鼠标 因此我们在该对象上添加了一个鼠标移动侦听器 如下所示 ourCanvas on mousemove funct
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 优化我的表现

    我正在开发一个使用 Zend Framework 1 11 Doctrine 2 一些 Symfony 2 组件以及其他工具和库的项目 我正在尝试使用 Xdebug 和 Webgrind 优化性能 我已经发现了一些瓶颈 例如解析 Ini 配
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i

随机推荐