什么是微编码指令?

2024-04-23

我看过很多参考微编码指令的文献。

这些是什么以及为什么使用它们?


CPU 读取机器代码并将其解码为内部控制信号,将正确的数据发送到正确的执行单元。

大多数指令映射到一个内部操作,并且可以直接解码。 (例如,在 x86 上,add eax, edx只是将 eax 和 edx 发送到整数 ALU 进行 ADD 操作,并将结果放入 eax 中。)

其他一些单一指令可以much更多的工作。例如x86 的rep movs http://www.felixcloutier.com/x86/REP:REPE:REPZ:REPNE:REPNZ.html实施memcpy(edi, esi, ecx),并且需要CPU循环。

当指令解码器看到这样的指令时,它们不是直接产生内部控制信号,而是从微代码 ROM 中读取微代码。

微编码指令是一种解码为许多内部操作的指令


现代 x86 CPU 始终将 x86 指令解码为内部微操作。在这个术语中,即使在add [mem], eax解码为来自的负载[mem],ALU ADD 操作,以及存储回[mem]。另一个例子是xchg eax, edx, which 在 Intel Haswell 上解码至 3 uop https://stackoverflow.com/questions/45766444/why-is-xchg-reg-reg-a-3-micro-op-instruction-on-modern-intel-architectures。有趣的是,这与使用 3 个 MOV 指令与暂存寄存器进行交换所获得的微指令并不完全相同,因为它们不是零延迟的。

在 Intel / AMD CPU 上,“微编码”意味着解码器打开微代码定序器将 ROM 中的微指令送入管道,而不是直接产生多个微指令。

(如果您以纯 RISC 术语进行思考,则可以将任何多微指令 x86 指令称为“微编码”,但在 IMO 中,使用术语“微编码”来进行不同的区分很有用。我认为这个含义在 x86 优化圈中很普遍,就像 Intel 的优化手册一样。其他人可能会使用不同的术语含义,尤其是在将 x86 与 RISC 进行比较时谈论其他体系结构或一般计算机体系结构时。)

在当前的 Intel CPU 中,解码器在不进入微代码 ROM 的情况下可以直接生成的内容的限制是 4 uops(融合域)。 AMD 类似地具有 FastPath(又名 DirectPath)单指令或双指令(1 或 2 个“宏操作”,AMD 相当于 uops),除此之外,它是 VectorPath 又名微代码,如所解释的David Kanter 对 AMD Bulldozer 的深入了解 http://www.realworldtech.com/bulldozer/5/,具体说说它的解码器。

另一个例子是 x86 的整数 DIV 指令,即使在 Haswell 等现代 Intel CPU 上也是微编码的。但 AMD 则不然; AMD 只需要 1 或 2 个 uops 即可激活整数除法器单元内的所有内容。它不是 DIV 的基础,只是一个实现选择。请参阅我的回答用于测试 Collat​​z 猜想的 C++ 代码比手写汇编更快 - 为什么? https://stackoverflow.com/questions/40354978/why-is-this-c-code-faster-than-assembly/40355466#40355466对于数字。

FP 除法也很慢,但被解码为单个微指令,因此不会成为前端的瓶颈。如果 FP 除法很少出现并且不是延迟瓶颈的一部分,那么它可以像乘法一样便宜。 (但是,如果执行确实必须等待结果,或者吞吐量出现瓶颈,那么much较慢。)更多内容这个答案 https://stackoverflow.com/questions/4125033/floating-point-division-vs-floating-point-multiplication/45899202#45899202.

整数除法和其他微编码指令会给CPU带来困难,并且产生的效果使代码对齐变得很重要,而其他情况则不然。 https://stackoverflow.com/questions/26907523/branch-alignment-for-loops-involving-micro-coded-instructions-on-intel-snb-famil


要了解有关 x86 CPU 内部结构的更多信息,请参阅x86 /questions/tagged/x86标签维基,特别是Agner Fog 的微架构指南 http://agner.org/optimize/.

David Kanter 对 x86 微架构的深入研究对于理解 uops 所经历的管道也很有用:Core 2 https://www.realworldtech.com/merom/ and 珊迪大桥 https://www.realworldtech.com/sandy-bridge/作为主要的文章,AMD K8 和 Bulldozer 的文章也很有趣,可以进行比较。

