软件流水线的实现方式有哪些?
软件流水线是一种编译时调度技术,它重叠连续的循环迭代以揭示操作级并行性。软件流水线算法开发的一个必要问题是如何处理包含条件分支的循环。
条件分支通过将一些可能的执行路径引入调度范围,增加了复杂性并降低了软件流水线算法的性能。软件流水线是通过基于展开的技术或模数调度来实现的,如图所示。
**基于展开的技术**的基本思想非常简单——将循环展开多次,并以最并行的方式排列展开的代码。然后在排列的代码中寻找重复的模式,并重新滚动重复的模式,创建一个新的循环。这个新循环以及启动(序言)和结束(结语)代码部分,表示软件流水线的指令调度。
它可以通过其代表之一 URPR(展开、流水线和重新滚动)来展示展开方法,如图所示。
如图所示,这种展开技术的变体首先调度原始循环体,然后将其展开 k 次,将其排列以进行最并行执行,并搜索重复模式。最后,此模式被重新滚动,从而产生新的主体。调度的结果是在序言代码之前的新循环体,并在结语代码部分之后。
软件流水线的另一种主要方法是模数调度。该技术最初由 Rau 和 Glaeser 于 1981 年提出,并在一些 VLIW 机器的编译器中实现,例如 FPS-164(Touzeau,1984)、CYDRA-5(Rau 等人,1989)和 iWARP(Lam,1988)。
模数调度基于一种列表调度类型。通常,此方法具有迭代特性,包括三个步骤:
首先,对新循环体所需的最小长度进行猜测,在这些方法中通常称为最小启动间隔。
接下来,尝试为该中断安排计划,同时考虑信息和资源依赖关系。
如果尝试的调度不可行,则增加新循环体的长度,并为扩展的间隔准备新的调度。
名称“模数调度”强调了关于数据和资源依赖关系的调度的重复特性。关于已提出或已实现算法的描述可以在 Rau 和 Glaser(1981)、Touzeau(1984)和 Lam(1988)中找到。