软件流水是开发循环程序指令级并行度的一种指令调度方法,模调度(Modulo Scheduling)是一种常见的软件流水形式,它每隔一个固定的时间间隔就启动一次循环迭代,当循环的不同迭代以一定的时间间隔重叠执行时,迭代内和迭代间的指令都没有相关性违反。如图 3 所示,循环的单次迭代经过调度后(手工调度或者依赖于编译器)被划分为多个阶段(Stage),每个阶段内的指令周期数都相等,并称该周期数为―模‖或迭代间隔、启动间隔(Iteration Interval, II),循环每经过 II 个周期就启动一次新的迭代,经过一定时间后同时执行的循环迭代数目达到最大,且进入派发窗口的指令来自各个迭代的不同阶段,循环进入稳定执行状态,在此状态下可以被反复执行的代码称为循环核(Kernel),从循环开始执行到进入稳定状态的过程称为循环装载阶段(Prolog),而从稳定状态到逐渐退出循环的过程称为循环排空阶段(Epilog)。一次迭代所包含的指令周期数(不考虑 Stall 周期)称为动态长度(Dynamic length, Dynlen)。循环缓冲(SPLOOP)位于指令派发站,它包含专门的缓冲用于保存循环指令,以及必要的硬件逻辑能够以模调度的形式将循环流水展开执行。SPLOOP 能大大提升循环的执行效率,同时也带来以下的好处:在循环程序被载入 SPLOOP 后,指令直接由 SPLOOP 提供而不需要从 L1P 或更远的存储器取指,因此可减少取指缺失停顿,并节省带宽和功耗;SPLOOP 通过硬件动态生成循环的 Prolog 和 Epilog,程序代码只需要提供一个 Kernel,因此大大压缩了代码体积;SPLOOP 比普通循环能更好地支持中断。当发生中断时 SPLOOP 不启动新的迭代并且将已经部分执行的循环迭代继续执行完毕后再响应中断,从中断返回后能够继续执行剩余的迭代,中断对整个循环的执行结果不产生影响。而普通循环的执行状态则很有可能被中断破坏。与普通循环相比,SPLOOP 不需要分支指令跳转到循环的开始,因此可以释放一个 S 单元,被释放的 S 单元可以做其他操作。
dsp软件流水
最新推荐文章于 2024-02-17 16:21:37 发布