考虑一个具有指令获取 (IF)、指令解码 (ID)、执行 (EX)、内存访问 (MEM) 和寄存器写回 (WB) 阶段的 5 级流水线处理器。以下关于转发的哪些表述是正确的?
A) 在流水线执行中,转发意味着前一条指令的源阶段的结果被传递到后一条指令的目标阶段
B) 在转发中,来自 MEM 阶段输出的数据可以传递到下一条指令的 EX 阶段的输入
C) 转发不能防止所有管道停顿
D) 转发不需要任何额外的硬件来从管道阶段检索数据
选项 B 是正确答案之一吗?如果是,请提供作者/研究论文的适当参考文献。
选项 a 对于非线性管道来说是正确的,而选项 C 绝对是正确的,我们可以找到许多相同的管道系统的例子。选项D显然是错误的。我唯一的困惑是关于选项 B。
第一个指令就可以了
循环 | 舞台 |
---|---|
1 | 如果 |
2 | 身份证 |
3 | EX |
4 | 内存 |
5 | WB |
因此第二条指令的时序如下:
循环 | 舞台 |
---|---|
2 | 如果 |
3 | 身份证 |
4 | EX |
5 | 内存 |
6 | WB |
假设 MEM 阶段的第一条指令和第二条指令之间存在 RAW 依赖关系(那么第一条指令是一个加载,其结果在其 MEM 之后可用,第二条指令使用该加载结果进行计算,并在其 EX 中使用它)。
在这种情况下,第一条指令的 MEM 阶段位于周期 4,第二条指令的 EX 阶段也是如此。第二条指令的 EX 阶段必须延迟才能使此转发起作用。
我们确实可以从MEM转发到EX,但只能在MEM之后的下一个周期中进行,因此对于负载使用RAW危险,需要转发和延迟/失速周期,这意味着负载在第4个周期和下一个周期中的MEM阶段指令的 EX 在周期 5 中。
这使得问题变得棘手,因为你可以两种方式回答:
随着失速和前进,第二条指令的计时变为:
循环 | 舞台 |
---|---|
2 | 如果 |
3 | 身份证 |
4 | EX* |
5 | EX |
6 | 内存 |
7 | WB |
*这个循环被浪费了,必须重复