在x86汇编中,为imul使用两个单独的寄存器是否更好?

2024-03-29

我想知道,主要是出于好奇,使用相同的寄存器进行操作是否比使用两个更好。考虑到性能和/或其他问题,什么会更好?

mov %rbx, %rcx
imul %rcx, %rcx

or

mov %rbx, %rcx
imul %rbx, %rcx

任何有关如何对此进行基准测试的提示,或者我可以阅读有关此类事物的资源,都将不胜感激,因为我是装配新手。


我可以在其中阅读有关此类内容的资源

See 阿格纳·福格的微建筑 pdf http://agner.org/optimize/,以及他的优化装配指南。还有其他链接x86 /questions/tagged/x86tag wiki(例如英特尔的优化手册)。


您没有提到的有趣选项是:

mov   %rbx, %rcx
imul  %rbx, %rbx     # doesn'y have to wait for mov to execute
# old value of %rbx is still available in %rcx

If the imul处于关键路径上,并且mov具有非零延迟(如 AMD CPU 和 IvyBridge 之前的 Intel),这可能更好。的结果imul将提前一个周期准备好,因为不依赖于结果mov.

然而,如果旧值位于关键路径上而平方值不在关键路径上,那么情况会更糟,因为它增加了mov到关键路径。

当然,这也意味着您必须跟踪旧变量现在位于不同寄存器中的事实,并且旧寄存器具有平方值。如果这是循环中的问题,请将其展开,这样您就可以得到循环顶部所期望的结果。如果您希望这很容易,您可以使用编译器而不是手动优化 asm。


然而,Intel P6 系列 CPU(PPro/PII 至 Nehalem)具有有限的寄存器读取端口,因此最好优先读取您刚刚编写的寄存器。如果%rbx没有在最后几个周期写入,当mov and imuluop 经历重命名和发布阶段(RAT)。

如果他们不作为同一组 4 人的一部分发布,那么他们每个人都需要阅读%rbx分别地。由于 Core2/Nehalem 中的寄存器文件只有 3 个读取端口,因此发行组(Agner Fog 称之为四重奏)会停止,直到从寄存器文件中读取所有最近未写入的输入寄存器值(每个周期 3 个,或Core2 上的 2 表示 3 个寄存器中没有一个是寻址模式下的索引寄存器)。

有关完整详细信息,请参阅阿格纳·福格的微建筑 pdf http://agner.org/optimize/第 8.8 节。 Core2 部分又引用了 PPro 部分。 PPro 有一个 3 宽的管道,因此 Agner 在该部分谈论的是三重奏,而不是四重奏。


If mov and imul一起发行,他们都有相同的阅读%rbx。在 Core2/Nehalem 上发生这种情况的可能性为四分之三。

对于 Intel P6 系列 CPU,仅在您提到的序列之间进行选择,第一个序列比第二个序列具有明显(但通常很小)的优势。 AFAIK,其他 CPU 没有什么区别,所以选择是显而易见的。

mov   %rbx, %rcx
imul  %rcx, %rcx     # uses only the recently-written rcx; can't contribute to register-read stalls

两全其美:

mov   %rbx, %rcx
imul  %rbx, %rcx     # can't execute until after the mov, but still reads a potentially-old register

如果您要依赖最近编写的寄存器,您不妨使用only最近写入的寄存器。


Intel Sandybridge 系列使用物理寄存器文件(如 AMD Bulldozer 系列),并且没有寄存器读取停顿。

Ivybridge(第二代 Sandybridge)及后来的手柄mov reg,reg在寄存器重命名时,零延迟且无执行单元。这意味着您是否愿意并不重要rbx or rcx至于关键路径长度。

然而,AMD Bulldozer 系列只能在重命名阶段处理 xmm 寄存器移动;整数寄存器移动仍然有 1c 延迟。

可能仍然值得关心哪个依赖链mov如果延迟是循环每次迭代周期的限制因素,则为一部分。