RISC 与 CISC 仍然很重要 https://www.realworldtech.com/risc-vs-cisc/(2000 年 2 月)保罗·德蒙 (Paul DeMone)看看 PPro 如何将指令分解为微指令,与 RISC 相比,其中大多数指令已经很简单,只需一步即可通过管道,只有像 ARM 压入/弹出多个寄存器这样的罕见指令需要沿着管道发送多个内容(又名以 RISC 术语进行微编码)。

为了更好地衡量,现代微处理器 90 分钟指南! http://www.lighterra.com/papers/modernmicroprocessors/对于管道和 OoO exec 的基础知识始终值得推荐。


该术语在与现代 x86 截然不同的上下文中的其他用法

在一些较旧/较简单的 CPU 中,每条指令都经过有效的微编码。例如6502执行了6502条指令通过运行 PLA 解码 ROM 中的一系列内部指令 https://security.stackexchange.com/a/177087/66337。这对于非流水线 CPU 非常有效,其中使用 CPU 不同部分的顺序可能因指令而异。


从历史上看,“微代码”有不同的技术含义,意思是从指令字解码的内部控制信号。特别是在像 MIPS 这样的 CPU 中,指令字直接映射到那些控制信号,无需复杂的解码。 (我可能有部分错误;我读过类似的内容(除了这个问题的已删除答案之外),但后来找不到了。)

这个含义实际上可能仍然在某些圈子中使用,例如设计简单的流水线 CPU 时,例如业余爱好 MIPS。

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

什么是微编码指令? 的相关文章

  • 高效memcspn

    有谁知道 memcspn 函数的有效实现吗 它的行为应该类似于 strcspn 但在内存缓冲区中查找跨度 而不是在以 null 结尾的字符串中查找跨度 目标编译器是 VisualC 谢谢 卢卡 一种近乎最佳的实现 size t memcsp
  • 为什么X86中没有NAND、NOR和XNOR指令?

    它们是您可以在计算机上执行的最简单的 指令 之一 它们是我亲自实施的第一个指令 执行 NOT AND x y 会使执行时间和依赖链长度和代码大小加倍 BMI1 引入了 andnot 这是一个有意义的补充 是一个独特的操作 为什么不是这个问题
  • 如何检查设备是否“快”足够

    我找不到更好的措辞来回答我的问题 在我的应用程序中的某个时刻 我设置了一些非常密集的动画 事实是 在高端设备上 动画运行流畅且赏心悦目 另一方面 我测试的一款低端设备在制作动画时的性能非常糟糕 为了将用户体验放在第一位 我想在计算能力足够的
  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • 将字段中的位扩展到掩码中所有(重叠+相邻)集位的最快方法?

    假设我有 2 个名为 IN 和 MASK 的二进制输入 实际字段大小可能是 32 到 256 位 具体取决于用于完成任务的指令集 每次调用时两个输入都会改变 Inputs IN 1100010010010100 MASK 000111101
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • Polygot 包含 nasm/yasm 和 C 的文件

    我有一堆幻数 我想将它们包含在由 nasm 或 yasm 编译的 C 程序和汇编文件中 在纯 C 语言中 该文件看起来像是一系列定义 例如 define BLESS 55378008 define ANSWER 42 在 nasm 或 ya
  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • 在 x86 程序集中打印寄存器值的简单方法

    我需要在 8086 Assembly 中编写一个程序 接收来自用户的数据 进行一些数学计算并在屏幕上打印答案 我已经编写了程序的所有部分并且一切正常 但我不知道如何打印号码显示到屏幕上 在我所有计算结束时 答案是 AX 它被视为无符号 16
  • 对将英特尔傲腾 DC SSD 用作 IMDT 的额外 RAM 感到困惑吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对英特尔傲腾 DC 有点困惑 我希望我的 Optane DC 能够同时充当 DRAM 和存储 一方面 我了解到只有 英特尔傲腾 DC 持
  • 68000 汇编语言 - CMPI.B

    What are the contents of the CCR and D3 after the following instructions sequence executes Perform the calculation by ha
  • 64 位 Windows 汇编器

    我想对 64 位 Windows 程序集进行编程 最好使用 NASM 我在 google 上查了一下 但似乎找不到 64 位 Windows 编译器 有些网站提到了ml64 但它似乎不再包含在VC 中 我尝试过 32 位程序集 但显然它在我
  • 比“add esp, 4”更小的指令

    又是我 我的程序中有很多 add esp 4 我正在尝试减小它的大小 是否有任何更小的指令可以替代 add esp 4 pop edx 或者您不介意破坏的任何其他整数寄存器 这就是现代编译器实际上所做的 https stackoverflo
  • 使用 ACPI 在 MS-DOS 中关闭计算机

    我在基于 Pentium 的计算机上运行 MS DOS 6 22 主板支持 ACPI 并且想知道是否有一个可以用来关闭计算机的汇编语言例程 或者它是否比那个更难 即主板 具体的 基本上 我想创建一个小程序来从命令行关闭计算机 这是专门为此编
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪
  • 汇编语言程序中连续两次相乘

    我正在使用 8086 模拟器以及 DOSBOX 和 MASM 我知道当我们将 8 位与 8 位相乘时 答案将是 16 位 al 8 bit ax 当我们将 16 位与 16 位相乘时 答案将是 32 位 ax 16 bit dx ax 但如
  • 将以下机器语言代码(0x2237FFF1)翻译成MIPS汇编

    到目前为止我已经翻译了这段代码 但我不明白的是如何计算 计算 16 位立即地址的数量 0x2237FFF1 转为二进制 0010 0010 0011 0111 1111 1111 1111 0001 现在我正在读取操作码 001000 并知
  • movsbl指令的作用是什么? [复制]

    这个问题在这里已经有答案了 我在网上搜索过 但找不到明确的示例来理解该指令的作用 因此 如果有人可以举一个例子 这对我来说将会非常有帮助 用符号从字节扩展到长字移动 在Intel语法中 该指令的助记符是MOVSX 当变量类型为 C 时 C
  • 如何恢复 x86-64 寄存器保存约定

    fibonacci cmpq 1 rdi ja recursive movl 1 eax ret recursive push rbp push r10 movq rdi r10 leaq 2 rdi rdi call fibonacci
  • 如何使 gcc 为 -fpatchable-function-entry 发出多字节 NOP?

    gcc确实有能力使用多字节用于对齐循环和函数的 NOP 然而当我尝试 fpatchable function entry option https gcc gnu org onlinedocs gcc Instrumentation Opt

