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 的基础,只是一个实现选择。请参阅我的回答用于测试 Collatz 猜想的 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。