现代 CPU 保持标志更新是否需要花费大量资源?

2023-12-03

据我了解,在现代无序 CPU 上,最昂贵的东西之一是状态,因为必须在多个版本中跟踪该状态,在许多指令中保持最新状态等。

一些指令集(例如 x86 和 ARM)大量使用标志,这些标志是在成本模型不是现在的样子时引入的,并且标志只花费几个逻辑门。比如每个算术指令都会设置标志来检测零、进位和溢出。

在现代无序实施中保持更新是否特别昂贵?例如ADD 指令更新进位标志,必须跟踪这一点,因为尽管它会probably永远不会被使用,它是possible其他指令可以在 N 条指令之后使用它,而 N 没有固定的上限?

在没有这些标志的 MIPS 等指令集架构上,加法和减法等整数运算是否更便宜?


这件事的各个方面都不是很为公众所知,所以我会尝试将明确已知的事情与合理的猜测和猜想分开。

一种方法是使用操作生成的标志来扩展(物理)整数寄存器(无论它们采用物理寄存器文件的形式[例如P4和SandyBridge+]还是ROB结果[例如P3]的形式)这也产生了相关的整数结果。这只是关于算术标志(有时是 AFLAGS,不要与 EFLAGS 混淆),但我不认为“奇怪的标志”是这个问题的焦点。有趣的是,有一项专利[1]这暗示存储的不仅仅是 6 个 AFLAGS 本身,还在那里放置了一些“组合标志”,但谁知道这是否真的完成了 - 大多数消息来源都说寄存器扩展了 6 位,但据我所知,我们(公众)不really知道。例如,本专利描述了将整数结果和相关标志集中在一起[2],这主要是为了防止出现某种情况,即标志可能意外地不再受到任何物理寄存器的支持。除了这些怪癖之外,在正常操作期间,它的一个很好的效果是只需要为算术运算分配 1 个寄存器,而不是单独的主结果和标志结果,因此重命名通常不会因为存在旗帜。此外,寄存器别名表至少需要一个槽来跟踪哪个整数寄存器包含最新的标志,或者一个单独的标志重命名状态缓冲区跟踪最新的推测标志状态([2]建议英特尔选择将它们分开,这可能会简化主要的 RAT,但他们不会详细讨论这些细节)。可以使用更多插槽[3]有效地实现仅更新标志子集的指令(NetBurst™众所周知缺乏这一点,导致现在过时的建议值得青睐add over inc)。同样,非推测的架构状态(无论是part of退休寄存器文件或再次分离但相似尚不清楚)需要至少一个这样的插槽。

一个单独的问题是首先计算标志。[1]建议将标志生成与主 ALU 分开以简化设计。目前尚不清楚它们将被分离到何种程度:无论如何,主 ALU 必须计算调整和符号标志,并且让加法器输出进位顶部并没有什么要求(比从无到有重新计算要少)​​。溢出标志仅需要一个额外的异或门来将最高位的进位与最高位的进位组合起来。不过,零标志和奇偶校验标志并不是免费的(它们依赖于结果,不在计算结果的一部分),如果存在部分分离,那么单独计算它们是有意义的。也许一切真的都是分开的。在 NetBurst™ 中,标志计算需要额外的半周期(ALU 是双泵浦且交错的)[4],但这是否意味着all标志是单独计算的,或者是它们的子集(甚至是超集,如[1]提示)尚不清楚 - 标志结果被视为整体,因此延迟测试无法区分标志是由标志单元在第三个半周期中计算的还是仅由 ALU 交给标志单元。在任何情况下,典型的 ALU 操作都可以连续执行,即使是相关的(意味着第一个操作的高半部分和第二个操作的低半部分并行运行),标志的延迟计算也不会执行。阻碍这一点。正如你所预料的那样,ADC and SBB在 NetBurst 上效率不高,但也可能有其他原因(由于某种原因涉及大量 µop)。

