7.6 控制冒险的处理

计算机组成

7 流水线处理器

7.6 控制冒险的处理

Screen Shot 2018-09-29 at 9.14.18 pm

转移指令由于其自身的特殊性,总是会给我们带来一些麻烦。那对于流水线处理器来说,更是如此,转移指令会带来更多不良的影响。那我们应该如何应对和解决呢?这一节我们就来探索这个问题。

Screen Shot 2018-09-29 at 9.14.28 pm

我们先来看一看转移指令对流水线的影响。这是一条时间轴,每一小格都代表着一个时钟周期。那对于5级流水线来说,5个时钟周期执行完一条指令,但是每一个时钟周期都可以读入一条指令,并且从第五个时钟周期之后,每个时钟周期也都可以完成一条指令。如果流水线始终处于这样充满的状态,那就达到了我们流水线的性能目标,也就是获得最大的指令吞吐率。

那我们来看一看这样一段程序代码。我们假设在T1的这个时钟周期去取指的就是这条add指令,那么到了T2周期,取指部件取回add指令,并交给译码部件进行译码。与此同时,取指部件开始取下一条指令,也就是这条sub指令。然后到T3周期,接着取下一条指令,就是这条beq指令。那通过这段程序我们可以看出,这里很可能会有一段循环。但这只是从我们旁观者的视角,我们能看到所有的程序代码。而对于处理器来说,现在正处于T3这个周期时,它正在去取下一条指令,它根本不知道这条指令是什么。当T3这个周期的取指工作完成之后,虽然这条beq指令的指令编码被取回,也是在T4周期这条beq指令被送到译码部件。而取指部件则会依次去取下一条指令,那就是这条load指令,当取回这条load指令的时候,beq指令译码也已经完成,但我们仍然不知道它的转移条件是否满足,也就是s3、s4这两个寄存器是否相等。所以,这时候我们只能继续取指,那再往下取回的就是这条store指令,就是当T5这个时钟周期完成的时候,beq这条指令也完成了执行的工作,也就是比较完成S3和S4这两个寄存器的值,这时我们才能知道是否要发生这次转移。那我们假设转移的条件是满足的,这样已经进入流水线的这条load和store指令,实际上是不应该被执行的。我们只能把它清除,然后重新从正确的地址开始取指,也就是取回这条减法指令,然后再依次取到这条条件转移指令。但是现在我们所构造出的处理器并不能记住刚才曾从某个地方取回了这条条件转移指令。所以,在这时处理器只是简单地去取指令,因此,它会仍然继续往下取指,再会取到这条load指令,然后再取到一条store指令。只有当这条store指令被取回的时候,刚才取到的这条beq指令才会执行完成,处理器可能又发现原来是要发生转移的,必须把load和store指令清除掉,然后重新取指。

那么就发现在这个循环的执行过程中,总是反复地执行了两条正确的指令,然后取回了两条不应该被执行的指令。从这个图上来看ÿ

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值