使用 CL 寄存器进行移位会导致部分寄存器停顿吗?

2024-03-04

变量移位是否会产生部分寄存器停顿(或寄存器重组微指令)ecx?如果是,在哪种微架构上?

我已经在Core2(65nm)上测试过这个,它似乎是只读的cl.

_shiftbench:
    push rbx
    mov edx, -10000000
    mov ecx, 5
  _shiftloop:
    mov bl, 5   ; replace by cl to see possible recombining
    shl eax, cl
    add edx, 1
    jnz _shiftloop
    pop rbx
    ret

更换mov bl, 5 by mov cl, 5没有什么区别,如果正在进行寄存器重组,就会有区别,这可以通过替换来证明shl eax, cl by add eax, ecx(在我的测试中,版本为add写入时速度减慢 2.8 倍cl代替bl).


检测结果:

  • Merom:未观察到失速
  • Penryn:未观察到失速
  • Nehalem:未观察到失速

更新:新的shrx- Haswell 的一组轮班does显示那个摊位。移位计数参数没有写成 8 位寄存器,因此这可能是预料之中的,但文本表示确实没有说明此类微架构细节。


正如目前的措辞(“可以使用 CL 寄存器进行移位……”),问题的标题包含其自己的答案:使用现代处理器,CL 上永远不会出现部分寄存器停顿,因为 CL 永远无法从较小的东西重新组合。

是的,处理器知道您要移动的量实际上包含在 CL 中,准确地说是 CL 的 5 或 6 个最低有效位。它可能在 ECX 上停滞的一种方式是,如果它考虑指令依赖性的粒度没有低于完整寄存器。不过,这种担心已经过时了:将整个 ECX 寄存器视为依赖项的最新 Intel 处理器是 Pentium 4。请参阅 Agner Fog 的非官方优化手册 http://www.agner.org/optimize/microarchitecture.pdf,第 121 页。但话又说回来,对于 P4,这不会被称为部分寄存器停顿,程序只能成为错误依赖性的受害者(例如,如果 CH 在移位之前是修饰符)。

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