总的来说,我得出的结论是,算术标志的存在花费了大量的工程资源来防止它们对性能产生重大影响,但这种努力也是有效的,因此避免了重大影响。

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

现代 CPU 保持标志更新是否需要花费大量资源? 的相关文章

  • Mono 实现 CLR 吗?或者至少有一些非托管的内部调用?或无?

    我们知道 C 使用非托管代码 如 P Invoke 或 CLR 实现的代码 如 InternalCall 我想知道的是 mono 它自己实现了一个完整的 CLR 还是只是一些非托管代码或者什么都没有 我可以使用 Net Reflactor或
  • 应用程序在加载 xml 布局文件的主线程中做了太多工作

    我正在制作一个 9x9 数独网格 其中 81 个单元格本身就是一个 3x3 网格 单个细胞看起来像这样 1 2 3 4 5 6 7 8 9 每个数字代表该单元格的铅笔注释 我有一个名为 cell layout xml 的文件 表示这种 3x
  • LEFT JOIN 比 INNER JOIN 快得多

    我有一张桌子 MainTable 有超过 600 000 条记录 它通过第二个表连接到自身 JoinTable 在父 子类型关系中 SELECT Child ID Parent ID FROM MainTable AS Child JOIN
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 如何有效地扫描每次迭代交替的 2 位掩码

    给定 2 个位掩码 应交替访问 0 1 0 1 我尝试获得运行时高效的解决方案 但找不到比以下示例更好的方法 uint32 t mask 2 uint8 t mask index 0 uint32 t f tzcnt u32 mask ma
  • 基于范围的 for 循环对性能有益吗?

    阅读 Stack Overflow 上有关 C 迭代器和性能 的各种问题后 我开始想知道是否for auto elem container 被编译器 扩展 成最好的版本 就像auto 编译器立即将其推断为正确的类型 因此永远不会更慢 有时甚
  • badoo.com 用户搜索 - 如何做到这一点?

    Badoo com 拥有 56 000 000 个用户个人资料 个人资料可以按性别 年龄 发色 生肖 学历等进行搜索 再加上距家乡的距离 在线状态和注册日期 到目前为止 这似乎是可行的 即使它是对巨大表 56m 成员 的相当多的查询 它也可
  • Java 增强型 For-Loop 比传统的更快?

    所以我的理解是 增强的 for 循环应该更慢 因为它们必须使用迭代器 但是我的代码提供了混合结果 是的 我知道循环逻辑占用了循环中花费的大部分时间 对于少量迭代 100 1000 增强的 for 循环在使用和不使用 JIT 的情况下似乎都要
  • 64 位 Windows 汇编器

    我想对 64 位 Windows 程序集进行编程 最好使用 NASM 我在 google 上查了一下 但似乎找不到 64 位 Windows 编译器 有些网站提到了ml64 但它似乎不再包含在VC 中 我尝试过 32 位程序集 但显然它在我
  • 使用 ACPI 在 MS-DOS 中关闭计算机

    我在基于 Pentium 的计算机上运行 MS DOS 6 22 主板支持 ACPI 并且想知道是否有一个可以用来关闭计算机的汇编语言例程 或者它是否比那个更难 即主板 具体的 基本上 我想创建一个小程序来从命令行关闭计算机 这是专门为此编
  • 为什么 mov %ax, %ds 汇编+反汇编为 mov %eax,%ds,与原来不一致?

    test S text global start start xor ax ax mov ax ds mov ax ss mov ax es mov ax fs mov ax gs 我通过这样做得到了反汇编代码文件 x86 64 elf g
  • intfmt: db "%d", 10, 0 在汇编中的含义

    我最近在我的一个汇编文件的顶部看到了这个 并意识到我在打印整数的过程中花了很长时间使用它 而没有真正意识到它最初来自哪里 在我的基本汇编模板中使用 或 10 0 是什么结尾的意思是 section data intfmt db d 10 0
  • 应用程序中 GC 长时间暂停

    我当前运行的应用程序需要最大堆大小为 16GB 目前我使用以下标志来处理垃圾收集 XX UseParNewGC XX UseConcMarkSweepGC XX CMSInitiatingOccupancyFraction 50 XX Di
  • 为什么某些 float < integer 比较比其他比较慢四倍?

    将浮点数与整数进行比较时 某些值对的计算时间比类似大小的其他值要长得多 例如 gt gt gt import timeit gt gt gt timeit timeit 562949953420000 7 lt 56294995342100
  • 您使用什么来通过其自定义协议来测试(功能/负载/压力)您的网络服务?

    我最近创建了一个回合制游戏服务器 可以接受数十万个并发客户端连接 长话短说 Linux 上的 epoll 通信基于简单 定制 基于线路的协议 该服务器允许客户端连接 寻找游戏比赛中的其他玩家 玩所述游戏 发送动作 聊天消息等 并在游戏结束时
  • 并行何时会提高性能

    我试图理解何时使用parallel会提高性能 我用一个简单的代码对其进行了测试 该代码运行了超过 100 000 个项目List
  • 在 Java 中有效地对图像进行颜色循环

    我正在编写一个曼德尔布罗分形查看器 我想以智能的方式实现颜色循环 给定一个图像 我想修改它的 IndexColorModel 据我所知 没有办法修改 IndexColorModel 也没有办法为图像提供新的 IndexColorModel
  • x86 程序集 Pushl/popl 不适用于“错误:后缀或操作数无效”

    我是汇编编程的新手 正在努力解决编程基础 http savannah nongnu org projects pgubook 在带有 GNU 汇编器 v2 20 1 的 Ubuntu x86 64 桌面上 我已经能够汇编 链接执行我的代码
  • Asp.net Mvc OutputCache属性和滑动过期

    Calling http foo home cachetest for UrlRoute Path home cachetest OutputCache Duration 10 VaryByParam none public ActionR
  • 方法与管道

    在 Angular 应用程序中的模板插值中使用管道和方法有区别吗 例如 h1 name toLowerCase h1 vs h1 name lowercase h1 就性能而言 是有真正的收获还是只是个人喜好 我知道调用模板中的方法通常会降

