5.1.6 非线性流水线的调度技术
在线性流水线中,由于每一个任务在流水线的每一流水段中都流过一次,而且仅流过一次,因此,可以在每一个时钟周期向流水线输入一个新任务。在流水线充满之后,每一时钟周期从流水线的输出端产生一个结果,所以,线性流水线的调度非常简单。然而,在非线性流水线中,由于存在有反馈回路,当一个任务在流水线中流过时,在同一个流水段中可能要经过多次。因此,就不能每一个时钟周期向流水线输入一个新任务,否则会发生在同一个时刻有几个任务争用同一个流水段的情况,这种情况称为功能部件冲突,或流水线冲突。
为了避免流水线发生冲突,一般采用延迟输入新任务的方法。那么,在非线性流水线的输入端,究竟每间隔多少个时钟周期向流水线输入一个新任务才能使流水线的各个流水段都不发生冲突,这就是非线性流水线的调度问题。当然,在一般情况下,这个间隔的时钟周期数应该愈小愈好。在许多非线性流水线中,间隔的周期数往往不是一个常数,而是一串周期变化的数字;因此,非线性流水线调度的任务是要找出一个最小的循环周期,按照这周期向流水线输入新任务,流水线的各个流水段都不会发生冲突,而且流水线的吞吐率和效率最高。
以下,首先介绍非线性流水线的表示方法,然后分析非线性流水线中的冲突情况,并且介绍无冲突调度方法,最后是非线性流水线的优化调度方法。
图5.13(a)是一条由4个流水段组成非线性流水线,它与一般线性流水线相同的地方是都有从第一个流水段到最后一个流水段的单方向传输线;它与一般线性流水线明显不同的地方有两个;一是有两条反馈线和一条前馈线,二是非线性流水线的输出端经常不在最后一个流水段,而可能从中间的任意一个流水段输出。
一条线性流水线通常只用各个流水段之间的连接图就能够表示清楚,但是,在非线性流水线中,由于一个任务在流水线的各个流水段中不是线性流动的,有些流水段要反复使用多次,因此,只用如图5.14(a)那样的流水段之间的连接图并不能正确地表示一条非线性流水线的工作过程。
为了表示非线性流水线中各个流水段的工作情况,通常采用如图5.14(b)所示流水线预约表。预约表的横坐标表示流水线的时钟周期,纵坐标表示流水线的各个流水段,中间有"×"的表示该流水段在这一个时钟周期处于工作状态,即在这个时钟周期有任务通过这个流水段,空白的地方表示该流水段在这个时钟周期不工作。一行中可以有多个"×",其含义是一个任务在不同时钟周期重复使用了同一个流水段,一列中有多个"×"是指在同一个时钟周期同时使用了多个流水段。预约表的行数就是非线性流水线的段数,这与线性流水线相同,而预约表的列数是指一个任务从进入流水线到从流水线中输出所经过的时钟周期数。