管道和分支指令

时间:2015-06-23 21:39:23

标签: pipeline

让我们假设一个程序中20%的指令都是分支指令。跳转的静态预测假设跳转不会发生。

我应该在两种情况下找到执行时间:当30%的分支发生时和70%的分支发生时 我还应该找到一个案例与另一个案例相比的加速比例并以百分比表示。

事情是,我如何在这里找到执行时间?我通常会找到管道在不同阶段分开的执行时间,并给出每个阶段的时间....

编辑:这不是家庭作业。我在我的计算机体系结构教科书中发现了这个并不熟悉它。

1 个答案:

答案 0 :(得分:2)

这个问题听起来像是家庭作业,但这件事值得讨论。

我们假设有一个静态分支预测器,它始终预测 NOT TAKEN 。这是早期SPARC和MIPS实现的分支预测器类型。这样的分支预测器总是获取程序中的下一个顺序指令。

我还假设我们有一个由Fetch(F),Decode(D),Execute(E)和Write Back(W)组成的简化的4级流水线。请考虑以下简化的汇编程序:

        ...
0xF1:   JUMP <condition>, 0xF4
0xF2:   ADD r1, r2, r3
0xF3:   ADD r3, r4, r1
0xF4:   ADD r1, r2, r3

正确预测分支时,管道行为正常。问题是当分支被错误预测时管道会发生什么。在我们的情况下,对应于JUMP指令(0xF1)的条件被验证的情况。

0xF1:  F  D  E  W
0xF2:     F  D  X
0xF3:        F  X  
0xF4:           F

cycle  1  2  3  4

在JUMP指令的Execute阶段,我们评估条件并检测必须采取分支。但是,由于分支预测器政策,我们已经提取了说明0xF20xF3并解码了0xF2。刷新管道,并在下一个时钟周期正确获取分支目标。从管道中可以看出,我们浪费了2个时钟周期来获取和解码将不会执行的指令。这2个时钟周期称为分支惩罚,在计算程序的执行时间时必须考虑它们。

分支预测器的世界在现实中要复杂得多。例如,存在更详细的静态分支预测变量,总是预测为 TAKEN 正向跳跃和 NOT TAKEN 向后跳跃。为了减少分支惩罚周期,处理器通常使用分支目标缓冲区(BTB),它是存储最近执行的JUMP指令的目标的小缓存。如果没有BTB,要将分支预测为 TAKEN ,我们必须等到Decode阶段,其中指令被识别为JUMP并且目标地址被解码。与此同时,我们已经获取了一条指令,然后将被刷新。另一方面,使用BTB,我们可以在Fetch阶段进行分支预测:如果程序计数器在BTB中,我们知道2

  1. 获取的指令是分支
  2. 我们有目标地址
  3. 因此,如果可以预测分支,如果预测为 TAKEN ,我们可以获取其目标而不会受到任何惩罚。 现代处理器还采用动态分支预测器,它使用复杂的策略以及一些额外的缓冲区来避免错误预测。