使用 CL 寄存器进行移位会导致部分寄存器停顿吗? 的相关文章

  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • 为什么 Java 11 中对于空白字符串 String.strip() 比 String.trim() 快 5 倍

    我遇到过一个有趣的场景 因为某些原因strip 针对空白字符串 仅包含空格 明显快于trim 在Java 11中 基准 public class Test public static final String TEST STRING 3 w
  • 大数组上的 SSE 性能较慢

    我是 SSE 编程新手 所以我希望有人可以帮助我 我最近使用 GCC SSE 内在函数实现了一个函数来计算 32 位整数数组的总和 下面给出了我的实现代码 int ssum const int d unsigned int len stat
  • 循环内的局部变量会被垃圾收集吗?

    我想知道将循环内引用的任何变量放在循环外是否更有效 或者它们可以像函数内的变量一样被垃圾收集吗 var obj key val for var i 0 i lt 10 i console log obj or for var i 0 i l
  • 是否可以在VM内使用VMX CPU指令?

    VM guest 内部的进程是否有可能使用 VMX AMD V VT x CPU 指令 然后由外部 VMM 处理而不是直接在 CPU 上处理 Edit 假设外部VM使用VMX本身来管理其虚拟客户机 即它在Ring 1中运行 如果可能的话 是
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • 在所有浏览器中启用我的网站的平滑滚动

    我正在开发一个视差滚动网站Stellar http markdalgleish com projects stellar js and Skrollr https github com Prinzhorn skrollr图书馆 该网站在 F
  • GCC的sqrt()编译后如何工作?使用哪种root方法?牛顿-拉夫森?

    只是对标准感到好奇sqrt 来自 GCC 上的 math h 我自己编码的sqrt 使用牛顿拉夫森来做到这一点 是的 我知道 fsqrt 但CPU是如何做到这一点的呢 我无法调试硬件 现代 CPU 中的典型 div sqrt 硬件使用 2
  • linq2sql,存储库模式 - 如何从两个或多个表查询数据?

    我使用存储库模式 和 linq2sql 作为数据访问 并拥有例如 ProductsRep 和 CustomersRep 在非常简单的场景中 数据库有两个表 产品 产品 ID 客户 ID 产品名称 日期 和顾客 客户 ID 名字 姓氏 每个存
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • LC3 LEA指令和存储的值

    我对这个问题感到困惑 指令后寄存器0中存储的值是多少 LEA R0 A 被处决了吗 为什么答案是x370C 我认为应该将A的地址加载到R0中 如果是这样我们怎么知道地址 有人可以帮忙吗 非常感谢 ORIG X3700 LEA R0 A LD
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • Rails Windows Vagrant 响应时间非常慢

    我在跑 Vagrant 1 7 1 Rails 4 1 4 Thin 1 6 1 Windows 7 每个静态文件的发送时间都超过一秒 在我的 PC 上加载一个页面可能需要大约 20 秒 而在同事的 Linux 机器上则只需瞬间 有一些帖子
  • 在 Rust 中,太大的位移是否是未定义的行为?

    当您运行此代码时 allow exceeding bitshifts fn main const NUMBER u64 0b 10101010 fn print shift i u32 println b NUMBER gt gt i pr
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 使用 FileInputStream 时如何确定理想的缓冲区大小?

    我有一个从文件创建 MessageDigest 哈希 的方法 我需要对很多文件 gt 100 000 执行此操作 用于读取文件的缓冲区应该设置多大才能最大限度地提高性能 大多数人都熟悉基本代码 为了以防万一 我将在这里重复一遍 Messag
  • 为什么n++执行速度比n=n+1快?

    在C语言中 为什么n 执行速度快于n n 1 int n n int n n n 1 我们的老师在今天的课堂上问了这个问题 这不是家庭作业 如果您正在开发一个 石器时代 编译器 的情况下 石器时代 n比n 比n n 1 机器通常有incre
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 它只是不可能添加操作扩展图标

    我实际上已经尝试了两周来获得一个用于显示操作扩展的图标 但绝对没有任何效果 我过去见过这样的问题iOS 8 操作扩展图标大小 https stackoverflow com questions 25917700 ios 8 action e
  • 无法安装 ruby​​ gems - zlib 错误

    我正在尝试安装一些 Ruby Gems 以便在收到 Twitter 消息时可以使用 Ruby 来通知我 然而 在做了一个gem update system 现在每次我尝试执行以下操作时都会出现 zlib 错误gem install任何东西
  • 为什么我下载文件时我的移动运营商会重新编码?

    我在 Android 中发现了一个非常奇怪的现象 我发现 当下载超过 3g 的图像时 随后计算的 sha1 与服务器上的文件应有的不同 经过进一步调查 我发现图像实际上被缩小了尺寸并重新编码 我的移动运营商 verizon 似乎正在尝试优化
  • String.format 使用 exception.getMessage() 作为格式

    我有一个与 JAVA 中的 String format 有关的问题 我的 HibernateDao 类负责持久化实体 并在发生任何约束违规时抛出异常 该消息包含 s 并将用作上层的格式 因为我应该担心这一层中的类型 因此无法识别我无法持久化
  • 无法使用 Windows 使用 ssh 密钥访问 gitlab 存储库

    我已关注这些说明 https docs gitlab com ee ssh generate an ssh key pair用于使用 ssh keygen 生成密钥对 当我试图找出问题所在时 我实际上生成了 ed25519 和 rsa 密钥
  • CSS 对角线 - 如何适应其父元素?

    我怎样才能使对角线填充并适合一个盒子 只是纯CSS 不使用任何背景图像 div diagonal container border 1px solid 000 width 400px height 400px margin 0 auto t
  • Vim 删除空行

    我可以运行什么命令来删除 Vim 中的空行 g d g将在与正则表达式匹配的行上执行命令 正则表达式是 空行 命令是 d 删除
  • 如何将回归线添加到具有按因子进行颜色编码的多个数据系列的图中?

    我希望将回归线添加到具有多个按因子进行颜色编码的数据系列的图中 使用brewer pal 调色板 我创建了一个图 其中数据点按因子 plant ID 着色 下面是代码示例 palette brewer pal 12 Paired plot
  • 导入错误:没有名为 Crypto 的模块

    我刚刚开始探索Python 我正在尝试运行 AES 算法代码 但我面临着 导入错误 没有名为 Crypto 的模块 你如何解决这个问题 您必须安装加密包 https pypi python org pypi pycrypto https p
  • 本地化静态网站的正确方法是什么

    我需要将我们的网站本地化为多种语言 该网站由多个静态页面组成 没有动态后端 我们有一个良好的国际社会 人们愿意帮助我们 问题是如何安排网站翻译 正确的工作流程是什么 静态网站本地化的最佳实践是什么 如何组织语言字符串包 如何组织从字符串捆绑
  • onreadystatechange 中 XHR 获取请求 URL

    有没有办法在 onreadystatechange 方法中获取请求的URL 我想运行多个 XHR 请求并知道其中哪个会返回 xhr open GET https url i true xhr onreadystatechange funct
  • django 剥离/删除/清除值

    我正在使用 django 1 6 7 和 python 2 7 我试图在将值提交到数据库之前清除字段中的数据 如果它符合条件 我一直在使用 strip 但这不再有效 搜索 django 文档后我找不到解决方案 这是我的 forms py 文
  • WPF 中的数字数据输入

    您如何处理 WPF 应用程序中的数值输入 如果没有 NumericUpDown 控件 我一直在使用 TextBox 并使用下面的代码处理其 PreviewKeyDown 事件 但它非常丑陋 有没有人找到一种更优雅的方式来从用户获取数字数据而
  • 如何在 NetBeans 平台中隐藏没有图层文件的菜单?

    我很难在 NetBeans 平台中自定义菜单 我看到的示例要求您拥有一个 Layer 文件 但我认为我的 NetBeans 平台项目中没有该文件 要通过图层隐藏菜单 您应该这样做
  • 使用 PHP eval 的风险[重复]

    这个问题在这里已经有答案了 可能的重复 什么时候 如果有的话 eval 不是邪恶的 https stackoverflow com questions 3499672 when if ever is eval not evil php 中的
  • 两个互相引用的类

    我是 C 新手 所以这个问题可能很基本 我有两个类需要互相引用 每个都在自己的头文件中 include 是另一个的头文件 当我尝试编译时 我收到其中一个类的错误 ISO C 禁止声明没有类型的 Foo 如果我切换事物 以便首先解析相反的标头
  • BottomNavigationView.setupWithNavController 不起作用

    目前我正在开发一个Android应用程序 我想在其中同时利用Android Navigation Component and BottomNavigationView 在开发上述应用程序时 我签出了官方代码实验室这里有几个问题 但事实证明它
  • Firebase Web:下载 URL 中的存储位置

    我正在编写一个需要存储位置的 firebase 函数 现在我有下载网址 有没有办法像这样获取存储位置 gs dexxxxxxxxxxxxxxxx com videosvideo 67423 http gs dekhoapp appspot
  • 如何存储 JWT 并使用 React 将它们与每个请求一起发送

    很高兴知道 因为我的基本注册 身份验证系统正在运行 所以基本上我得到了这个 app post login function req res Users findOne email req body email function err us
  • 使用 CL 寄存器进行移位会导致部分寄存器停顿吗?

    变量移位是否会产生部分寄存器停顿 或寄存器重组微指令 ecx 如果是 在哪种微架构上 我已经在Core2 65nm 上测试过这个 它似乎是只读的cl shiftbench push rbx mov edx 10000000 mov ecx