与 K8 处理器类似,Core 微架构会对取出的指令进行预解码。预解码信息包括指令长度和解码边界。
Core 微架构装备了4组解码单元,这是X86处理器世界的第一次。这4组解码单元包括3组简单解码单元和1组复杂解码单元。实际上,这种把简单指令与复杂指令分而治之的做法,并非是 P6 微架构的专利。从全世界第一个流水线化的X86处理器——80486开始,为了加速简单指令的执行,这原则就已经开始主导所有高速X86处理器的微架构。就算是号称提供三组“完整解码单元”的 AMD K7、K8 处理器,实际上也有类似的限制。
在介绍下面的内容之前,首先让我们解释一下什么是微指令(Micro-Op)。由于X86指令集的指令长度、格式与定址模式都相当复杂,为了简化数据通路(Data Path)的设计,从很久以前开始,X86处理器就采用了将X86指令解码成1个或多个长度相同、格式固定、类似RISC指令形式的微指令的设计方法,尤其是涉及存储器访问的 load 及 store 指令。所以,现在的X86处理器的执行单元真正执行的指令是解码后的微指令,而不是X86指令。
所以,对X86处理器来说,解码单元的任务不仅仅是解码出操作码和操作数的地址,还要把长度从1字节到15字节不等的X86指令转化成容易调度和执行的固定长度的类似RISC指令的微指令(Micro-Op)。
常见的普通X86指令可以由3组简单解码单元中的任何一组翻译成1条微指令。另外1组复杂解码单元负责解码一些复杂的、需要翻译成4条微指令的X86指令。还有一些更长、更复杂的X86指令,需要微码序列器配合复杂解码单元来翻译成微指令。这种简单解码单元与复杂解码单元相配合的解码方式被现代的X86处理器所普遍采用,包括 P6 微架构、K7 处理器、K8处理器和 Pentium 4 处理器。
Core 微架构中的解码单元还拥有更多新特性。首先是宏指令融合技术(Macro-Op Fusion)。该技术可以把2条相关的X86指令融合为1条微指令。例如,X86比较指令cmp可以与跳转指令jne融合。这类情况一般发生在程序中的if-then-else分支语句中。
宏指令融合技术带来的效果是非常明显的。在一个传统的X86程序中,每10条指令就有2条指令可以被融合。也就是说,宏指令融合技术的引入可以减少10%的指令数量。而当2条X86指令被融合的时候,4组解码单元在单周期内一共可以解码5条X86指令。被融合的指令在后面的操作中完全是一个整体,这带来几个优势:更大的解码带宽,更少的空间占用,和更低的调度负载。如果 Intel 宣称的“每10条指令可以融合1次”的说法属实,那么宏指令融合技术本身就将带来巨大的性能提升。
另外一项技术即微指令融合技术,是从之前的 Pentium M 处理器继承而来的。介绍这项技术之前,我们先来了解一下相关的问题和早期的解决办法。有一小部分X86指令处理起来非常困难,但是同时又是十分典型和常见的X86指令。一般来说,存储器寻址的算术操作就属于这一类指令,例如,ADD [mem], EAX。这表示把寄存器EAX的内容与地址为mem的内存单元的内容相加,并把计算结果写回该内存单元。
在早期的处理器设计中,包括采用 P6 微架构的Pentium Pro、Pentium II 和 Pentium III 处理器,如果遇到这种类型的指令,那么解码单元将把它解码成2条甚至3条微指令。记住,从 P6 微架构之后的现代X86处理器的设计思想是把X86指令解码成类似RISC指令的微指令,然后再把这些微指令送往越来越RISC化的后端,而后端以类似RISC处理器的处理方式进行调度、发射、执行和退出。
对于类似ADD [mem], EAX这样的指令,你没有办法送往RISC化的执行单元,因为它违反了 RISC 架构的根本规则——RISC 架构的处理器会把所有的数据 load 到寄存器,然后针对寄存器进行操作、计算等。
因此,ADD [mem], EAX这条指令会被解码成多条微指令,简单示意如下:
MOV EBX, [mem]:读取[mem]的内容到寄存器
ADD EBX, EAX:对2个寄存器作ALU操作
MOV [mem], EBX:保存计算结果到[mem]
自从 Banias 处理器之后,上面的load操作和ALU操作就可以用一条微指令来完成了。Intel 把该技术称为微指令融合技术(Micro-Op Fusion)。这项技术不是一件容易的事情:在旧的设计中,把load操作与ALU操作一起进行会导致对应的那一级流水线延迟加大,从而降低处理器所能达到的最高频率。(在处理器设计中,可能达到的最高频率取决于最慢的那一级流水线的延迟时间,即所谓的木桶效应。)只有可以并行执行、设计优秀的电路才使得在引入微指令融合技术的同时不显著降低处理器的频率。
在预解码的阶段,处理器会识别可以应用微指令融合技术的指令。在解码阶段,类似 ADD [mem], EAX 的复杂指令就可以生成比旧架构数量更少的微指令。与宏指令融合技术带来的效果类似,这可以带来更大的解码带宽,更少的空间占用,更低的调度负载和更高的效率。
微指令融合技术的目的就在于减少微指令的数目。处理器内部执行单元的资源有限,如果可以减少微指令的数目,就代表实际执行的X86指令增加了,可以显著提升执行效能。而且,微指令的数目减少还有助于降低处理器功耗,可谓有益无害。
微指令融合技术所支持的范围,包括了整数运算、浮点运算和SSE2指令集等各种扩展指令集。根据 Intel 的官方说法,通过微指令融合技术,整数运算大约可以提升5%的性能,浮点运算大约可以提升9%的性能。
Core 微架构前端的改进还包括分支预测单元。分支预测行为发生在取指单元部分。首先,它使用了很多人们已经熟知的预测单元,包括传统的 NetBurst 微架构上的分支目标缓冲区(Branch Target Buffer,简称BTB)、分支地址计算器(Branch Address Calculator,简称BAC)和返回地址栈(Return Address Stack,RAS)。然后,它还引入了2个新的预测单元——循环回路探测器(Loop Detector,简称LD)和间接分支预测器(Indirect Branch Predictor,简称IBP),其中循环回路探测器可以正确预测循环的结束,而间接分支预测器可以基于全局的历史信息做出预测。Core 微架构在分支预测方面不仅可以利用所有这些预测单元,还增加了新的特性:在之前的设计中,分支转移总是会浪费流水线的一个周期;Core 微架构在分支目标预测器和取指单元之间增加了一个队列,在大部分的情况下可以避免这一个周期的浪费。