我看到了很多关于微程序指令的文献。
它们是什么,为什么要使用它们?
我看到了很多关于微程序指令的文献。
它们是什么,为什么要使用它们?
中央处理器读取机器码并将其解码为内部控制信号,将正确的数据发送到正确的执行单元。
大多数指令映射到一个内部操作,并可以直接解码。例如,在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或其他体系结构时讨论计算机体系结构时。要了解更多关于x86 CPU内部的知识,请参阅x86标签wiki,特别是Agner Fog的微架构指南。
此外,David Kanter对x86微架构的深入研究有助于理解uop经过的流水线:Core 2和Sandy Bridge是主要的,还有AMD K8和Bulldozer文章可以用来进行比较。
RISC vs. CISC仍然很重要(2000年2月)由Paul DeMone撰写,看看PPro如何将指令分解为uop,与大多数指令已经简单到只需在一个步骤中通过管道的RISC相比,只有少数像ARM推/弹出多个寄存器需要向下发送多个内容(在RISC术语中称为微代码)。
为了更好地理解流水线和乱序执行的基础知识,建议阅读《现代微处理器90分钟指南》。在一些旧的/简单的CPU中,每个指令实际上都是微代码。例如,6502通过运行来自PLA解码ROM的内部指令序列来执行6502指令。这对于非流水线CPU很有效,其中使用CPU的不同部分的顺序可以因指令而异。