指令的解码形式是什么?

What is the decoded form of an instruction?

我正在阅读 Ulrich Drepper 的 "What every computer scientist should know about memory"。

在第 6.2.2 节中,它显示:

[...] instructions have to be decoded before they can be executed and, to speed this up (important on x86 and x86-64), instructions are actually cached in the decoded form, not in the byte/word form read from memory.

作者所说的 "decoded" 形式的说明是什么意思?这些说明本身不就是它们的意思吗? "add" 是 "add" 例如...

其 "decoded" 形式的表示形式是什么?他们为什么需要缓存它?它不会是确定性的吗? "decode" 管道中的一条指令需要时间吗?为什么?

你认为的单条指令实际上(可能)对应于处理器上的一整套不同电路。 "Decoded" 表示已读取机器代码,并且现在存在一些元数据或处理器状态来选择正确的电路。比缓存代码更有效的缓存。

例如,加载指令可能使用一种实现来进行偏移寻址,而使用完全不同的电路来进行立即寻址...

现代英特尔 CPU 实际上使用所谓的 microcode 执行许多指令。微码由用更简单的低级指令集编写的代码组成,用于实现高级指令(例如,rep 前缀的指令可能被实现为微码循环)。因为这实际上需要 CPU 本身将您的输入指令流 "compile" 转换为微代码,所以可以想象缓存的正是这个微代码(以避免重复编译它的开销)。

当然,缓存 "decoded" 指令的精确细节因处理器而异,因此不可能有一般性的说法。

a CPU 总是执行的 3 个步骤是:

  1. fetch(从内存中获取指令);

  2. 解码(指令 - 你的问题);

  3. 执行(根据解码阶段让电信号走在COU中)

解码指令意味着 CPU "decoder" – CPU 内部的硬件组件 – 解码二进制指令并决定如何处理电信号(指令)基于指令。

换句话说:指令被转换为控制CPU其他部分的信号。

这不是您在经典 RISC 流水线中看到的那种解码步骤。在现代 x86 处理器中,指令在最终进入 "generate control signals" 阶段之前要经过几个解码步骤。它们是 "predecoded"(识别指令边界),解码为微操作,然后缓冲、缓存和排队,直到它们最终到达 "RISC-like core" ,它们被调度并放入保留站,只有在那之后它们才最终到达 ALU(如果适用)。在那条路线的大部分时间里,它们可能还没有在 "turned into actual control signals" 的经典 RISC 意义上解码,这会使它们太宽,以至于无法将其中的 1.5K 放入 L1C。不管怎样,前端产生的那些µops是"RISC-like core"的指令集,它们不是老式意义上的状态机顺序产生一堆控制信号的真正的微代码。不过还是有可比性的。

至于 µops 究竟是什么样子,真的很难得到具体细节。可以根据指令生成的微操作数(以及它们去往的端口)做出一些推断,table 发现 here。例如,读-操作和读-修改-写指令被分成几部分。一些指令会生成大量微操作,例如浮点超越,使这些指令更像是一种可能在其他指令之上实现的内置函数。执行可变工作量的指令也会生成可变数量的微操作,例如 rep movs。所以 µops 看起来像 RISC 指令,但后来我们已经知道了。