【问题标题】:What is a microcoded instruction?什么是微码指令?
【发布时间】:2016-11-01 18:48:25
【问题描述】:

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

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

【问题讨论】:

  • 单句版本是微编码 CPU 的工作方式类似于高级语言的基于操作码的解释器:暴露的机器语言中的指令被分解成更容易执行的更小的步骤.维基百科有一个不错的,如果行话的话,longer explanation,但真正的解释需要整本计算机体系结构教科书。

标签: assembly cpu cpu-architecture microcoding


【解决方案1】:

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,其中decodes to 3 uops on Intel Haswell。有趣的是,这与使用 3 条 MOV 指令与暂存寄存器进行交换所获得的微指令不完全相同,因为它们不是零延迟的。

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

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

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

另一个例子是 x86 的整数 DIV 指令,即使在像 Haswell 这样的现代 Intel CPU 上也是微编码的。但不是 AMD; AMD 只有一到两个微指令激活整数除法器单元内的所有内容。它不是 DIV 的基础,只是一个实现选择。有关数字,请参阅我在 C++ code for testing the Collatz conjecture faster than hand-written assembly - why? 上的回答。

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

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


要了解有关 x86 CPU 内部结构的更多信息,请参阅 标签 wiki,尤其是 Agner Fog's microarch guide

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

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

而且,对于流水线和 OoO 执行的基础知识,Modern Microprocessors A 90-Minute Guide! 始终值得推荐。


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

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


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

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

【讨论】:

  • 虽然你比我认为的 OP 需要更多的细节,但我发现有趣的是,我说了同样的话,从 +2 票变成 -1 而你是 +1 说一样。但是,您可能会通过使用汇编语言指令(例如 xchg 和 div)来混淆 OP。这是他困惑的根源,我试图用更简单的术语来缓解那些刚刚学习基础知识的人。
  • @Rob:您的回答声称正在解码的指令的某些位微码。它没有说明某些指令会触发来自微代码 ROM 的内部指令流,而其他指令会直接影响控制信号(尽管在现代 x86 CPU 中,即使是单 uop 指令仍会经历大量复杂的输出订单机器)。一些 ISA(我认为像 MIPS)的一些设计根本不使用任何微代码,指令位可以直接解码为控制信号。
  • 因为我不想比我认为他能理解的更深入。我什至提到它会变得更复杂。
  • @Rob:我知道尝试简化是个好主意,我只是认为你没有成功,不幸的是最后说了一些不正确的话。
  • @MarkYisri:您是在问为什么 ARM 没有内存目标 ADD 指令?是的,那是因为它是一个加载/存储架构,其中普通指令不能有内存操作数。这与 RISC 架构高度相关或作为其一部分。为了清楚起见,x86 将其解码为 3 或 4 个内部微指令,但它仍然不是“微编码”的。解码器内置了 uop 模式,无需将 CPU 重定向到微码 ROM。
猜你喜欢
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2018-03-26
  • 2012-12-02
  • 1970-01-01
  • 2021-08-19
相关资源
最近更新 更多