::  ::  ::  ::  :: 管理

core架构 指令解码

Posted on 2008-06-11 23:08 nt05 阅读(374) 评论(0)  编辑 收藏 引用 所属分类: 硬件

Core架构的解码指令

  与 K8 CPU类似,Core 架构会对取出的指令进行预解码。预解码信息包括指令长度和解码边界。

  Core 架构配备了4组解码单元,这是X86CPU世界的第一次。这4组解码单元包括3组简单解码单元和1组复杂解码单元。这些解码单元的功能,不仅在于翻译接收 到的指令本身如操作码、地址等,同时也将其从1-15字节可变长度转换为类似RISC那样固定长度指令(一般称为micro-ops),这将大大提高指令 的执行效率。

  大部分常见的x86指令将会被三个简单解码单元转换为简单的micro-op,而需4个micro-ops流程的指令,则由复杂解码单元负责解 码。严格说来,这种把简单指令与复杂指令分而治之的做法,并非是 P6 架构的专利,从第一个流水线化的X86 CPU 80486开始,为了加速简单指令的执行,这原则就已经开始主导所有高速X86CPU的架构,就算是号称提供三组“完整解码单元”的 AMD K7、K8 CPU,实际上也有类似的限制。

  在介绍下面的内容之前,首先让我们解释一下什么是微指令(Micro-Op)。由于X86指令集的指令长度、格式与定址模式都相当复杂,为了简 化数据通路(Data Path)的设计,从很久以前开始,X86CPU就采用了将X86指令解码成1个或多个长度相同、格式固定、类似RISC指令形式的微指令的设计方法,尤 其是涉及存储器访问的 load 及 store 指令。所以,现在的X86CPU的执行单元真正执行的指令是解码后的微指令,而不是X86指令。

  所以,对X86CPU来说,解码单元的任务不仅仅是解码出操作码和操作数的地址,还要把长度从1字节到15字节不等的X86指令转化成容易调度和执行的固定长度的类似RISC指令的微指令(Micro-Op)。

  常见的普通X86指令可以由3组简单解码单元中的任何一组翻译成1条微指令。另外1组复杂解码单元负责解码一些复杂的、需要翻译成4条微指令的 X86指令。还有一些更长、更复杂的X86指令,需要微码序列器配合复杂解码单元来翻译成微指令。这种简单解码单元与复杂解码单元相配合的解码方式被现代 的X86CPU所普遍采用,包括 P6 架构、K7 CPU、K8CPU和 Pentium 4 CPU。

  Core 架构中的解码单元还拥有更多新特性。首先是宏指令融合技术(Macro-Op Fusion)。该技术可以把2条相关的X86指令融合为1条微指令。例如,X86比较指令cmp可以与跳转指令jne融合。这类情况一般发生在程序中的 if-then-else分支语句中。

Core 架构的指令融合
宏指令融合技术

  宏指令融合技术带来的效果是非常明显的。在一个传统的X86程序中,每10条指令就有2条指令可以被融合。也就是说,宏指令融合技术的引入可以 减少10%的指令数量。而当2条X86指令被融合的时候,4组解码单元在单周期内一共可以解码5条X86指令。被融合的指令在后面的操作中完全是一个整 体,这带来几个优势:更大的解码带宽,更少的空间占用,和更低的调度负载。如果 Intel 宣称的“每10条指令可以融合1次”的说法属实,那么宏指令融合技术本身就将带来巨大的性能提升。

  另外一项技术即微指令融合技术,是从之前的 Pentium M CPU继承而来的。介绍这项技术之前,我们先来了解一下相关的问题和早期的解决办法。有一小部分X86指令处理起来非常困难,但是同时又是十分典型和常见 的X86指令。一般来说,存储器寻址的算术操作就属于这一类指令,例如,ADD [mem], EAX。这表示把寄存器EAX的内容与地址为mem的内存单元的内容相加,并把计算结果写回该内存单元。

  在早期的CPU设计中,包括采用 P6 架构的Pentium Pro、Pentium II 和 Pentium III CPU,如果遇到这种类型的指令,那么解码单元将把它解码成2条甚至3条微指令。记住,从 P6 架构之后的现代X86CPU的设计思想是把X86指令解码成类似RISC指令的微指令,然后再把这些微指令送往越来越RISC化的后端,而后端以类似 RISCCPU的处理方式进行调度、发射、执行和退出。

  对于类似ADD [mem], EAX这样的指令,你没有办法送往RISC化的执行单元,因为它违反了 RISC 架构的根本规则——RISC 架构的CPU会把所有的数据 load 到寄存器,然后针对寄存器进行操作、计算等。

  因此,ADD [mem], EAX这条指令会被解码成多条微指令,简单示意如下:

  MOV EBX, [mem]:读取[mem]的内容到寄存器
  ADD EBX, EAX:对2个寄存器作ALU操作
  MOV [mem], EBX:保存计算结果到[mem]

  自从 Banias CPU之后,上面的load操作和ALU操作就可以用一条微指令来完成了。Intel 把该技术称为微指令融合技术(Micro-Op Fusion)。这项技术不是一件容易的事情:在旧的设计中,把load操作与ALU操作一起进行会导致对应的那一级流水线延迟加大,从而降低CPU所能 达到的最高频率。(在CPU设计中,可能达到的最高频率取决于最慢的那一级流水线的延迟时间,即所谓的木桶效应。)只有可以并行执行、设计优秀的电路才使 得在引入微指令融合技术的同时不显著降低CPU的频率。

  在预解码的阶段,CPU会识别可以应用微指令融合技术的指令。在解码阶段,类似 ADD [mem], EAX 的复杂指令就可以生成比旧架构数量更少的微指令。与宏指令融合技术带来的效果类似,这可以带来更大的解码带宽,更少的空间占用,更低的调度负载和更高的效 率。

  微指令融合技术的目的就在于减少微指令的数目。CPU内部执行单元的资源有限,如果可以减少微指令的数目,就代表实际执行的X86指令增加了,可以显著提升执行效能。而且,微指令的数目减少还有助于降低CPU功耗,可谓有益无害。

  微指令融合技术所支持的范围,包括了整数运算、浮点运算和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 架构在分支目标预测器和取指单元之间增加了一个队列,在大部分的情况下可以避免这一个周期的浪费。