什么是软件流水线?
软件流水线是一种编译时调度技术,它与后续循环迭代重叠以揭示操作级并行性。开发适当的软件流水线算法的一个必要问题是如何处理带有条件分支的循环。条件分支通过向调度机会提供很少的可能执行路径来提高复杂性并降低软件流水线算法的性能。
为了演示基本思想,让我们看一下在ILP处理器上最可行的循环并行执行,该处理器具有多个并行操作的执行单元。让我们假设循环体有一个类似RISC的中间代码,例如-
load r100, b(i); fmul r100, 2.0, r100; store a(i), r100;
在演示软件流水线的原理时,我们只关注循环体,忽略了一些序言和结尾代码。
它可以创建以下关于ILP处理器的假设。它具有独立的FP、FX、加载和存储指令执行单元,所有并行操作都足够。所有的执行单元都应该允许在每个循环中启动一个新的操作。最后,我们假设FP单元在三个周期内传递fmul指令的结果,而加载和存储的执行延迟为一个周期。
现在让我们寻找最可行的并行执行。当我们以尽可能并行的方式展开循环和后续迭代时,我们就实现了它。让我们从第一次迭代开始。它可以执行如下-
这里我们注意到最终操作的假设延迟是三个周期,因此在周期c+3中,其结果尚不可用,必须插入“nop”。在做出的假设下,第二次迭代可以通过加载第二个数据项b(2)在周期c+1中启动。
它可以避免与第一次迭代的干扰,即避免在使用r101时发生WAW冲突,在第二次迭代中r101必须重命名,比如r102。随后,两个迭代可以并行实施。这可以接收以下执行序列-
在下表中,它可以显示循环的整个执行过程。让我们看看循环c+4、c+5和c+6。这些是显示软件流水线的真正优势的那些。重要的一点是,对于这些循环,完全使用了后续循环迭代之间的可用并行性。例如,在循环c+4中,并行操作如下-
它可以存储迭代1的结果(即a(1)),自动递增索引。
它可以将循环计数递减,循环计数在r200中保持1。
它可以与属于周期4的操作数进行浮点乘法,即(2.0*b(4));
它可以加载迭代5的操作数,即b(5)。
给定循环在具有多个流水线执行单元的ILP处理器上的大多数并行执行