什么是延迟分支?
当分支由流水线简单处理时,在每个分支之后,至少有一个周期未被利用。这是因为流水线对流水线的冷漠。分支后的指令槽称为分支延迟槽。
延迟槽也可以在加载指令后出现;这些是定义的加载延迟槽。传统执行过程中会浪费分支延迟槽。然而,当使用延迟分支时,这些时隙至少可以部分使用。
延迟分支原理
在图中,它可以将我们程序段最初在分支之前的添加指令转移到分支延迟槽中。对于延迟分支,处理器首先执行添加指令,但分支只会在后面有效。因此,在这个例子中,延迟分支保持初始执行顺序-
add r1, r2, r3; b anywhere; anywhere: sub
它定义了一个无条件分支。在简单的流水线执行期间,条件分支会导致相同或更高的延迟。这是因为额外需要检查特定条件的操作。
因此,未采取分支的延迟槽中的指令将始终被执行。跳转到目标指令(子)执行一个流水线周期的延迟。该周期用于执行延迟槽(add)中的指令。因此延迟分支导致以下执行序列-
a, add b, b c, sub
延迟分支于1952年在MANIACI中首次引入,后来广泛用于微程序设计(Patterson和Sequin,1981)。在1980年代初期,该方案在RISC-I(Patterson和Sequin1981)中“重新发明”,随后用于当时出现的几种RISC架构,例如MIPS(1982p)、RISC-II(1983)、MIPS-R-line(从1987年开始)和AMD29000(1987年)。
延迟分支的缺点
延迟分支有各种缺点,如下所示-
延迟分支需要重新定义架构。
由于要插入的NOP,延迟分支会导致轻微的代码扩展。例如,它必须每100条指令插入100∗fb∗(1−ff)=100∗0.2∗(1−0.6)=8NOPs,因此代码比没有延迟分支的情况长8%。
中断处理变得更加困难。这是因为延迟槽中的指令引起的中断请求必须与“正常”指令引起的中断请求不同地处理。当延迟槽指令发起中断时,前面的指令即条件分支已经被提取但尚未处理。这种情况与传统指令处理中发生的情况大不相同,在传统指令处理中,在导致中断的指令之前的所有指令都已经完成。
需要额外的硬件来实现延迟分支。
评论列表