教科书上一个multiple issue CPU的例子,为什么分支指令后面的指令要等一个周期才发出?

On a multiple issue CPU example in the textbook, why does the instruction after the branch instruction have to wait for one cycle before issuing?

这是关于计算机体系结构 - 定量方法[=32]的第 3.8 使用动态调度、多问题和推测 部分中的示例=].

给定一个动态调度、两发处理器和如下列出的汇编代码(它本质上是递增数组的每个元素)

Loop: LD      F2,0(R1)
      DADDIU  R2,R2,#1
      SD      R2,0(R1)
      DADDIU  R1,R1,#8
      BNE     R2,R3,LOOP

然后本书的发行时间、执行时间和写成结果如图3.19

我的问题是:为什么迭代2的LD R2,0(R1)是在第4个周期发出的,而不是与BNE同一个周期发出的?我能理解为什么LD要延迟执行,但我不知道为什么要推迟发布。

跟进问题:如果两条指令可以在同一个周期发出,它是如何实现的(检测到一条BNE指令然后推迟下一条指令)?也许处理器在前半个周期发现了一条传入的 BNE 指令,然后它选择不在后半个周期发出下一条指令?这只是我的猜测。我在书中没有找到相关资料。

图中的标题已经尝试对其进行解释:fetch/decode 分支处理无法在获取分支本身的同一周期中获取分支目标。

你可以有一个 CPU 具有更宽的获取/解码阶段,并在阶段之间缓冲以吸收来自分支的气泡,但这个 CPU 没有那个。

(但另一个问题是,即使您可以发出两条指令,这个 CPU 也不会进行推测执行;它没有机制来丢弃 ld 如果分支预测 bne 被证明是错误的。因此它不能将 ld 发送到执行单元,直到(使用执行单元)验证 bne 被采用。)


回复:实现:解码器是并行的,不是第一个和第二个half-cycle。

第二个解码器已经必须检查两条指令之间的数据依赖性等危险,并将第二条指令转换为 NOP。

我猜如果第一条指令是分支,它会将第二条指令槽多路复用到 NOP 而不是解码的任何内容。不需要同步并发生在“半周期”边界