1.软件流水
软件流水是开发循环迭代间指令级并行性的一种指令调度方法。模调度算法是一种常见的软件流水形式,它每隔一个固定的时间间隔就启动一次循环迭代,这个间隔称为启动间隔 ii。模调度算法将循环的每次迭代划分成若干段(stage),每个段的长度为 ii, 当循环流水执行到稳定状态时,各个段是并行执行的。在模调度算法中,循环分为三个部分(如图 8-1):kernel, prolog, epilog. 其中kernel 是指循环流水执行的稳定状态,prolog 和 epilog 分别指逐步建立 kernel 和排空 kernel 的过程。
如图 8-1 所示的 kernel 由 4 个 stage 构成,这 4 个 stage 分别来自循环的不同迭代,它们是并行执行的。对于单次循环迭代来说当它的 4 个stage 都执行完之后产生一个结果,但是在循环流水的稳定状态,每个 stage 都产生一个结果,即每 ii 个时钟周期产生一个结果。
如图 8-1,定义每个循环迭代划分后的 stage 依次为 S0,S1,S2,Sn;定义 prolog 的各个 stage 为 P0,P1,Pn;定义循环核为 Kn;定义 epilog 的各个 stage 为 E0,E1, En. 则 P0=S0; Pn=P(n-1)+Sn,n>0; Kn=S0+S1+ „ +Sn; E0=Kn-S0; En=E(n-1)-Sn,n>0;循环的动态长度 dynlen 定义为执行完一次迭代所需要的指令周期数,prolog 和 epilog 的长度均为(dynlen-ii).
SPLOOP在DSP内设置一个专门的缓冲区来保存循环程序一个迭代内的指令,并且它包含硬件逻辑以软件流水的形式对缓存的单个迭代副本进行有选择的覆盖和展开,以构建优化的循环执行。
软件循环有以下好处:
SPLOOP通过硬件的支持来动态生成循环的prolog和epilog,代码只需要提供一个kernel,因此代码体积大大减小。
SPLOOP比普通循环能更好地支持中断(当发生中断时,SPLOOP不启动新的迭代并且将已经部分执行的循环迭代继续执行完毕后再响应中断。而普通循环很难做到这一点,很可能导致循环的执行状态被中断破坏)。
在循环被装入SPLOOP后,指令直接由SPLOOP提供而不需要每次都从L1P或更低层的指令存储器取指,可以节省带宽和功耗。
与分支指令构成的普通循环相比,SPLOOP不需要分支指令跳转到循环的开始,因此可以释放一个s单元。这个被释放的S单元可以与SPLOOP构造出更紧凑的循环。
2. SPLOOP中的基本术语
下面是一些术语的定义:
迭代间隔ii(启动间隔)是指相邻两次迭代之间的时间间隔(以指令周期数来计算)。
段:一个迭代间隔内执行的代码称为一个段(stage)。
动态长度(dynlen)是循环单个迭代的长度(按指令周期数计算),它等于stages数目乘以ii。
kernel是循环在稳定状态下执行的周期,这时同时执行的循环迭代数最大。
prolog是循环到达kernel之前的周期,这时循环处于积累阶段。prolog的长度应该为动态长度减去迭代间隔(dynlen-ii)。
epilog是循环离开kernel的周期,这时循环处于消退阶段。epilog的长度应该为动态长度减去迭代间隔(dynlen-ii)。
3.SPLOOP硬件支持
SPLOOP操作基本的硬件支持包括:
loop buffer:用于保存循环指令;
loop buffer count register(LBC):用于对ii计数以决定是否启动新的迭代;
inner loop count register(ILC):循环剩余的迭代次数;
reload inner loop count register(RILC):用于构造嵌套循环;
任务状态寄存器TSR;
中断任务状态寄存器ITSR;
不可屏蔽中断和异常任务状态寄存器NTSR。