教科书上一个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 而不是解码的任何内容。不需要同步并发生在“半周期”边界
这是关于计算机体系结构 - 定量方法[=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 而不是解码的任何内容。不需要同步并发生在“半周期”边界