随机推荐

  • 将数据从操作传递到另一个操作

    如何通过 RedirectAction 方法将模型从 GetDate 操作传递到另一个 ProcessP 操作 这是源代码 HttpPost public ActionResult GetDate FormCollection values
  • MobileNetV2 的 Keras 和 TensorFlow Hub 版本之间的差异

    我正在研究一种迁移学习方法 并且在使用 MobileNetV2 时得到了非常不同的结果keras applications以及 TensorFlow Hub 上提供的一个 这对我来说似乎很奇怪 因为两个版本都声称here and here从
  • PHP:如何使用数组索引访问数组元素值[重复]

    这个问题在这里已经有答案了 如何使用数组索引访问数组元素值 我不知道 动态 中有什么 所以我想动态访问 pageCount 值 数组值是您正在寻找的功能 例子
  • 改进多节点集群上的 h2o DRF 运行时

    我目前正在跑步h2o的 DRF 算法是一个 3 节点 EC2 集群 h2o 服务器跨越所有 3 个节点 我的数据集有 100 万行和 41 列 40 个预测变量和 1 个响应 我用R控制集群和 RF 调用的绑定如下 model h2o ra
  • PLS-00306:调用“OUTPUT_ARRAY”时参数的数量或类型错误

    我被这个错误困住了 真的不知道如何修复它 也许我以不正确的方式传递数组 这是主要的 sql 文件 DECLARE v array length NUMBER v array length BEGIN DECLARE TYPE number
  • 在 wpf 中绘图时对线条进行动画处理

    XAML
  • 通过依赖注入模拟 C++ 类

    假设你正在测试课程A它有一个依赖注入 of B其中有一个依赖注入C 所以你嘲笑B但它唯一的构造函数需要注入C 所以你必须嘲笑C以及注入模拟的C进入被嘲笑的地方B然后才将其注入A 如果有 5 个连续的依赖关系怎么办 有哪些替代方案 I use
  • 完美的角色无限旋转

    我正在尝试使用这个角色 代替加载旋转器 这是我到目前为止所得到的 spinner after animation rotating 2s linear infinite content font size 60px display inli
  • 将数字添加到子图

    我是 matplotlib 的新手 正在尝试了解如何将数字添加到子图中 我有三个不同的函数 它们输出一个数字 def plot fig 1 vars args f ax put subplots do something ax plot x
  • 在数组中查找模式的最有效方法?

    最近我尝试使用C来查找一组数字中的众数 当集合很小时 我的代码可以做得很好 这是我的代码 int frequency 10001 This array stores the frequency of a number that betwee
  • 使用灯具加载数据时是否会调用模型 save() 方法?

    我试图在模型为空时从另一个字段自动生成一个模型 这是代码 class Position RichText name models CharField max length 200 slug models SlugField null Tru
  • 格拉姆-施密特正交化

    给定一个具有独立列的矩阵 A 不一定是方阵 我能够应用 Gram Schmidt 迭代并使用 Matlab 函数为其列空间 以正交矩阵 Q 的形式 生成正交基qr A 1 1 1 0 1 2 Q R qr A and then gt gt
  • C# 中的 TraceRoute 和 Ping

    有人有 C 代码可以方便地对目标计算机执行 ping 和跟踪路由吗 我正在寻找一个纯代码解决方案 而不是我现在正在做的事情 即调用 ping exe 和tracert exe 程序并解析输出 我想要更坚固的东西 鉴于我今天必须编写一个 Tr
  • 在设备上调试 Ionic 3 代码

    我正在测试 Ionic 3 到目前为止一切正常 我希望在 ionic Lab 上调试 TS 代码 因此我在 package json 中添加了下一个配置 config ionic source map source map 之后 我能够看到
  • 部分视图和渲染部分视图有什么区别?

    我对 ASP NET MVC 很陌生 请让我知道哪里应该使用部分视图以及哪里应该渲染部分视图 提前致谢 此链接可能有帮助 Html RenderPartial 此方法结果将直接写入 HTTP 响应流 这意味着它使用与当前网页 模板中使用的相
  • QWebEnginePage.print 与 QPrintPreviewDialog 导致空预览

    我有一个曾经使用过的程序QWebKit在对话框中显示和打印自定义生成的 HTML 报告 现在 我想将整个内容转换为QWebEngine 到目前为止一切正常 只有打印不行 到目前为止我用过QWebView print 将整个 HTML 数据交
  • JSF 2.0:设置验证时,复合组件内的 h:inputText 因非 String 对象而失败

    在支持 bean 中 Min 3 Integer foo 如果我有这样的形式
  • Tomcat 服务器无法“外部”工作

    我已经设置了 Tomcat 服务器并且它可以在本地主机上运行 但是我无法在外部运行它 我需要更改一些设置吗 我尝试了一切 但它似乎在其他地方不起作用 这很奇怪 因为它在本地主机上工作得很好 因此 您正在 spring boot 应用程序中运
  • 基于文件名的文件夹名称

    这实际上不是一个编码问题 我需要将所有文件放入单独的目录中 以便每个文件都有自己的目录 其名称基于文件名 因此 在我制作应用程序来执行此操作之前 有人知道可以执行此操作的软件吗 比如Automator什么的 无需构建应用程序 从 Windo
  • 现代 CPU 保持标志更新是否需要花费大量资源?

    据我了解 在现代无序 CPU 上 最昂贵的东西之一是状态 因为必须在多个版本中跟踪该状态 在许多指令中保持最新状态等 一些指令集 例如 x86 和 ARM 大量使用标志 这些标志是在成本模型不是现在的样子时引入的 并且标志只花费几个逻辑门