计算机体系结构流水线停顿
Computer Architecture pipeline stalls
首先,抱歉我的英语不好。这个问题是我的计算机体系结构课程教科书中的一个问题。我已经在网上找到了答案,但仍然无法找到详细信息。
以下是五阶段(获取、解码、执行、存储、写入)单流水线微体系结构无转发机制中的指令阶段。 除LW、SW为1+2,Branch为1+1外,所有运算均为1个循环。
Loop: C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 ...
LW R3, 0(R0) F D E M - - W
LW R1, 0(R3) F D - - - E M - - W
ADDI R1, R1, #1 F - - - D - - - E M W
SUB R4, R3, R2 F - - - D E M W
SW R1, 0(R3) F D W M ...
BNZ R4, Loop F D E ...
...
我有几个问题:
为什么第2条指令可以在C2中开始D?据我所知,D阶段包括"register read",但之前的指令直到C7才写回R3。
同上一个,请问第3台的D从C7开始,E从C11开始的原因是什么?
为什么第 4 次必须从 C7 而不是 C4 开始?
这个问题源于书本"Computer Architecture : A Quantitative Approach 5e",例子3.11。
看起来你的管道在执行内存相关操作 (LW) 时冻结了整个系统,除了我想不出 ADDI 无法在 C4 中执行其解码的正当理由。我并不是说它对冻结整个执行的加载操作有效,但这似乎是 "only" 合乎逻辑的解释。
指令 2 可以在 C3 中执行其解码,但它必须等到指令 1 将其数据写回 R1
。这就是为什么第二条指令的执行会延迟到 C7
.
顺便说一句,当你说你在 "net" 上找到答案时,它来自可靠的来源吗?
Classic RISC pipeline wiki article 非常好。没看过的可以看看
- Why the 2nd instruction can start D in C2? D includes reg-read, but the previous instruction doesn't write back to R3 until C7.
我不确定,我没有在 classic-RISC 管道上花很多时间。根据我们对此和 ADDI 的观察,寄存器读取似乎发生在 E 阶段。
这完美地解释了 E 停滞直到前一个负载的回写。如果您确定 reg-read 应该发生在您正在研究的管道的 D 阶段,那么此解决方案与您的管道不匹配;对于在执行之前不读取寄存器的不同管道是正确的。
3rd inst's D start at C7, and E start at C11?
流水线的D段被前面的指令占用直到C7,此时可以解码
R1 直到周期 11 才准备就绪,此时 the data can be forwarded 来自前一条指令的内存阶段,因此 ADDI 的执行可以与前一条指令中的回写并行发生。这叫做 "bypass".
旁路可以让 ALU 操作 运行 具有 1 个周期的延迟,因此您可以在下一条指令中使用 ADD 的输出而不会出现停顿。
- Why 4th inst must start at C7 instead of C4?
因为前面的指令在fetch阶段停滞了,而且是一个有序的流水线;没有乱序执行。
为什么第2条指令可以在C2中启动D? D包括reg-read,但之前的指令直到C7才写回R3。
回答 - 这是因为 MIPS 简单流水线中的解码器阶段有两个 parts/sub 阶段。
DEC = 解码 + RR(寄存器读取)
指令可以被解码,也就是说,操作码可以被读取和解码,但是,由于这种情况下的依赖性,RR 将停止直到第一个加载指令执行(从内存中获取 R3)并在 C7 中进行简单转发下一次加载可以执行了。
为了避免结构性危险,在两个子级中对 DECODE 级进行了破坏。
如果您再次阅读图表 "Computer Architecture : A Quantitative Approach",您会看到故意绘制的虚线和实线以显示整体工作分为两部分(DECODE OPCODE + REG READ)。
另外两个问题我同意@Peter Cordes
希望这对您有所帮助。
杰敏
首先,抱歉我的英语不好。这个问题是我的计算机体系结构课程教科书中的一个问题。我已经在网上找到了答案,但仍然无法找到详细信息。
以下是五阶段(获取、解码、执行、存储、写入)单流水线微体系结构无转发机制中的指令阶段。 除LW、SW为1+2,Branch为1+1外,所有运算均为1个循环。
Loop: C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 ...
LW R3, 0(R0) F D E M - - W
LW R1, 0(R3) F D - - - E M - - W
ADDI R1, R1, #1 F - - - D - - - E M W
SUB R4, R3, R2 F - - - D E M W
SW R1, 0(R3) F D W M ...
BNZ R4, Loop F D E ...
...
我有几个问题:
为什么第2条指令可以在C2中开始D?据我所知,D阶段包括"register read",但之前的指令直到C7才写回R3。
同上一个,请问第3台的D从C7开始,E从C11开始的原因是什么?
为什么第 4 次必须从 C7 而不是 C4 开始?
这个问题源于书本"Computer Architecture : A Quantitative Approach 5e",例子3.11。
看起来你的管道在执行内存相关操作 (LW) 时冻结了整个系统,除了我想不出 ADDI 无法在 C4 中执行其解码的正当理由。我并不是说它对冻结整个执行的加载操作有效,但这似乎是 "only" 合乎逻辑的解释。
指令 2 可以在 C3 中执行其解码,但它必须等到指令 1 将其数据写回 R1
。这就是为什么第二条指令的执行会延迟到 C7
.
顺便说一句,当你说你在 "net" 上找到答案时,它来自可靠的来源吗?
Classic RISC pipeline wiki article 非常好。没看过的可以看看
- Why the 2nd instruction can start D in C2? D includes reg-read, but the previous instruction doesn't write back to R3 until C7.
我不确定,我没有在 classic-RISC 管道上花很多时间。根据我们对此和 ADDI 的观察,寄存器读取似乎发生在 E 阶段。
这完美地解释了 E 停滞直到前一个负载的回写。如果您确定 reg-read 应该发生在您正在研究的管道的 D 阶段,那么此解决方案与您的管道不匹配;对于在执行之前不读取寄存器的不同管道是正确的。
3rd inst's D start at C7, and E start at C11?
流水线的D段被前面的指令占用直到C7,此时可以解码
R1 直到周期 11 才准备就绪,此时 the data can be forwarded 来自前一条指令的内存阶段,因此 ADDI 的执行可以与前一条指令中的回写并行发生。这叫做 "bypass".
旁路可以让 ALU 操作 运行 具有 1 个周期的延迟,因此您可以在下一条指令中使用 ADD 的输出而不会出现停顿。
- Why 4th inst must start at C7 instead of C4?
因为前面的指令在fetch阶段停滞了,而且是一个有序的流水线;没有乱序执行。
为什么第2条指令可以在C2中启动D? D包括reg-read,但之前的指令直到C7才写回R3。
回答 - 这是因为 MIPS 简单流水线中的解码器阶段有两个 parts/sub 阶段。
DEC = 解码 + RR(寄存器读取)
指令可以被解码,也就是说,操作码可以被读取和解码,但是,由于这种情况下的依赖性,RR 将停止直到第一个加载指令执行(从内存中获取 R3)并在 C7 中进行简单转发下一次加载可以执行了。
为了避免结构性危险,在两个子级中对 DECODE 级进行了破坏。 如果您再次阅读图表 "Computer Architecture : A Quantitative Approach",您会看到故意绘制的虚线和实线以显示整体工作分为两部分(DECODE OPCODE + REG READ)。
另外两个问题我同意@Peter Cordes
希望这对您有所帮助。 杰敏