什么是微指令?

14

我看到了很多关于微程序指令的文献。

它们是什么,为什么要使用它们?


6
一句话概括就是,微程序控制的中央处理器类似于基于操作码的高级语言解释器:裸机语言指令被分解成更小的步骤,以便更容易执行。维基百科有一个不错但带术语的长说明,然而一份真正的解释需要整本计算机体系结构教材。 - zwol
1个回答

19

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

大多数指令映射到一个内部操作,并可以直接解码。例如,在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个uops。有趣的是,使用3个MOV指令和临时寄存器进行交换所得到的uops并不完全相同,因为它们不是零延迟的。

在Intel/AMD CPU中,"微码化"意味着解码器打开微代码序列以从ROM中提供uops进入流水线,而不是直接产生多个uops。

在纯RISC术语下,你可以将任何多重操作的x86指令称为“微码化的”,但我认为使用“微码化的”这个术语有助于区分不同的含义。我认为,在x86优化领域,比如英特尔的优化手册中,这种含义是广泛存在的。其他人可能会对术语使用不同的含义,尤其是在比较x86和RISC或其他体系结构时讨论计算机体系结构时。
在当前的英特尔CPU中,解码器可以直接生成的极限(融合域)为4个uops。AMD同样拥有FastPath(又名DirectPath)单个或双个指令(1或2个“宏操作码”,AMD相当于uops),超出这个范围就是VectorPath,也称为Microcode,正如David Kanter深入研究AMD Bulldozer所解释的那样,具体涉及到其解码器。
另一个例子是x86的整数DIV指令,即使在像Haswell这样的现代Intel CPU上也是微代码。但不适用于AMD; AMD只有一个或两个uop激活整数除法器内部的所有内容。这并非DIV的基本原理,而是实现选择。有关数字,请参见我的答案C ++代码,用于比手写汇编更快地测试Collatz猜想-为什么?
FP除法也很慢,但被解码为单个uop,因此不会成为前端瓶颈。如果FP除法很少且不是延迟瓶颈的一部分,则可以像乘法一样便宜。 (但是,如果执行必须等待其结果,或者在吞吐量上存在瓶颈,则速度要慢得多。)更多信息请参见this answer
整数除法和其他微码指令可能会给CPU带来困难,产生效果,使代码对齐变得重要,而在其他情况下则不是。

要了解更多关于x86 CPU内部的知识,请参阅标签wiki,特别是Agner Fog的微架构指南

此外,David Kanter对x86微架构的深入研究有助于理解uop经过的流水线:Core 2Sandy Bridge是主要的,还有AMD K8和Bulldozer文章可以用来进行比较。

RISC vs. CISC仍然很重要(2000年2月)由Paul DeMone撰写,看看PPro如何将指令分解为uop,与大多数指令已经简单到只需在一个步骤中通过管道的RISC相比,只有少数像ARM推/弹出多个寄存器需要向下发送多个内容(在RISC术语中称为微代码)。

为了更好地理解流水线和乱序执行的基础知识,建议阅读《现代微处理器90分钟指南》

与现代x86非常不同的背景下该术语的其他用途

在一些旧的/简单的CPU中,每个指令实际上都是微代码。例如,6502通过运行来自PLA解码ROM的内部指令序列来执行6502指令这对于非流水线CPU很有效,其中使用CPU的不同部分的顺序可以因指令而异。


历史上,“微码”有一个不同的技术含义,指的是从指令字中解码出来的内部控制信号之类的东西。特别是在像MIPS这样的CPU中,指令字直接映射到这些控制信号,而不需要复杂的解码。(我可能有些错误;我读到过类似的内容(除了在这个问题的已删除答案中),但后来找不到了。) 在设计简单的流水线CPU时,比如业余MIPS,这个含义可能仍然被使用。

虽然你对OP的解释比我认为的必要性更详细,但我觉得很有趣的是,我说了同样的话,从+2票变成了-1票,而你却因为说了同样的话而得到了+1票。然而,你可能会通过使用汇编语言指令(如xchg和div)来使OP感到困惑。这就是他困惑的根源,而我试图用更简单的术语来缓解那些刚开始学习基础知识的人的困惑。 - Rob
2
@Rob:你的回答称,某些指令被解码是微代码。它没有说到一些指令会触发一个来自微码ROM的内部指令流,而另一些指令则直接影响控制信号(虽然在现代x86 CPU中,即使是单个微操作指令也要经过复杂的乱序处理)。一些ISA(例如MIPS)的某些设计根本不使用微代码,指令位可以直接解码为控制信号。 - Peter Cordes
因为我不想让他陷入比他能理解的更深的管道中。我甚至提到它会变得更加复杂。 - Rob
3
@Rob:我理解简化是个好主意,但我认为你没有成功,不幸的是最终说了一些不正确的话。 - Peter Cordes
@PeterCordes 为了澄清一些事情,如果我要进行内存添加,它实际上会像在ARM中一样读取、添加和存储。这是因为ARM是一种RISC机器吗? - user6754053
1
@MarkYisri:你是在问为什么ARM没有内存目的ADD指令吗?是的,那是因为它是一种装载/存储体系结构,普通指令不能有内存操作数。这与RISC体系结构高度相关或是其一部分。只是为了明确,x86将其解码为3或4个内部uop,但它仍然不是“微码化”的。解码器内置了该uop模式,并且不必将CPU重定向到微码ROM。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接