随机推荐

  • 手势识别器和 TableView

    我有一个 UIView 覆盖了 UITableView 的所有内容 UIView 使用手势识别器来控制表格显示的内容 我仍然需要垂直 UITableView 滚动和行点击 我如何将这些从手势识别器传递到桌子上 如果您需要知道单元格的索引路径
  • 为什么使用 $PATH 以及它是什么

    我对编程有点陌生 不是真的 但我仍在学习 我们不是吗 虽然我了解 Java 和 Python 并且了解 C C JS C HTML CSS 等 并且我可以在终端中很好地导航 但我不熟悉终端中的 PATH 是什么 我使用 Linux 终端和
  • 键路径值类型“Int”无法转换为上下文类型“String”

    我试图将包含 KeyPath 和排序顺序类型的多个元组传递给应该进行排序的方法 我有这个方法 extension Array mutating func sort
  • 使用 Python 的内置 .csv 模块进行编写

    请注意 这是一个与已经回答的问题不同的问题如何使用 Python 的内置 csv writer 模块替换列 https stackoverflow com questions 1019200 how to replace a column
  • 部署 Qt Quick 演示应用程序 Minehunt 时出现全白屏幕

    为了测试部署过程 我尝试部署附带的演示应用程序 Minehunt 我能够让它运行 没有崩溃或错误 但屏幕是全白的 我相信这通常意味着我缺少插件 Dependency walker 报告没有问题 我什至尝试包含 Qt MingW 插件目录中的
  • Start-Job - 实时检索输出

    我们通过以下方式启动 Powershell 函数Start Job并希望实时检索调用者的输出 有没有一种好的方法可以在不打电话的情况下做到这一点Retrieve Job在循环中 尝试这样的事情 appJob Start Job foreac
  • 对等网络应用程序的网络发现

    我希望有两个类 一个服务器类和一个客户端类 服务器类应该接收每个新客户端的 IP 地址和端口号并将它们存储在列表中 它应该为每个客户端提供已连接客户端及其 IP 地址的列表 然后 客户端可以使用 TCP 连接相互通信 问题是客户端不知道服务
  • 查找集合中的所有对象 Java Mongodb

    下面的代码查找集合中的第一个文档 package database import com mongodb BasicDBObject import com mongodb BulkWriteOperation import com mong
  • 使用 Python 从原始帧创建 MPEG4 视频文件

    我有一个原始视频帧源 我可以在 Python 中访问它 我想用它创建一个 MPEG4 视频 并带有 MP3 背景音乐 Python 中有哪些类型的工具和库可用于此类任务 最好我想要一个 API 我可以为其提供输出文件名 然后将各个帧作为 2
  • Aureliajs 等待应用程序构造函数上的数据

    我正在 aureliajs 中开发一个应用程序 开发过程已经开始了好几个月 现在后端开发人员希望对其服务进行版本控制 因此 我有一个 Web 服务可以调用来获取每个服务器端 Web api 应用程序的版本 然后 对于进一步的请求 调用正确的
  • 更好的德尔福印地 2007

    使用 Delphi 2007 附带的默认 indy10 或将其升级到最新快照版本哪个更好 为什么 谢谢 始终保持最新版本 它包含错误修复 如果您报告 Delphi 提供的库存版本存在问题 您将得到的第一个建议是升级到最新版本 因为您的错误可
  • 如何在选择自定义 UITableViewCell 时获取触摸坐标?

    当我触摸 触摸 UITableViewCell 时 我的 ViewController 的 UITableViewDelegate 方法 void tableView UITableView tableView didSelectRowAt
  • 整数包装对象仅在值 127 内共享相同的实例? [复制]

    这个问题在这里已经有答案了 这里它们是同一个实例 Integer integer1 127 Integer integer2 127 System out println integer1 integer2 outputs true 但这里
  • 在 ASP.NET 中通过 AJAX 使用后台工作程序

    我需要执行一项后台任务 该任务有一个显示完成百分比的进度条和一个取消按钮 撇开任务细节不谈 现在 我只想让一个示例正常工作 因此我只有三个主要事件处理程序 DoWork ProgressChanged 和 RunWorkerComplete
  • 检查 401,然后重定向 Angularjs,但仅在某些路由上

    我有一个很好的角度服务 可以通过查看服务器是否返回 401 错误消息来检查用户是否登录 如果是 用户将被重定向到登录页面 这很有效 但问题是它对于我的所有页面来说都是完全全局的 我有一条特殊路线位于 explore 顺便说一句 使用 UI
  • 使用 C# 更新 json 文件中的属性

    我希望更改 json 文件中每个 json 记录的特定属性 当方法完成执行时 我想将 Completed 属性更改为 true 我的 json 文件如下所示 LoanRecords LoanGUID 70dbec7e 5e94 460d 8
  • 如何将 AFHTTPClient、Afnetworking 1.0 迁移到 2.0

    我的问题是我有一个旧代码 我不知道如何更改它 我有 1 个名为 API HTTPClient 的类 我对 2 个方法有问题 因为我不知道如何将它们放入 2 0 中 这 void commandWithParams NSMutableDict
  • windows 10 本机构建错误 - Windows 上的本机映像构建当前仅支持目标架构:AMD64(不支持 x86)

    我正在测试一个新项目 并尝试使用 Gluon 来实现此目的 ATM 我正在 Windows 10 上使用 AMD Ryzen 7 进行构建 按照以下指示 https docs gluonhq com platforms windows ht
  • 如何使用 Spring Security 保护混合 Spring MVC + Flex 应用程序

    我尝试在 Spring 论坛上询问这个问题 http forum springsource org showthread php 109948 Problem configuring spring security 3 1 with hyb
  • 什么是微编码指令?

    我看过很多参考微编码指令的文献 这些是什么以及为什么使用它们 CPU 读取机器代码并将其解码为内部控制信号 将正确的数据发送到正确的执行单元 大多数指令映射到一个内部操作 并且可以直接解码 例如 在 x86 上 add eax edx只是将