VLSI数字信号处理系统——第二章迭代边界
作者:夏风喃喃
参考:VLSI数字信号处理系统:设计与实现 (美)Keshab K.Parhi/著
文章目录
一.数据流图的表示
DFG表示:DSP程序通常用DFG表示,它是一种可以用来描述程序的有向图。图2-1a表示程序
y
(
n
)
=
a
y
(
n
−
1
)
+
x
(
n
)
y(n) = ay(n-1) + x(n)
y(n)=ay(n−1)+x(n),图2-1b是其简化后的表示。A表示加法,执行时间为2;B表示乘法,执行时间为4;边A→B的延时为0,边B→A的延时为1。一个节点的一次迭代表示该节点执行一次,一个DFG的一次迭代表示该DFG中每个节点都执行一次。
迭代优先级约束:DFG内没有延时的边是一种迭代内优先级约束,有一个延时或者多个延时的边是一种迭代间优先级约束。这些约束指定了DFG的执行顺序,即A的第
k
k
k次迭代先于B的第
k
k
k次迭代,B的第
k
k
k次迭代先于A的第
k
k
k+1次迭代。单箭头表示迭代内优先级约束
A
k
A_k
Ak→
B
k
B_k
Bk,双箭头表示迭代间优先级约束
B
k
B_k
Bk=>
A
k
+
1
A_{k+1}
Ak+1。
关键路径:在DFG中,具有零延时的所有路径中,具有最长运算时间的路径定义为关键路径,关键路径是组合逻辑在每拍的执行中所需最长路径。关键路径的运算时间也是DFG一次迭代的最小运算时间。如图2-1b中关键路径A→B,运算时间6 u . t . u.t. u.t.
递归与非递归DFG:非递归DFG不包含环路,递归DFG至少有一个环路。递归DFG存在一个基本极限,该极限表示了关于用硬件实现基本DSP程序能够有多快,称为迭代边界(iteration bound) T ∞ T_∞ T∞
二.环路边界和迭代边界
环路周期:环路未经优化时,目前的每拍最短允许的周期,即关键路径的时长。
迭代周期:系统(可能为多环路)未经优化时,目前的每拍最短允许的周期,即最大环路周期的时长。
环路边界:表示环路运行时间的最低限制,第 l l l 个环路的边界指 t l / w l t_l/w_l tl/wl,其中 t l t_l tl 是环路运行时间, w l w_l wl 是指环路中延时数目(可以理解为环路经过优化后每拍最短的允许的周期)。图2-1b中的环路边界是6/1 = 6 u . t . u.t. u.t.
关键环路:关键环路是具有最大环路边界的环路。
迭代边界:关键环路的环路边界就是迭代边界。这个边界是DSP程序中迭代或者采样周期的最低限制(可以理解为系统(可能为多环路)经过优化后每拍最短的允许的周期)。
三.计算迭代边界的算法
1.最长路径矩阵(LPM)算法
LPM算法中,首先构建一系列矩阵,然后通过观察矩阵斜对角线上的数据,就可以得到迭代边界,以下图中的DFG为例。
用
d
d
d表示延时数目,矩阵
L
(
m
)
L^{(m)}
L(m),
m
m
m = 1,2,……,
d
d
d,按照下面方法构建:
step1)构建矩阵 L ( 1 ) L^{(1)} L(1):从延时单元 d i d_i di到延时单元 d j d_j dj中经过正好 m m m-1延时(不包含 d i d_i di和 d j d_j dj)的所有路径中,用 l i , j ( m ) l_{i,j}^{(m)} li,j(m)表示最长的运算时间。如果这样的路径不存在,那么 l i , j ( m ) l_{i,j}^{(m)} li,j(m) = -1。例如, l 3 , 1 ( 1 ) l_{3,1}^{(1)} l3,1(1)考虑 d 3 d_3 d3到 d 1 d_1 d1零延时的路径有 d 3 d_3 d3→ n 5 n_5 n5→ n 3 n_3 n3→ n 2 n_2 n2→ n 1 n_1 n1→ d 1 d_1 d1,路径需要运算时间为5,所以 l 3 , 1 ( 1 ) l_{3,1}^{(1)} l3,1(1) = 5。
step2)递归构建高阶矩阵
L
(
m
)
L^{(m)}
L(m):更高阶的矩阵
L
(
m
)
L^{(m)}
L(m),
m
m
m = 2,……,
d
d
d,可以通过下面的递归计算每一个矩阵元素。
其中K是区间[1,
d
d
d]中使得
l
i
,
k
(
1
)
l_{i,k}^{(1)}
li,k(1) = -1或
l
k
,
j
(
m
)
l_{k,j}^{(m)}
lk,j(m) = -1都不满足的整数k的集合。例如
l
2
,
1
(
2
)
l_{2,1}^{(2)}
l2,1(2)先在集合{1,2,3,4}中寻找合适的集合K,因为
l
2
,
3
(
1
)
l_{2,3}^{(1)}
l2,3(1) = 0,
l
3
,
1
(
1
)
l_{3,1}^{(1)}
l3,1(1) = 5,所以3属于K,而k = 1,2,4中每个数,
l
2
,
k
(
1
)
l_{2,k}^{(1)}
l2,k(1)和
l
k
,
1
(
1
)
l_{k,1}^{(1)}
lk,1(1)两者至少有一个等于-1,故不属于K。所以
l
2
,
1
(
2
)
l_{2,1}^{(2)}
l2,1(2) = max(-1,0+5) = 5。
以此类推, L ( 3 ) L^{(3)} L(3)的计算需要 L ( 1 ) L^{(1)} L(1)与 L ( 2 ) L^{(2)} L(2),例如 l 3 , 3 ( 3 ) l_{3,3}^{(3)} l3,3(3) = max(-1, l 3 , k ( 1 ) l_{3,k}^{(1)} l3,k(1)+ l k , 3 ( 2 ) l_{k,3}^{(2)} lk,3(2)) = max(-1,5+0) = 5。
step3)计算迭代边界:最终,此DFG的迭代边界由下式算出。
2.最小环均值(MCM)算法
环均值:环 c c c的环均值表示 c c c的边的平均长度,即环中边的长度求和后除以环中边线的数目,MCM表示所有环均值的最小值。
一个新图形 G d G_d Gd的最大环均值即迭代边界,其中 G d G_d Gd可以从相应的DFG中得到(称该DFG为 G G G)。
step1)
G
d
G_d
Gd的构建:若
d
d
d为
G
G
G中延时单元数,则
G
d
G_d
Gd有
d
d
d个节点,每个节点对应G中的一个延时单元。图
G
G
G中从延时
d
i
d_i
di到延时
d
j
d_j
dj的所有不经过任何延时的路径中的最长路径的长度就是
G
d
G_d
Gd中从节点
i
i
i到节点
j
j
j的边的权重,用
w
(
i
,
j
)
w(i,j)
w(i,j)表示。如果从延时
d
i
d_i
di到延时
d
j
d_j
dj没有零延时路径,那么
G
d
G_d
Gd中边
i
i
i→
j
j
j不存在。例如下图(a)即example中DFG的
G
d
G_d
Gd。
step2)
G
d
‾
\overline{G_d}
Gd的构建:为了计算
G
d
G_d
Gd的最大环均值,可以将
G
d
G_d
Gd边的权重乘以 -1 构建
G
d
‾
\overline{G_d}
Gd并寻找其MCM,然后将其乘 -1 即可。例如上图(b)即example中DFG的
G
d
‾
\overline{G_d}
Gd。
step3)
G
d
‾
\overline{G_d}
Gd的MCM求迭代边界:通过建立
d
d
d + 1个向量序列
f
(
m
)
f^{(m)}
f(m),
m
m
m = 0,1,……,
d
d
d,其中每个向量的大小为
d
d
d × 1,可以找到
G
d
‾
\overline{G_d}
Gd的MCM。指定
G
d
‾
\overline{G_d}
Gd的一个参考节点称为
s
s
s。初始向量
f
(
0
)
f^{(0)}
f(0)如下确定:
f
(
0
)
(
s
)
f^{(0)}{(s)}
f(0)(s) = 0,
f
(
0
)
f^{(0)}
f(0)的其余项全部设为
∞
∞
∞。若example中节点1为
G
d
‾
\overline{G_d}
Gd的参考节点,那么有
其余的向量
f
(
m
)
f^{(m)}
f(m),
m
m
m = 0,1,……,
d
d
d,按照下面的公式递归计算:
其中
I
I
I表示在
G
d
‾
\overline{G_d}
Gd中从节点
i
i
i到
j
j
j存在一条边(
i
i
i→
j
j
j)的节点集合。example的向量序列如下:
迭代边界可以如下计算:
在example中,
d
d
d = 4,表2-1列出了找MCM的情况(
∞
∞
∞ -
∞
∞
∞视为0):
利用表2-1右边的列,可以得到DFG的迭代边界:
四.总结
DSP程序都具有从 n n n = 0执行到 n n n = ∞ ∞ ∞时的性质。这些程序常常用DFG来表示,它们或者是递归的,或者是非递归的。如果DFG是递归的,对于该DSP程序的硬件实现,迭代边界是其最小采样周期的基本极限。我们已经讨论了两种计算迭代边界的算法,根据时间复杂度,对于大多数情况,MCM算法比LPM算法要快。
附:LPM算法迭代的python实现
import numpy as np
#延迟单元的数目
delay_num = 2
#创建三维全零数组定义L矩阵组
L = np.zeros((delay_num,delay_num,delay_num))
#将由DFG手动推导的L(1)写入三维数组的第一层
L[:,:,0] = np.array([[8,8],[4,4]])
#待选择的k的集合
K_forselect = range(1,delay_num+1)
#利用迭代通过L(1)及L(m-1)遍历并计算L(m)高阶矩阵的元素
for d in range(1,delay_num):
for i in range(0,delay_num):
for j in range(0,delay_num):
max_list = [-1]
K_temp = list(K_forselect)
for k in K_forselect:
if(L[i,k-1,0] == -1 or L[k-1,j,d-1] == -1):
K_temp.remove(k)
for k in K_temp:
max_list.append(L[i,k-1,0]+L[k-1,j,d-1])
L[i,j,d] = max(max_list)
#遍历每一个矩阵的对角线元素,并计算迭代边界
bound_list = []
for d in range(0,delay_num):
for i in range(0,delay_num):
if(L[i,i,d] != -1):
bound_list.append(L[i,i,d]/(d+1))
iter_bound = max(bound_list)
print("Iteration bound is ",iter_bound)