12

我看过很多引用微编码指令的文献。

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

4

1 回答 1

16

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

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

其他一些单一指令做更多的工作。例如 x86 的rep movs实现memcpy(edi, esi, ecx),并且需要 CPU 循环。

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

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


现代 x86 CPU 总是将 x86 指令解码为内部微操作。add [mem], eax在这个术语中,即使解码为从 加载[mem]、ALU ADD 操作和存储回,它仍然不能算作“微编码” [mem]。另一个例子是xchg eax, edx,它在 Intel Haswell 上解码为 3 微指令。有趣的是,与使用 3 条 MOV 指令与暂存寄存器进行交换所获得的微指令不完全相同,因为它们不是零延迟的。

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

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

在当前的 Intel CPU 中,解码器可以直接生成的内容的限制是 4 uop(融合域),而无需进入微代码 ROM。AMD 同样具有 FastPath(又名 DirectPath)单指令或双指令(1 或 2 个“宏操作”,AMD 相当于 uops),除此之外,它是 VectorPath aka Microcode,正如David Kanter 对 AMD Bulldozer 的深入了解中所解释的那样,特别是谈论它的解码器。

另一个例子是 x86 的整数 DIV 指令,即使在像 Haswell 这样的现代 Intel CPU 上也是微编码的。但不是 AMD;AMD 只有一到两个微指令激活整数除法器单元内的所有内容。它不是 DIV 的基础,只是一个实现选择。请参阅我对 C++ 代码的回答,以比手写汇编更快地测试 Collat​​z 猜想 - 为什么?对于数字。

FP 除法也很慢,但被解码为单个 uop,因此它不会成为前端的瓶颈。如果 FP 除法很少见并且不是延迟瓶颈的一部分,它可以像乘法一样便宜。(但如果执行确实必须等待它的结果,或者它的吞吐量遇到瓶颈,那么它会慢得多。)这个答案中的更多内容。

整数除法和其他微编码指令会给 CPU 带来困难,并产生使代码对齐变得重要的效果,否则它不会。


要了解有关 x86 CPU 内部结构的更多信息,请参阅标签 wiki,尤其是Agner Fog 的微架构指南

此外,David Kanter 对 x86 微架构的深入研究有助于理解 uops 所经过的管道:Core 2Sandy Bridge是主要的,AMD K8 和 Bulldozer 的文章也很有趣,可以进行比较。

Paul DeMone 的RISC 与 CISC Still Matters(2000 年 2 月)着眼于 PPro 如何将指令分解为微指令,而 RISC 中的大多数指令已经很简单,只需一步通过管道,只有很少见的指令,如 ARM push/弹出多个寄存器,需要将多个东西发送到管道中(也就是 RISC 术语中的微编码)。

为了更好地衡量,现代微处理器 90 分钟指南!对于流水线和 OoO exec 的基础知识,总是值得推荐的。


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

在一些较旧/较简单的 CPU 中,每条指令都有效地进行了微编码。例如,6502通过运行来自 PLA 解码 ROM 的一系列内部指令来执行 6502 指令。这适用于非流水线 CPU,其中使用 CPU 不同部分的顺序可能因指令而异。


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

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

于 2016-11-02T00:36:34.550 回答