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