MIPS的五级流水线

MIPS体系结构是为流水线而设计的,图1.2接近于最早期的MIPS CPU和许多典型的MIPS 流水线。只要CPU从高速缓存中运行,每条MIPS指令的执行过程就分为五级,每一级称为一个流水线阶段,每个阶段占用固定的时间。这个固定的时间通常就是一个处理器时钟周期(但有些操作只用半个时钟周期,所以MIPS的五级流水线只用了四个时钟周期)。

1278904198_473b61f3.jpg

图1.2:MIPS的五级流水线

所有的指令都经过严格定义,即使在流水线的某一级没有任何操作也要遵循同样的流水线序列。最终的结果就是,只要保持高速缓存命中,CPU就能在每个时钟周期完成一条指令。
我们对照图1.2,讨论一下每个流水阶段发生的事情。
(1)IF取指(insturction fetch),从指令高速缓存(I-cache)获取下一条指令

(2)RD读取寄存器(read register),读取该指令的源寄存器域指定的CPU寄存器的内容

(3)ALU算术逻辑单元(arithmetic/logic unit)在一个时钟周期内完成算术或者逻辑操作(浮点运算和整数乘除无法在一个时钟周期内完成,对其处理有所不同,后面会讲到这一点)。

(4)MEM访问内存(memory),该阶段指令可以读写数据高速缓存(D-cache)中的内存变量。平均而言,每四条指令中就有三条指令在该阶段没有任何操作,但是为每条指令都分配了这一阶段以确保不会出现两条指令同时需要访问数据高速缓存的情形

(5)WB写回寄存器(write back),将操作结果值写道寄存器堆中。

你也许见过别的看上去略有不同的MIPS流水线图。习惯上画的时候为了方便,把每个流水线阶段画的看上去好像都恰好用了一个时钟周期。后来的一些MIPS CPU的流水线更长或者有轻微改动,但是这种四个时钟周期的五级流水线式MIPS体系结构最初所用的,而且在一些简单的MIPS CPU中现在依然用的是与此非常相似的流水线。
严格的流水线要求限制了指令的某些操作。首先,它要求所有的指令都要一样长(正好一个机器字长32位),这样取指时间就可以是常数。这本身就不支持复杂的指令:例如指令中没有足够的位用来编码太过复杂的寻址模式。而且固定长度的指令直接导致了一个问题:在象x86这样的体系结构上的典型程序中,平均的指令长度为三个字节多一点。MIPS的代码要占用更多的存储空间。

其次,流水线设计排除了实现操作内存变量的指令。直到流水线的第四个阶段才从内存或高速缓存读写数据,这对ALU来说实在太晚了。内存访问仅仅用一个简单的load和store的指令在内存和寄存器间传送数据。

1987年投放市场的RISC CPU 工作的非常好,是因为在这些限制下设计的指令集被证明一点都不比那些复杂的指令集差,而后者给硬件带来太多的痛苦。1987年及其后的RISC有些共同的特征,就是围绕高效的流水线而设计的指令集和高速缓存的使用。

MIPS项目组的体系结构专家也参与了当时关于具备什么特征的CPU适合高效优化的编译器目标的思考。其中很多需求和流水线的需求是兼容的,所以MIPS CPU设计有32个通用寄存器和三操作数的算术/逻辑指令。幸运的是,那些打乱流水线的复杂的专用指令也常常是编译器不愿产生的。

--电子创新网--
粤ICP备12070055号