赞
踩
在非线性流水线中,存在反馈回路,当一个任务在流水线中流过时,可能要多次经过某些段。
流水线调度要解决的问题:
预约表
本教材的例子:一个5功能段非线性流水线预约表 P65
预约表相关说明
n
个时钟周期使用第k
段,则在第k
行和第n
列的交叉处的格子里有一个√
(任意符号)。k
行和第n
列的交叉处的格子里有一个√
,则表示在第n
个时钟周期要使用第k
段。引入预约表的原因
⚠️:一张预约表可能与多个流水线连接图相对应,可能有多种反馈回路对应一张预约表
流水线的启动距离
禁用启动距离
启动距离和禁用启动距离一般都用时钟周期数来表示,是一个正整数。
最优调度方法
禁止表F:一个由禁用启动距离构成的集合。
具体方法
对于预约表的每一行的任何一对√
,用它们所在的列号相减(大的减小的),列出各种可能的差值,然后删除相同的,剩下的就是禁止表的元素。
对于下图的启动表
第一行的差值只有一个:8;第二行的差值有3个:1,5,6;第3行只有一个√或x,没有差值;第4和第5行的差值都只有一个:1;
其禁止表是:F= { 1,5,6,8 }
实质:进行从一个集合到一个二进制位串的变换
冲突向量C:一个N
位的二进制位串。
设
C
0
=
(
c
N
c
N
−
1
…
c
i
…
c
2
c
1
)
C_0=(c_{N}c_{N-1} \dots c_{i} \dots c_{2}c_{1})
C0=(cNcN−1…ci…c2c1),则:
C
i
=
{
1
i
∈
F
0
i
∉
F
\mathbf{C}_{\mathbf{i}}=\left\{
c
i
=
0
c_{i}=0
ci=0 :允许间隔i
个时钟周期后送入后续任务
c
i
=
1
c_{i}=1
ci=1 :不允许间隔i
个时钟周期后送入后续任务
对于上面的例子 F = { 1 , 5 , 6 , 8 } F= \{ 1,5,6,8 \} F={1,5,6,8},则 C 0 = ( 10110001 ) C_{0} =(10110001) C0=(10110001)
当第一个任务流入流水线后,初始冲突向量 C 0 C_{0} C0决定了下一个任务需间隔多少个时钟周期才可以流入。
假设第二个任务是在与第一个任务间隔j
个时钟周期流入,这时,由于第一个任务已经在流水线中前进了j
个时钟周期,其相应的禁止表中各元素的值都应该减去j
,并丢弃小于等于0的值。
对冲突向量来说,就是逻辑右移j位(左边补0
)。
j
位 )S H R ( j ) ( C 0 ) ∨ C 0 SHR^{(j)}(C_{0})∨ C_{0} SHR(j)(C0)∨C0
推广到更一般的情况
假设: C k C_{k} Ck:当前的冲突向量、 j j j: 允许的时间间隔
则新的冲突向量为:(⚠️所有计算都是与初始冲突向量
C
0
C_{0}
C0进行“或”操作)
S
H
R
(
j
)
(
C
k
)
∨
C
0
SHR^{(j)}(C_{k})∨ C_{0}
SHR(j)(Ck)∨C0
对于所有允许的时间间隔都按上述步骤求出其新的冲突向量,并且把新的冲突向量作为当前冲突向量,反复使用上述步骤,直到不再产生新的冲突向量为止。
从初始冲突向量 C 0 C_{0} C0出发,针对初始冲突向量每个0,反复应用上述步骤,可以求得所有的冲突向量以及产生这些向量所对应的时间间隔。由此可以画出用冲突向量表示的流水线状态转移图。
示例:对于禁止表 F = { 1 , 5 , 6 , 8 } F= \{ 1,5,6,8 \} F={1,5,6,8} 对应的初始向量 C 0 = ( 10110001 ) C_{0} =(10110001) C0=(10110001)
(1) 引入后续任务可用的时间间隔为:2、3、4、7
个时钟周期
(2)对于新向量(10111101),其可用的时间间隔为2个和7个时钟周期。用类似上面的方法,可以求出其后续的冲突向量分别为
(
10111101
)
(10111101)
(10111101)和
(
10110001
)
(10110001)
(10110001)。
(3)对于其他新向量,也照此处理。
(4)在此基础上,画出状态转移示意图。
以双功能(功能A和B)非线性流水线为例。
状态转移图中结点状态的表示
初始结点有两个,分别对应于第一个任务是A类和B类的情况。
A
类时,冲突矩阵为
M
A
(
0
)
M^{(0)}_{A}
MA(0)。B
类时,冲突矩阵为
M
B
(
0
)
M^{(0)}_{B}
MB(0)。
M
A
(
0
)
=
[
C
A
A
C
A
B
]
M
B
(
0
)
=
[
C
B
A
C
B
B
]
M_{A}^{(0)}=\left[
其中:
由下式求得后续状态的冲突矩阵
S
H
R
(
j
)
(
M
k
)
∨
M
r
(
0
)
SHR^{(j)}(M_{k})∨ M_{r}^{(0)}
SHR(j)(Mk)∨Mr(0)
其中:
示例:有一条3
段双功能非线性流水线,实现的功能是A
和B
,其预约表分别如表1
和表2
所示。各段的通过时间都是一个时钟周期。请找出该流水线单独处理A类
任务和单独处理B类
任务以及混合处理两类任务的最优调度方案。
解:
(1) 把两个预约表重叠起来,得到如表3所示的预约表。
(2)由预约表求初始冲突向量和初始冲突矩阵
M
A
(
0
)
=
[
C
A
A
C
A
B
]
M
B
(
0
)
=
[
C
B
A
C
B
B
]
M_{A}^{(0)}=\left[
S1
发生冲突,禁用时间间隔是:
4
−
2
=
2
4-2=2
4−2=2S2
,不会发生冲突,这是因为根据表3,A类任务先于B类任务通过S2,而现在的实际情况又是A类任务先于B类任务流入流水线;S3
发生冲突,禁用时间间隔是:
3
−
1
=
2
,
5
−
1
=
4
,
5
−
3
=
2
3-1=2,5-1=4,5-3=2
3−1=2,5−1=4,5−3=2S1
发生冲突,禁用时间间隔有:
2
−
1
=
1
,
5
−
1
=
4
,
5
−
4
=
1
2-1=1,5-1=4,5-4=1
2−1=1,5−1=4,5−4=1S2
发生冲突,禁用时间间隔是:
4
−
2
=
2
4-2=2
4−2=2S3
,不会发生冲突,这是因为根据表3,B类任务先于A类任务通过S3,或者同时通过S3(第3个时钟周期),而现在的实际情况又是B类任务先于A类任务流入流水线。(3)由初始冲突矩阵画出状态图
最后,可以求得状态转换图如下
(4)由状态图得出最优调度方案
L.E.Shar于1972年提出了流水线最小平均启动距离的限制范围
×”
或“√
”的最多个数1992年,L.E.Shar证明了上述限制范围
最有用的是第1条。预约表中×”
或“√
”最多的行一定是瓶颈流水段
举例:一个不是最优的流水线
上一条4功能段的非线性流水线,每个功能段的延迟时间都相等,已知它的预约表,求:
解答:
(1)禁止向量为: F = ( 2 , 4 , 6 ) F =(2,4,6) F=(2,4,6)、初始冲突向量: C 0 = 101010 C_{0} = 101010 C0=101010
(2)构造状态图
S逻辑右移2、4、6位时,移出1,不作任何处理
逻辑右移1、3、5时:
C 2 = 101111 C_{2} =101111 C2=101111 右移5位之后: 000001 ∨ 101010 = 101011 000001∨101010=101011 000001∨101010=101011( C 3 C_{3} C3)
C 3 = 101011 C_{3}=101011 C3=101011右移3位之后: 000101 ∨ 101010 = 101111 000101∨101010=101111 000101∨101010=101111( C 2 C_{2} C2)
C 3 = 101011 C_{3} =101011 C3=101011右移5位之后: 000001 ∨ 101010 = 101011 000001∨101010=101011 000001∨101010=101011( C 3 C_{3} C3)
构造出状态图如下:
(3)简单循环:状态图中各种冲突向量只经过一次的启动循环。所有的简单循环如下:
简单循环 | 平均启动距离 |
---|---|
(1,7) | 4 |
(3,7) | 5 |
(5,7) | 6 |
(3,5,7) | 5 |
(5,3,7) | 5 |
(3,5) | 4 |
(5) | 5 |
(7) | 7 |
根据上述,不是最优的流水线
(4)根据上述原理,采用预留算法来调度非线性流水线,可以实现最优,具体步骤如下:
×
”的最多个数。例如:
对于上个例子的预约表,在同一行中“×”最多的为2个,因此,最小平均距离可以达到2。
最小启动循环可以是(2)、(1,3)、(1,1,4)、(1,2,3)、……。现取恒定循环(2)。
每一行中与第1个“×
”的距离为2的倍数的位置都要预留出来。
D1
。可以得出采用预留调度算法的预约表如下图:
增加了一个非计算延迟流水段 D1 的流水线连接图:
重复步骤(1)(2)可以得出其流水线状态图如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。