• 内容讲解

一条具体的指令执行过程,通常可以分为五个部分:取指令、指令译码、取操作数、运算(ALU)、写结果。其中前三步一般由指令控制器完成,后两步则由运算器完成。按照传统的方式,所有的指令均为顺序执行:首先指令控制器工作,完成第一条指令的前三步,然后运算器工作,完成后两步;接着指令控制器工作,完成第二条指令的前三步,然后运算器工作,完成第二条指令的后两步……。很明显,当指令控制器工作时,运算器基本上处于空闲状态,而当运算器工作时,指令控制器又处于空闲状态,造成相当大的资源浪费。一个显而易见的解决方法是,在完成第一条指令的前三步后,指令控制器不等运算器完成第一条指令的后两步,就立即开始第二条指令的操作,对于运算器也是如此,这就形成了一种与工厂中的装配流水线类似的流水线。

为了实现流水,首先必须把输入的任务分割为一系列的子任务,使各子任务能在流水线的各个阶段并发地执行。将任务连续不断地输入流水线,从而实现子任务级的并行。流水处理大幅度地改善了计算机的系统性能,是在计算机上实现时间并行性的一种非常经济的方法。

在流水线中,原则上要求各个阶段的处理时间都相同。若某一阶段的处理时间较长,势必造成其他阶段的空转等待。因此,对子任务的划分,是决定流水线性能的一个关键因素,它取决于操作部分的效率,所期望的处理速度,以及成本价格等等。

假定作业T被分成k个子任务,可表达为

T={T1,T2,···,Tk}

各个子任务之间有一定的优先关系:若i<j,则必须在 Ti 完成以后,Tj才能开始工作。各子任务之间具有这种线性优先关系的流水线称为线性流水线。线性流水线的硬件基本结构如图2-10所示。

222.gif

图中,处理一个子任务的过程为过程段(Si)。线性流水线由一系列串联的过程段组成,各个过程段之间设有高速缓冲寄存器(L),以暂时保存上一过程子任务处理的结果。在一个统一的时钟(C)的控制下,数据从一个过程段流向下一个相邻的过程段。

设过程段 Si所需的时间为τi,缓冲寄存器的延时为τl,线性流水线的时钟周期定义为:

τ = max{τi} + τl                                                       (式2-16)

流水线处理的频率f=1/τ。

在流水线处理中,当任务饱满时,任务源源不断地输入流水线,不论有多少级过程段,每隔一个时钟周期总能输出一个任务。从理论上说,一个具有k 级过程段的流水线处理 n 个任务需要的时钟周期数为:

Tk=k+(n-1)                                                        (式2-17)

其中k个时钟周期用于处理第一个任务。k个周期后,流水线被装满,剩余的n-1个任务只需n-1个周期就完成了。

如果用非流水线的硬件来处理这n个任务,时间上只能串行进行,则所需时钟周期数为:

TL=n·k                                                             (式2-18)

将TL和Tk的比值定义为k级线性流水线的加速比:

    223.gif         

当n>>k时,Ckàk,也就是说,理论上k级线性流水线处理几乎可以提高k倍速度。但实际上,由于存储器冲突、数据相关等原因,这个理想的加速比不一定能达到。