非线性流水性调度问题的研究
问题的提出
在解释问题之前,先介绍如下几个概念。
流水线技术:将一个重复的时序过程分解成为若干个子过程,而每一个子过程都可有效地在其专有功能段上与其他子过程同时执行的技术。流水线可按不同的观点进行分类,比如根据流水线中是否有反馈回路可分为线性流水性和非线性流水性。
线性流水线:流水线的各段串行连接,没有反馈回路。图1-1就是一种简单的线性流水线。
图1-1 线性流水线
非线性流水线:非线性流水线不同于线性流水线,线性流水线是一段接一段地往后走,它的连接关系是唯一的。非线性流水线中某一段或某些段可能有反馈信号,这就是线性流水线和非线性流水线的区别。一个典型的非线性流水线连接图如图1-2所示。
图1-2 非线性流水线的连接图
因为有反馈信号,所以非线性流水线的连接图就不能唯一地反映流水线的工作情况。1971年,E.S.Davidson提出使用一个二维的预约表来描述一个任务在非线性流水线对各功能段的使用情况。值得说明的是:一张非线性流水线的预约表可能与多个非线性流水线的连接图相对应;一个非线性流水线的连接图也可能与多个非线性流水线的预约表相对应。
采用非线性流水线会发生流水线冲突(也叫功能部件冲突),这主要是由于在非线性流水线中存在反馈回路。当一个任务在流水线流过时,在同一功能段可能要经过几次,这样,如果仍像线性流水线那样,每个时钟周期输入一个任务就会发生几个任务争用同一个功能段的情况。如何避免这一问题就是非线性流水线的调度问题。
问题分析与解决
流水线输入两个任务间隔的时钟周期数叫做启动周期。非线性流水线调度的任务就是找出一个最小的启动循环周期,按照这个周期向流水线输入任务,流水线的各个功能段都不会发生冲突,也就是同一时间只有一个任务进入到这个流水线,在不发生冲突的情况下尽量提高流水线的效率和吞吐率。
下面以一条非线性流水线为例,说明非线性流水线的调度方法。
1、 写出流水线的禁止向量和初始冲突向量。
2、 画出调度流水线的状态图。
3、 求流水线的最小启动循环和最小平均启动距离。
4、 求平均启动距离最小的恒定循环。
把一条非线性流水线的所有禁止启动距离组合在一起就形成了一个数列,通常把这个数列称为非线性流水线的禁止向量。
由预约表得到禁止向量的方法很简单,只要把预约表的每一行中任意两个“√”之间的距离计算出来,去掉重复的,由这种数组成的一个数列就是这条非线性流水线的禁止向量。例如,对于图1-3所示的预约表,第2行的第2列与第8列的两个“√”之间的距离为6;第3行的第3列与第7列之间的距离为4;第4行的第4列与第6列之间的两个“√”之间的距离为2,因此,图1-3所示的非线性流水线的禁止向量为(2,4,6)。
时间 流水段 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
S1 | √ |
|
|
|
|
| √ |
S2 |
| √ |
|
|
| √ |
|
S3 |
|
| √ |
| √ |
|
|
S4 |
|
|
| √ |
|
|
|
图1-3 一条非线性流水线的预约表
根据一张预约表的禁止向量很容易就可以得到冲突向量。冲突向量用一个m位的二进制数表示,其中m是禁止向量中的最大值。对于一张k列的预约表,有m≦k-1。一般地,禁止向量用C=(Cm-1Cm-2…C2C1)来表示,如果i在禁止向量中,则Ci =1,否则为0。其中Cm一定为1,因为m必定在禁止向量中。对于图1-3所示的预约表,冲突向量为 C=(101010)。
现在已经有冲突向量了,下面我们构造一张状态图。把下面得到的冲突向量C作为初始冲突向量送入一个m位逻辑右移器,当从移位器移出的位为0时,用移位器中的值与初始冲突向量做“按位或”运算,得到一个新的冲突向量;若移位器移出的位为1,不做任何处理;移位器继续右移,如此重复,这样的操作共进行m次。对于中间形成的每一个冲突向量,也要按照这一方法进行处理。在初始冲突向量和所有新形成的冲突向量之间用带箭头的线连接,表示各种状态之间的转换关系,在箭头旁标上移动的次数。当新形成的冲突向量重复时,将他们合并在一起。如下操作过程:
图1-3
3 |
101111 |
101011 |
图1-4 非线性流水线的状态图
初始冲突向量为101010,它逻辑右移2、4、6位时,由于移出去的位是1,表示用这些启动距离向流水线输入新任务,在流水线中会发生功能段的冲突,因此,在状态图中不做任何处理。当逻辑右移的位数为1、3、5和大于等于7时,移出去的位是0,表示用这些启动距离向流水线输入新任务时,在流水线的各个功能段中都不会发生冲突。在输入这个新任务之后,流水线又将产生新的冲突向量,这时,要根据新的产生的冲突向量来判断流水线发生冲突的情况。
当初始冲突向量确定之后,状态图就是唯一的,因此,与一张预约表相对应的只有唯一的一个状态图。但是,由于不同的预约表可能产生相同的初始向量,因而,不同的预约表也可能有相同的状态图。
从状态图可以看到,当启动距离大于或等于m+1时,流水线的任何一个功能段在任何时钟周期都不会发生冲突,但是,这时流水线的吞吐率、加速比和效率都将很差,因此,非线性流水线调度的任务就是找出平均启动距离小于m的启动循环,按照这个启动循环向流水线的输入端输入新任务,流水线的任何一个功能段在任何时钟周期都不会发生冲突。
从状态图中可以找到很多不发生功能段冲突的启动循环。从状态图看就是回路。实际上,这样的启动循环有无穷多个。例如有(1,7)、(5,7)、(3,5,7)等都是简单循环(简单循环就是指在状态图中各种冲突向量只经过一次的启动循环),而(3,5,3,7)、(3,5,5,3,7)等不是简单循环。因为非流水线调度的主要目标是找出平均启动距离最小的启动循环,因此,在这些无穷多个启动循环中,只要找到简单循环即可。在一个状态图中,简单循环的个数是有限的。
把一个启动循环内的所有启动距离相加,再除以这个启动循环内的启动距离个数,就得到这个启动循环的平均启动距离。例如,启动循环(1,7)的平均启动距离就是4。状态图1-4中的简单循环共有8个,其中最小的启动循环是(1,7)或(3,5),其平均启动距离是4,当非线性流水线按照最小启动循环(1,7)工作时,在向流水线输入第1个任务之后,在紧接着的下一个时钟周期向流水线输入2个任务,然后再相隔7个时钟周期(时钟周期9),如此重复,连续向流水线输入新任务,则流水线的各个功能段在任何时钟周期都不会发生冲突。
图1-5分别给出了图1-3这条流水线按照最小启动循环工作时的预约表,从图中可以看到,按照最小启动循环启动,确实不会发生流水线冲突。
时间 流水线 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
S1 | √1 |
|
| √2 |
|
| √1 |
| √3 | √2 |
| √4 |
|
| √3 |
S2 |
| √1 |
|
| √2 | √1 |
|
| √2 | √3 |
|
| √4 | √3 |
|
S3 |
|
| √1 |
| √1 | √2 |
| √2 |
|
| √3 |
| √3 | √4 |
|
S4 |
|
|
| √1 |
|
| √2 |
|
|
|
| √3 |
|
| √4 |
(a)
时间 流水线 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
S1 | √1 | √2 |
|
|
|
| √1 | √2 | √3 | √4 |
|
|
|
| √3 |
S2 |
| √1 | √2 |
|
| √1 | √2 |
|
| √3 | √4 |
|
| √3 | √4 |
S3 |
|
| √1 | √2 | √1 | √2 |
|
|
|
| √3 | √4 | √3 | √4 |
|
S4 |
|
|
| √1 | √2 |
|
|
|
|
|
| √3 | √4 |
|
|
(b)
图1-5 无冲突调度的预约表
(a)最小启动循环(3,5)的流水线状态(b)最小启动循环(1,7)的流水线状态
总结:
此方法能比较好的解决非线性流水线的冲突,但计算过程比较繁琐。
标准文件可以下载我上传的pdf文件,其中密码是:000123