0

如果 MIPS 体系结构中的流水线阶段由于依赖关系而停止,那么后续的所有阶段是否都会因该周期而停止?如果是,为什么?例如

                                                 1  2    3    4    5    6     7
    add r1, r2, (r3)                            IF  ID  MEM  EX    WB       
    sub r4, r5, (r1)                                IF  ID  stall  MEM  EX    WB  
    st  r4, 0(r10)                                      IF  stall  ID  stall  MEM   

在这个例子中,我们可以做第 4 周期第三条指令的 ID 吗?更准确地说,这是否允许 -

                                                 1  2    3   4     5    6     7
    add r1, r2, (r3)                            IF  ID  MEM  EX    WB       
    sub r4, r5, (r1)                                IF  ID  stall  MEM  EX   WB     
    st  r4, 0(r10)                                      IF   ID  stall stall MEM     
4

1 回答 1

3

如果您要从第三条指令中删除停顿,您将有两条指令同时到达 Mem 阶段(或者更确切地说 - 两者都会尝试一起写入前面的锁存器),这是不可能的 -

                                             1  2    3    4     5    6  7
add r1, r2, (r3)                            IF  ID  MEM  EX     WB       
sub r4, r5, (r1)                                IF  ID   stall  MEM  EX      
st  r4, 0(r10)                                      IF   ID     MEM   
                                                               ^^^^^

现在,您可能会声称第二次失速可以让我们避免碰撞,但请注意,第一次失速是在第 4 周期完成的,您仍然不知道第二次失速。你不能只是假设一切都会好起来的。

一般来说,在处理一个简单的有序管道时,让年轻的操作“运行”是没有意义的,而老的操作停滞不前,你不能通过它们,你不能提高吞吐量,你只会导致这样的碰撞。

这当然不再适用于处理乱序 CPU 时,即使较旧的指令停止运行(因为严格的顺序依赖被实际的数据依赖取代),较年轻的指令仍然可以使用,但是您有一个巨大的逻辑来重新排序所有最终飞来飞去的操作。

于 2014-11-01T20:02:30.413 回答