0

Consider a RISC pipeline having 5 stages, Find how many cycles are required for the instruction given below, assume operand forwarding, branch prediction is used in which the branch is not taken, ACS is the branch instruction and the five stages are Instruction fetch, Decode, Execute, Memory and Write back.

I1: ACS R0, R1,X

I2: LOAD R2, 0(R3)

I3: SUB R4 R2, R2
I4: X: ADD R5, R1, R2
I5: LOAD R1, 0(R5)

I6: SUB R1, R1, R4
I7: ADD R1, R1, R5 

A. 11
B. 12
C. 13
D. 14

Solution: Solution

In the solution, I coludn't understand why have they neglected 2 DECODE cycles in I6 and I7 although they have a RAW dependency?

Source of the question: Question 41 of https://practice.geeksforgeeks.org/contest-quiz/sudo-gate-2020-mock-iii

4

1 回答 1

2

我认为答案给出了正确的总数(13 个周期),但将停顿置于错误的指令中。

I5不需要停转;I4 ( ADD R5, R1, R2) 及时产生 R5 转发到下一条指令的 EX 进行地址计算 ( LOAD R1, 0(R5))。(您的5 阶段经典 RISC管道具有旁路转发)。

但是 I6 读取加载指令的结果,并且加载比 EX 中的 ALU 晚一个周期产生结果。 所以像 I3 一样,I6需要停止,而不是 I5。

(I7 依赖于 I6,但 I6 是 ALU 指令,因此它可以前进而不会停顿。)

它们在 D 阶段停滞不前,因为 ID 阶段无法获取 I2 / I5 负载尚未产生的寄存器。


除此之外,您的图表显示 I4(以及应该是 I7)在前一条指令停止时甚至没有被获取。这对我来说没有意义。在该周期开始时,流水线甚至不知道它需要停止,因为它尚未解码 I3(和​​ I6)并检测到它读取了一个未就绪的寄存器,因此需要互锁。

Fetch 不会等到解码前一条指令后才查看它是否停止;这将破坏流水线的全部目的。它应该看起来像

I3     IF   D   D  EX  MEM   WB
I4         IF  IF   D   EX  MEM  WB

顺便说一句,加载延迟是经典 MIPS 具有加载延迟槽的原因(如果您在加载后尝试在下一条指令中使用寄存器,则会出现不可预测的行为)。后来 MIPS 添加了互锁来停止如果你这样做,而不是让它成为一个错误,所以你可以在你找不到任何其他指令放入该插槽的情况下保持静态代码大小更小(没有 NOP 填充)。(甚至后来的一些 MIPS 执行了可以隐藏延迟的乱序执行。)

于 2020-02-02T05:53:17.530 回答