我看过很多参考微编码指令的文献。
这些是什么以及为什么使用它们?
答案 0 :(得分:13)
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指令与刮擦寄存器进行交换时,你得到的uops并不完全相同,因为它们不是零延迟。
在Intel / AMD CPU上,“微编码”意味着解码器打开微代码序列器,将uop从ROM输入管道,而不是直接产生多个uop。
在目前的英特尔CPU中,解码器可以直接生成的限制,无需使用微代码ROM,是4 uops(融合域)。 AMD类似地有FastPath单指令或双指令,除此之外它是VectorPath或Microcode,正如in David Kanter's in-depth look at AMD Bulldozer所述,特别是谈论它的解码器。
另一个例子是x86的整数DIV指令,即使在像Intel Haswell这样的现代CPU上也是微编码的。有关数字,请参阅Why is this C++ code faster than my hand-written assembly for testing the Collatz conjecture?上的答案。
FP划分也很慢,但是被解码为单个uop,因此它不会成为前端的瓶颈。如果FP划分很少并且不是延迟瓶颈的一部分,它可以像乘法一样便宜。 (但如果执行必须等待其结果或其吞吐量的瓶颈,则 更慢。)
整数除法和其他微编码指令会给CPU带来困难,creates effects that make code alignment matter where it wouldn't otherwise.
要了解有关x86 CPU内部的更多信息,请参阅x86标记wiki,尤其是Agner Fog's microarch guide。
在一些较旧/较简单的CPU中,每条指令都是有效的微编码。例如,6502执行了6502条指令by running a sequence of internal instructions from a PLA decode ROM。这适用于非流水线CPU,其中使用CPU的不同部分的顺序可能因指令而异。
历史上,“微码”有不同的技术含义,意思是从指令字解码的内部控制信号。特别是在像MIPS这样的CPU中,指令字直接映射到那些控制信号,而不需要复杂的解码。 (我可能有部分错误;我读过这样的内容(除了在这个问题上删除的答案)但后来再也找不到了。)