4.4.4 带反馈的流水线系统
4.4.4 带反馈的流水线系统
到目前为止,我们只考虑一种系统,其中传过流水线的对象,无论是汽车、人或者指令,相互都是完全独立的。但是,对于像 x86-64 或 Y86-64 这样执行机器程序的系统来说,相邻指令之间很可能是相关的。例如,考虑下面这个 Y86-64 指令序列:
1 irmovq $50,%rax
2 addq %rax,%rbx
3 mrmovq 100(%rbx),%rdx在这个包含三条指令的序列中,每对相邻的指令之间都有数据相关(data dependency),用带圈的寄存器名字和它们之间的箭头来表示。irmovq 指令(第 1 行)将它的结果存放在 %rax 中,然后 addq 指令(第 2 行)要读这个值;而 addq 指令将它的结果存放在 %rbx 中,mrmovq 指令(第 3 行)要读这个值。
另一种相关是由于指令控制流造成的顺序相关。来看看下面这个 Y86-64 指令序列:
1 loop:
2 subq %rdx,%rbx
3 jne targ
4 irmovq $10,%rdx
5 jmp loop
6 targ:
7 haltjne 指令(第 3 行)产生了一个控制相关(control dependency),因为条件测试的结果会决定要执行的新指令是 irmovq 指令(第 4 行)还是 halt 指令(第 7 行)。在我们的 SEQ 设计中,这些相关都是由反馈路径来解决的,如图 4-22 的右边所示。这些反馈将更新了的寄存器值向下传送到寄存器文件,将新的 PC 值向下传送到 PC 寄存器。
图 4-38 举例说明了将流水线引入含有反馈路径的系统中的危险。在原来的系统(图 4-38a)中,每条指令的结果都反馈给下一条指令。流水线图(图 4-38b)就说明了这个情况,I1 的结果成为 I2 的输入,依此类推。如果试图以最直接的方式将它转换成一个三阶段流水线(图 4-38c),我们将改变系统的行为。如图 4-38c 所示,I1 的结果成为 I4 的输入。为了通过流水线技术加速系统,我们改变了系统的行为。

图 4-38 由逻辑相关造成的流水线技术的局限性。在从未流水线化的带反馈的系统 a 转化到流水线化的系统 c 的过程中,我们改变了它的计算行为,可以从两个流水线图(b 和 d)中看出来
当我们将流水线技术引入 Y86-64 处理器时,必须正确处理反馈的影响。很明显,像图 4-38 中的例子那样改变系统的行为是不可接受的。我们必须以某种方式来处理指令间的数据和控制相关,以使得到的行为与 ISA 定义的模型相符。