1

我正在学习计算机体系结构课程。我从另一所大学找到了这个网站,该网站有迄今为止对我有帮助的笔记和视频:CS6810,犹他大学。我正在研究这些系列笔记,但需要对一些示例问题进行一些解释。我目前正在研究第 17-18 页的问题 7。解决方案在第 18 页的注释中给出,但我有点不确定教授是如何得出结论的。他在他的班级网页上声明他没有为任何事情提供解决方案,所以这是不可能的。

对于那些无法查看pdf的人,问题如下:

考虑一个 8 级流水线,其中寄存器读取 (RR) 和寄存器写入 (RW) 需要一个完整周期。关键:指令取指 = IF,解码 = DE,ALU = AL,数据存储器 = DM,锁存器 # = L#

L1-->IF-->L2-->DE-->L3-->RR-->L4-->AL-->L5-->AL-->L6-->DM-->L7- ->DM-->L8-->RR-->L9

给定以下一系列指令,确定第二条指令的停顿数,有和没有绕过

  1. ADD R1 + R2 -> R3, ADD R3 + R4 -> R5 :不绕过 5,绕过 1
  2. LD[R1] -> R2, ADD R2 + R3 -> R4 : 不绕过 5,绕过 3
  3. LD[R1] -> R2, SD[R2] -> R3 : 不绕过 5,绕过 3
  4. LD[R1] -> R2, SD[R3] -> R2 : 不绕过 5,绕过 1

我了解他们每个人如何在不绕过的情况下生成 5 个档位,并且我了解第一个如何在绕过的情况下只生成 1 个档位,但我不确定带旁通的档位是如何用 2-4 生成的。

任何帮助,将不胜感激。

编辑(为了进一步澄清,我对案例外观的理解):ST = Stall,隐含闩锁

1.

IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW
     IF-->DE-->ST-->ST-->ST-->ST-->ST-->RR-->AL-->AL-->DM-->DM-->RW (without)
     IF-->DE-->RR-->ST-->AL-->AL-->DM-->DM-->RW                     (with)

在没有旁路的情况下,I2 在进入 RR 之前就停顿了,必须等到 R3 被写入才能进入 RR;这种理解在所有情况下都是普遍的。通过旁路,I2 可以进入 RR 但停止直到 I1 完成算术运算,这是在第二个 ALU 阶段之后。

2.

IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW
     IF-->DE-->ST-->ST-->ST-->ST-->ST-->RR-->AL-->AL-->DM-->DM-->RW (without)
     IF-->DE-->RR-->ST-->ST-->ST-->AL-->AL-->DM-->DM-->RW           (with)

通过旁路,I2 可以进入 RR,但必须等到 R2 处理完毕,这发生在 I1 的第二个 DM 阶段之后。

3.

IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW
     IF-->DE-->ST-->ST-->ST-->ST-->ST-->RR-->AL-->AL-->DM-->DM-->RW (without)
     IF-->DE-->RR-->ST-->ST-->ST-->AL-->AL-->DM-->DM-->RW           (with)

通过旁路,I2 可以进入 RR,但必须等到 R2 被处理,这发生在 I1 的第二个 DM 阶段之后。

4.

IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW
     IF-->DE-->ST-->ST-->ST-->ST-->ST-->RR-->AL-->AL-->DM-->DM-->RW (without)
     IF-->DE-->RR-->AL-->AL-->ST-->DM-->DM-->RW                     (with)

通过旁路,I2 可以沿着流水线继续直到第二个 ALU 阶段,它必须在这里等待直到它可以拉出 R2,直到它的第二个 DM 阶段之后才由 I1 处理。

还有一个,只是为了确保我了解所有内容:

I1:R1+R2-->R3,I2:SD[R4]<--R3

IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW
     IF-->DE-->ST-->ST-->ST-->ST-->ST-->RR-->AL-->AL-->DM-->DM-->RW (without)
     IF-->DE-->RR-->AL-->AL-->DM-->DM-->RW                          (with)

据我了解,如果不绕过,它将在相同的位置停顿相同数量的档位(5)。然而,在绕过的情况下,会有 0 个停顿,因为 I2 将使用 ALU 阶段来计算寄存器地址,并且当需要进行存储时,它可以从 I1 中的第二个 ALU 阶段获取信息。

4

1 回答 1

1

情况 2 和 3 中的停顿来自第二条指令,具体取决于它的第一个 ALU 阶段,取决于前一条指令中的加载结果(直到第二个数据存储器阶段之后才可用,因此如果对于较早指令的第二条指令,则停顿ALU 级和两个数据存储器级)。(第一条指令的 L8 与第二条指令的 L4 对齐。)

 L1-->IF-->L2-->DE-->L3-->RR-->L4-->AL-->L5-->AL-->L6-->DM-->L7-->DM-->L8-->RW-->L9
           L1-->IF-->L2-->DE-->L3-->RR-->STALL---->STALL---->STALL---->L4-->AL-->L5-->AL-->L6-->DM-->L7-->DM-->L8-->RW-->L9

对于情况 4,第二条指令存储在内存中的值(可能)直到第一个数据存储阶段才需要,并且第二条指令的地址生成部分不依赖于第一条指令。(第一条指令的 L8 与第二条指令的 L6 对齐。)

 L1-->IF-->L2-->DE-->L3-->RR-->L4-->AL-->L5-->AL-->L6-->DM-->L7-->DM-->L8-->RW-->L9
           L1-->IF-->L2-->DE-->L3-->RR-->L4-->AL-->L5-->AL-->STALL---->L6-->DM-->L7-->DM-->L8-->RW-->L9

(由于写入内存是类似于写入寄存器的架构状态的承诺,因此流水线在 RW 阶段才需要存储的值可能更为典型。)

在寄存器读取阶段从寄存器文件中检索所有寄存器源操作数而不绕过所有寄存器源操作数。由于在寄存器写入阶段将新值写入寄存器文件,因此在不绕过给定的 8 级流水线的情况下,对于此类相关情况,将需要 5 个停顿周期。

 L1-->IF-->L2-->DE-->L3-->RR-->L4-->AL-->L5-->AL-->L6-->DM-->L7-->DM-->L8-->RW-->L9
           L1-->IF-->L2-->DE-->STALL---->STALL---->STALL---->STALL---->STALL---->L3-->RR-->L4-->AL-->L5-->AL-->L6-->DM-->L7-->DM-->L8-->RW-->L9

通过旁路,一个依赖值可以从它可用的最早阶段(算术指令的第二个 ALU 阶段的结束,加载指令的第二个数据存储器阶段的结束) - 而不是寄存器写入阶段 -到需要该值的相关指令的最早阶段(在用于算术指令和地址计算的 ALU 阶段之前,在用于存储的数据存储器阶段之前,如果存储需要尽早存储的值,就像这个管道中的情况一样) --而不是Register Read阶段。

(旁白:一些流水线在周期的前半部分执行寄存器写入,在周期的后半部分执行寄存器读取。这不仅可以减少寄存器文件所需的访问端口数量,而且还允许值可以提前一个周期从寄存器文件中获得,因为新写入值的读取可能发生在与写入相同的周期的后半部分。这减少了所需的旁路量。)

于 2013-09-27T23:52:52.677 回答