现代处理器的一些技术

304 阅读2分钟

现代处理器的一些技术

  • 涉及到的有流水线(超标量、VLIW、分支预测、预测技术)
  • 多核、 同时多线程(simultaneous multi-threading)STM
  • SIMD、向量指令
  • Cache 和存储层次体系

流水线 & 指令级并行

最开始,PC寄存器存放的是下一条指令的地址、IR寄存器存放的是当前执行的指令。在执行下一条指令时,根据PC寄存器里面存放的下一条指令的地址访存,得到指令,存入IR寄存器,完成了取指令阶段;

微操作         			微命令
ARI  <--- PC              ARIin、PCout
DR   <--- Memory[AR]	  DRSin、Mread、ARSout
IR   <--- DR	          IRin、DRIout

然后通过指令译码decode电路对取得的存放在IR寄存器的指令译码、确定指令的操作数,如直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、相对寻址、基址寻址、变址寻址等等。 这样一来,指令的执行很自然的可以利用流水线技术。

开始的时候引入了流水线技术,可以大幅提高性能,而仅需要较小的硬件支持。 将取指令、指令译码、取操作数、运算、以及存结果几个步骤。在各级流水线的部件之间,需要有寄存器将每一步的之间结果保存。 即流水线的结构是流水线的各个分离的部件是逻辑电路,在每一级部件后有寄存器。以便上一级结构存放运算结果,以及下一级从寄存器得到数据。为了解决可能出现的数据相关,需要在流水线中的旁路(bypass),将数据直接从下一级旁路到上一级部件,从而不需要等待上一条指令写数据(即上一条指令完整的流过流水线)后下一条指令才能取数。

mov dx, #100h
mov bx, #200h
add ax, dx
sub bx, ax
...

更深的流水线 Superpipeling

因为在流水线中时钟频率受到流水线耗时最长的部件的限制。

fmax=1max{流水线的各级耗时}f_{max} = \frac{1}{max\{流水线的各级耗时\}}

因此一个可行的办法就是缩短流水线每个部件的耗时,通过更细的划分流水线的每一个部件,尤其是之前流水线的最长的部件。这样一来流水线的深度增加了,流水线的级数变多了,每级的耗时减少了,处理器的时钟频率可以进一步的提高了。 X86处理器,例如奔腾4等流水线的深度达到了20+,很大原因是X86指令架构的指令更加复杂,更多的流水线深度被用来解码指令。

超标量 Superscalar

流水线提高性能的方式是增加吞吐量,让指令最大程度的细分,增加并行程度,增加吞吐量。流水线的每一级处理的事情都是不同的(取指令,指令解码,取操作数,运算,存数...),即完整的经过一次流水线即使执行一条指令的过程。

为了进一步的提高性能,引入了超标量处理器。即增加完整的流水线(之前整个CPU只有一套流水线)引入超标量之后即同时有多个流水线在互不影响的执行。这个流水线互不影响,所以流水线也不必设计成一样的(一样的物理结构,一样的深度...)这样一来,可以针对不同的指令优化不同的流水线,把简单的指令调度给简单的流水线处理,反之亦然。 引入超标量这种结构即多条流水线,每条流水线的深度又不尽相同,通常将执行整数运算的流水线深度称为处理器的深度,通常情况整数运算的流水线级数也是最小的。访存,浮点数计算指令等其他指令可能会有其他更加复杂的运算,通常流水线级数更深。不同的流水线之间可能也存在为了解决数据相关而引入的旁路(bypass)。 在超标量处理器中,每个时钟周期有多个流水线正在处理。这样 CPI 就小于1了,也可用IPC(>0)衡量。

VLIW(Very Long Instruction Word)

这类处理器,指令可以分为更小的一组指令, ...

指令调度、寄存器重命名、乱序执行

在流水线的情况下,分支指令会造成流水线旗袍。一旦流水线中出现气泡,会严重影响性能,可以通过指令重排序让这些空的流水线阶段执行其他的指令, 一种方法是在硬件层面运行时重排序。动态指令调度必须设计调度逻辑以最优的顺序重排序的执行指令。这即是乱序执行。 想要乱序执行,处理器必须首先知道指令间的依赖关系,可以不用管CPU体系结构的寄存器,而使用一组重命名的寄存器。例如,将寄存器的内容存入主存,将主存中另一个值存入寄存器。将指令中用到的寄存器映射为别的不会发生冲突的寄存器中,这是需要一个物理寄存器和虚拟寄存器的映射关系。这就是寄存器重命名技术。可以通过这种虚拟化技术(?)增加寄存器的数量,从而提高并行程度。 另一种方法是编译器的优化。在编译阶段,编译器已将对其进行了指令重排优化,这被称为静态指令调度,或者叫编译时指令调度。经过这种编译的程序可以执行在简单顺序执行的处理器上,从而避免了在硬件层面的复杂的指令重排,乱序执行,寄存器重命名等的复杂性。带来的好处有降低能耗,从而可以在相同的芯片面积上堆叠等多的核数,更大的Cache。

线程、SMT、 超线程、多核

待续...