什么是分支问题?
流水线是一种非常有效的加速指令沿顺序路径执行的方法。但是,如果分支引入流水线并扰乱顺序处理,则除非使用适当的方法,否则流水线的实现将受到严重破坏。
它可以指示在流水线中生成分支的问题。让我们假设在流水线中实现一个无条件分支。当没有采取任何特定措施来提高适应性时,在传统的 RISC 流水线中实现无条件分支。
流水线被认为在四个连续的周期中处理指令,例如,在连续的取指 (F)、解码 (D)、执行 (E) 和写回 (WB) 周期中。因此,分支的目标地址 (TA) 将在 E 周期内计算。
让我们检查一下包含无条件分支的简单指令序列的实现。因此,为简单起见,让我们考虑每个指定的指令都可以在四个连续的周期内处理。
当给定的指令序列已执行时,使用简单的流水线会出现以下情况。流水线作为装配线,保持处理后续指令,直到在 ti+2 中解码时遇到分支 (B)。
在下一个周期 (ti+3) 中,将计算目标地址并停止顺序处理。因为目标地址在 E 周期的结束时变得熟悉,所以流水线只能在 it+4 周期开始获取第一个目标指令 (it1)。
在简单流水线中处理条件分支可能会产生更高的惩罚。这将是计算确定条件的附加函数的结果,这需要更多周期。因此,下一个地址(递增的顺序地址或分支目标地址)只能在之后指定。对于**未解决的条件分支**,情况甚至更糟。
如果无法及时计算确定条件,因为指示的结果尚未产生,则该术语称为未解决的条件分支。例如,预先确定条件分支以检查先前浮点除法的结果。在这种方法中,需要大量的周期,通常为 10-50,才能获得结果。因此,后续的条件分支在多个周期内仍然不确定。
这表示在流水线中,每个分支指令都会导致多个浪费的周期(称为气泡),除非引入了合适的分支方法。分支在通用代码中非常频繁,平均而言,可以预期大约每四到六条指令就有一条分支。因此,无效的分支处理会严重影响性能。