什么是微码指令?

What is a microcoded instruction?

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

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

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

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

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

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

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


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

在 Intel / AMD CPUs 上,“微编码”意味着解码器打开微代码定序器以将 uops 从 ROM 馈送到管道,而不是直接产生多个 uops。

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

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

另一个例子是 x86 的整数 DIV 指令,它甚至在像 Haswell 这样的现代英特尔 CPUs 上也是微编码的。但不是 AMD; AMD 只需 1 或 2 微指令即可激活整数除法器单元内的所有内容。它不是 DIV 的基础,只是一个实现选择。有关数字,请参阅我在 上的回答。

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

整数除法和其他微编码指令会给 CPU 带来困难,creates effects that make code alignment matter where it wouldn't otherwise.


要了解有关 x86 CPU 内部结构的更多信息,请参阅 tag wiki, and especially Agner Fog's microarch guide

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

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

此外,现代微处理器 90 分钟指南! 始终值得推荐流水线和 OoO exec 的基础知识。


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

在一些较旧/更简单的 CPU 中,每条指令都被有效地微编码。比如6502执行了6502条指令by running a sequence of internal instructions from a PLA decode ROM。这适用于非流水线 CPU,其中使用 CPU 不同部分的顺序可能因指令而异。


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

这个意思在某些圈子中可能仍然会被使用,比如在设计一个简单的流水线时 CPU,就像一个业余爱好 MIPS。