如何对此进行基准测试

我认为你可以将一个在 Core2 上有寄存器读取停顿的微基准测试与imul %rbx, %rcx,但不与imul %rcx, %rcx。然而,这需要一些尝试和错误才能获得mov and imul在不同的组中发布,除非你真的很有创意,否则可能会有一些看起来很人造的周围代码,它们的存在只是为了读取大量寄存器。 (例如。lea (%rsi, %rdi, 1), %eax, 甚至add (%rsi, %rdi, 1), %eax(它必须读取所有三个寄存器,并且在 core2/nehalem 上进行微熔丝,因此它只需要问题组中的 1 个 uop 插槽。(它SnB 系列上没有微熔断器 https://stackoverflow.com/questions/26046634/micro-fusion-and-addressing-modes/31027695#31027695)).

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

在x86汇编中,为imul使用两个单独的寄存器是否更好? 的相关文章

  • 为什么 Dart 中的原生包装函数与非常轻量级的“DEFINE NATIVE ENTRY”函数相比如此重量级?

    我不明白 为什么要这样保证 这是自定义本机函数的包装器dart runtime vm native entry cc 它适用于想要编写的 Dart 程序员native extensions void NativeEntry NativeCa
  • Google BigQuery:检索每行的最后版本

    我有一个 Google BigQuery 表 其中包含所有版本的资源 每次创建 更新 删除资源时 都会添加一个新行 并递增版本号 该数字将是添加行时的时间戳 ID ResourceID Action Count Timestamp ABC
  • 我应该如何优化这个文件系统 I/O 绑定程序?

    我有一个 python 程序 它执行如下操作 从 csv 文件中读取一行 对其进行一些变换 将其分解为实际的行 因为它们将被写入数据库 将这些行写入单独的 csv 文件 除非文件已完全读取 否则返回步骤 1 运行 SQL Loader 并将
  • 在 Android 谷歌地图中绘制 4K 折线

    我现在正在开发一个适用于 Android 设备的应用程序 主要功能是在地图上绘制折线以显示城市中每条街道的交通情况 不幸的是 当我绘制大约 3K 折线时 数量会根据屏幕尺寸和缩放级别而减少 我的地图变得非常慢 我没有提及绘制所有线条的时间
  • 如何使用 VBA 将符号/图标格式化为单元格而不使用条件格式

    我使用 VBA 代码放置条件格式以覆盖大型表格中的值 每个单元格使用 2 个公式来确定使用 3 个符号中的哪一个 我需要根据列使用不同的单元格检查每个单元格的值 因此据我了解 我必须将条件格式规则单独放置在每个单元格上 以确保每个单元格中的
  • JavaScript:字符串连接性能低下? Array.join('')?

    我读过如果我有一个for循环 我不应该使用字符串连接 因为它很慢 例如 for i 0 i lt 10000000 i str a 相反 我应该使用Array join 因为它更快 var tmp for i 0 i lt 10000000
  • PHP include():文件大小和性能

    一个没有经验的PHP问题 我有一个 PHP 脚本文件 我需要在不同页面的很多地方多次包含该文件 我可以选择将包含的文件分解为几个较小的文件 并根据需要包含这些文件 或者 我可以将它们全部保存在一个 PHP 文件中 我想知道在这种情况下使用较
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调
  • 在二维平面中找到距离 P 点最近的 K 个点

    资料来源 亚马逊面试问题 解决方案1制作大小为 K 的堆并按最小距离收集点O NLogK 复杂 解决方案2 取大小为 N 的数组并按距离排序 应该使用QuickSort 霍尔修改 取前 K 点作为答案 这太复杂了 NlogN 但可以优化到近
  • Maven 依赖项更新报告需要数小时才能完成

    我有任务运行 Jenkins 工作女巫会报告新版本的库 我认为这些可以满足我的需要 org codehaus mojo versions maven plugin 2 5 plugin updates report org codehaus
  • 高性能 C# 服务器套接字的提示/技术

    我有一个 NET 2 0 服务器似乎遇到了扩展问题 可能是由于套接字处理代码的设计不佳 我正在寻找有关如何重新设计它以提高性能的指导 使用场景 50 150 个客户端 每个客户端以高速率 高达 100 秒 秒 发送小消息 每条 10 字节
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 在未排序的整数列表中最优搜索 k 个最小值

    我刚刚接受采访时提出了一个问题 我很好奇答案应该是什么 问题本质上是 假设您有一个包含 n 个整数的未排序列表 您如何找到此列表中的 k 个最小值 也就是说 如果您有一个 10 11 24 12 13 列表并且正在寻找 2 个最小值 您将得
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 在 Java 中加载和缓存图像的最佳方法是什么?

    我有超过一千个 16 x 16 像素图块图像的大量集合 我在 Java 中制作的游戏需要这些图像 在不耗尽 JVM 可用内存的情况下存储切片的最佳方法是什么 我认为生成 1000 BufferedImages 可能并不明智 保持图像准备就绪
  • 在 R 中替换数据帧中最低列表值的最有效方法

    我有一个数据框 df 其中包含为每个受试者记录的数字列表 向量 用于测试项目的两次重复 subj item rep vec s1 1 1 2 1 4 5 8 4 7 s1 1 2 1 1 3 4 7 5 3 s1 2 1 6 5 4 1 2
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • JMeter:tearDown Thread Group的目的是什么

    我想了解JMeter中tearDown Thread Group的实际用法 在什么场景下可以使用tearDown Thread Group 根据提供的帮助JMeter 拆解线程组 http jmeter apache org userman
  • 如何提高QNX6下Eclipse IDE的性能

    我们在 VMWare 环境中通过 QNX6 运行 Eclipse 速度非常慢 Eclipse 是这样启动的 usr qnx630 host qnx6 x86 usr qde eclipse eclipse data root workspa
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情

随机推荐

  • Google PageSpeed API dotnet .net

    我已经设置了一个基本的 C 应用程序 以便在我使用 Google Apis Pagespeedonline v2 nuget 包指定的网站上运行 PageSpeed 测试 设置非常简单 我有一个变量可以指定 url 然后将其传递到服务中 C
  • 保留 qw 中的空白

    有什么办法可以保留 qw 中的一些空白吗 例如 my a qw 1234 John Smith 123 Main St 将生成一个包含 6 个元素的数组 有什么方法可以 哦 我不知道 逃离空白以保留其中的一些 就像是 my a qw 123
  • 如何使用维基百科的 API 获取维基百科内容?

    我想获取维基百科文章的第一段 执行此操作的 API 查询是什么 请参阅本节中的MediaWiki API 文档 http www mediawiki org wiki API Properties revisions 2F rv 具体涉及获
  • 使用 knit-ess 进行 Polymode 编织 - 不想在 tex 文件名中包含“编织”

    我对 emacs 还很陌生 并且已经习惯在早期版本中使用 Sweave 现在我一直在使用polymode并使用knitr ess进行编织 但是 我想做两个定制 我希望生成的编织名称与文件名相同 即不是 filename writing te
  • 具有未定义行为的分支是否可以被假定为不可访问并优化为死代码?

    考虑以下陈述 char NULL 0 undefined behavior 它显然会调用未定义的行为 给定程序中存在这样的语句是否意味着整个程序未定义 或者只有当控制流命中该语句时行为才变得未定义 如果用户从不输入号码 以下程序是否会被明确
  • 如何从另一种语言单词创建英文字母字符串?

    我需要找到一种方法将某些语言的单词 翻译 重写为英语 例如 俄语 听起来像privet 用英语讲 含义和语法并不重要 但我希望它听起来更相似 一切都应该用Python编写 我在网上努力查找 但没有找到好的方法 例如 类似这样的事情 tran
  • Cocoa:避免控制绑定中的“持续更新”

    我有几个面板 其中包含NSTextField绑定到属性内的控件文件的所有者目的 如果用户编辑字段然后按Tab 移动到下一个字段 它按预期工作 但是如果用户不按Tab只需按 确定 按钮 新值不会在文件的所有者 object 为了解决这个问题
  • 声明后在 C++ 向量中分配元素

    请参考下面的代码和注释 vector
  • 如何在对 C# .NET 3.5 服务器进行 DCOM 调用时可靠地检查客户端身份?

    我有一个旧的 Win32 C DCOM 服务器 我正在重写它以使用 C NET 3 5 客户端应用程序位于远程 Windows XP 计算机上 也是用 C 编写的 这些客户端必须保持不变 因此我必须在新的 NET 对象上实现接口 这已经完成
  • jQuery - 如何选择表中所有行的最后一列?

    假设我有一个 HTML 表 如下所示 带有适当的 tr td 标签 a1 b1 c1 a2 b2 c2 a3 b3 c3 a4 b4 c4 table border 1 tr td a1 td td b1 td td c1 td tr tr
  • 如何保护 Next.js next-auth 中的路由?

    我正在尝试将身份验证与next auth应用程序中的库 我一直在遵循这里给出的官方教程https github com nextauthjs next auth example https github com nextauthjs nex
  • Laravel 6 中未定义 Artisan 命令“make:auth”

    我在 Laravel 6 中创建登录 身份验证时遇到问题 我在终端中输入 make auth 然后收到错误 Command make auth 似乎未定义 有解决办法吗 看起来 L6 将 Auth 脚手架移至一个单独的包 https git
  • 实体框架的 SQL 运算符函数是否可以安全防范 SQL 注入?

    这些函数可以访问 SQL 中的特殊函数 SqlClient 例如 喜欢 或 之间 他们还为它们提供了更好的通用抽象层 不要与存储过程 函数 混淆 这是另一篇文章的主题question https stackoverflow com ques
  • xyplot 中的多个 ablines

    我有一个 长 数据框定义为 q lt data frame Indicator Code factor Year numeric Value numeric 我试图在单个 xyplot 中绘制每个不同年份的值作为年份的函数Indicator
  • PHP 包含最佳实践问题

    我一直在学习 PHP 语法并进行练习 我有 NET 背景 因此母版页总是让我在处理页眉和页脚时变得非常简单 到目前为止 我有一个 mainHeader php 和 mainFooter php 其中有我的头部菜单和页脚 html 我创建了一
  • Android 和 iOS 上的 Open Graph SMS 丰富消息

    我正在尝试利用带有开放图元标记的富文本消息 因此 我已将元标记包含在我的网站头部中 并且它通过了所有 Facebook 调试和 iOS API 验证工具 然而 当我通过短信将链接发送给 Android 或 iOS 上的人时 它通常不起作用
  • 获取 Facebook 页面帖子

    我编写了一些 JavaScript 来获取 Facebook 页面上的所有帖子 我这样做的 URL 是这样的 http graph facebook com cocacola feed limit 5 callback facebookRe
  • C# 嵌入vlc控件

    我尝试将 VLC 嵌入到我的 WPF 项目中 我已经注册了 axvlc dll 还下载了 VLC nightly build 版本 2 2 2 System Windows Markup XamlParseException 类型的第一次机
  • Netbeans 删除内置类?

    我有一个 NetBeans 项目 其中有很多类 过去三周我一直在研究这个项目 今天才开始遇到这个问题 单击 NetBeans 中的 运行主项目 按钮时 我看到以下错误 Exception in thread main java lang N
  • 在x86汇编中,为imul使用两个单独的寄存器是否更好?

    我想知道 主要是出于好奇 使用相同的寄存器进行操作是否比使用两个更好 考虑到性能和 或其他问题 什么会更好 mov rbx rcx imul rcx rcx or mov rbx rcx imul rbx rcx 任何有关如何对此进行基准测