(混乱版)数据冒险dadd和sd-LMLPHP

  • mips和riscv含义应该差不多,指令集得差别区别不大,算法设计思想还是差不多得,稍微看一下各个学校得实验报告mips仿真软件还挺多,还不需要自己画流水线图,比如winmips64和可以使用BHT得mars,有scoreboard算法得mips64,RISCV只有ripes

  • 看这两条代码得竞争关系,插入nop用于延时

第一张图ID后有两个RAW

为什么会发生 RAW 冒险

RAW(Read After Write) 数据冒险意味着后续指令需要读取的寄存器数据是由前一条指令写入的,而前一条指令还没有完成写回。具体来说:

  • 第一条指令 dadd r3,r4,r5 执行完后会将结果写入寄存器 r3
  • 第二条指令 sd r3, C(r0) 需要从寄存器 r3 读取数据,将其存储到内存地址 C(r0)
  • 但是,由于 sd 指令在其 ID(译码)阶段 之后需要使用 r3 的值,而此时 dadd 指令尚未完成其 WB(写回)阶段,因此 sd 指令读取不到正确的 r3 值,从而发生了 RAW 冒险。

具体冒险过程

  1. 第一条指令 dadd r3,r4,r5 在流水线的 EX 阶段计算完成并准备写入 r3
  2. 第二条指令 sd r3, C(r0) 在 ID 阶段发现它依赖于 r3 的值。
  3. 由于 dadd 还未将结果写回到 r3sd 指令在 ID 阶段后停顿,等待 dadd 指令完成写回,从而导致 RAW 冒险。

解决 RAW 冒险的办法

如果处理器支持转发机制,则可以在 dadd 指令的 EX 阶段完成计算时直接将结果转发给 sd 指令,而不必等待 WB 阶段,从而避免冒险。

在没有转发机制的情况下,RAW 冒险会导致流水线停顿,需要等待前一条指令写回完成后,后续指令才能继续。

总结

  • 两个 RAW 阶段分别表示 daddr4r5 的依赖。
  • 因为没有转发机制,dadd 只能等到前两条 ld 指令完成 WB 阶段,确保数据已写回寄存器后,才可以继续执行。
  • 如果有转发机制,这些 RAW 阶段可以被消除,使 dadd 指令在不等待写回的情况下直接获取数据。

数据转发解决冒险

在这个流水线图中,DADD r3, r4, r5SD r3, C(r0) 的执行顺序和阶段显示了数据流动的情况。要判断是否实现了转发,我们可以关注以下几点:

分析数据冒险和转发情况

  1. 指令依赖关系

    • 第二条指令 SD r3, C(r0) 需要使用 DADD 指令计算出的 r3 的结果。
    • 如果没有转发,SD 指令通常需要等待 DADD 指令的结果写回寄存器(即完成 WB 阶段)后,才能从 r3 中读取正确的数据。
  2. 流水线图观察

    • DADD 指令在 EX 阶段完成计算,并在 WB 阶段写回结果。
    • SD 指令在 EX 阶段直接使用了 r3 的值,这意味着 SD 指令的 EX 阶段能够获得 DADD 指令的结果。
  3. 转发实现

    • 从图中可以看到,SD 指令在 DADD 指令的 WB 阶段之前就进入了 EX 阶段,并且不需要等待 DADD 完成写回。SD 指令能够直接在 EX 阶段使用 DADD 的结果,这表明 转发机制 已经实现。
    • 转发机制将 DADD 的结果从 EX 阶段直接转发给了 SD 指令的 EX 阶段,避免了等待 WB 阶段的写回。

结论

是的,这样的流水线图实现了转发DADD 指令的结果在 EX 阶段计算出来后,直接转发给了 SD 指令的 EX 阶段,避免了数据冒险和等待 WB 阶段的写回,从而使流水线更高效地执行。

dadd指令和sd指令在五级流水中得步骤

在 MIPS 的经典五阶段流水线中,DADD(双字加法指令)和 SD(存储双字指令)在每个流水线阶段的执行过程如下:

流水线的五个阶段简介

  1. IF(Instruction Fetch,取指令阶段):从指令内存中取出指令,并将其加载到指令寄存器中。
  2. ID(Instruction Decode,指令译码阶段):解析指令,读取寄存器中的操作数,并确定目标寄存器或内存地址。
  3. EX(Execute,执行阶段):执行运算(如加法、减法)或计算内存地址(如加载、存储指令的目标地址)。
  4. Mem(Memory Access,内存访问阶段):对于加载和存储指令,访问数据内存。对于其他指令,跳过该阶段。
  5. WB(Write Back,写回阶段):将计算或加载的结果写回寄存器文件。

DADD 指令在流水线的五个阶段

假设指令 dadd r3, r0, r0 是一条双字加法指令,将 r0 的值加到自身并存储到 r3 中。它在流水线各阶段的操作如下:

  1. IF(取指令)

    • 从指令内存中取出 dadd r3, r0, r0 指令。
    • 将指令加载到指令寄存器(IR)中,更新程序计数器(PC)以指向下一条指令。
  2. ID(指令译码)

    • 解析指令 dadd r3, r0, r0
    • 从寄存器文件中读取源寄存器 r0 的值。
    • 将操作数(两个 r0 的值)准备好,供下一阶段执行。
  3. EX(执行)

    • 执行加法运算,将 r0 的值与自身相加,计算结果存储在临时寄存器中。
    • 在此阶段完成的运算结果将准备好供后续阶段使用。
  4. Mem(内存访问)

    • DADD 是一个纯算术指令,不涉及内存访问,因此该阶段跳过。
    • 如果流水线支持转发,运算结果可以在该阶段转发给后续依赖的指令。
  5. WB(写回)

    • 将执行阶段的计算结果写回目标寄存器 r3
    • 更新寄存器文件中的 r3,供后续指令使用。

SD 指令在流水线的五个阶段

假设 sd r3, C(r0) 是一条存储双字指令,将寄存器 r3 的值存储到内存地址 C(r0) 中。它在流水线各阶段的操作如下:

  1. IF(取指令)

    • 从指令内存中取出 sd r3, C(r0) 指令。
    • 将指令加载到指令寄存器(IR)中,更新程序计数器(PC)以指向下一条指令。
  2. ID(指令译码)

    • 解析指令 sd r3, C(r0)
    • 从寄存器文件中读取源寄存器 r3 的值,作为要存储的数据。
    • 从寄存器 r0 中读取基址,准备计算目标内存地址。
  3. EX(执行)

    • 计算存储地址 C + r0,将偏移量 C 加上 r0 的值,得到最终的内存地址。
    • 将这个计算出的内存地址保存到一个临时寄存器中,供下一阶段使用。
  4. Mem(内存访问)

    • 使用计算出的地址,将 r3 的值存储到内存地址 C + r0 中。
    • 此阶段是 sd 指令的核心操作,完成了数据的实际存储。
  5. WB(写回)

    • SD 是存储指令,不需要将数据写回寄存器,因此该阶段跳过。

总结

  • DADD 指令通过五个阶段完成了加法运算,将结果写回寄存器。
    • 核心操作在 EX 阶段完成,结果写回发生在 WB 阶段。
  • SD 指令通过五个阶段完成了数据存储。
    • 核心操作在 Mem 阶段完成,将寄存器的值写入指定的内存地址。

(思考一)sd得ex阶段没有使用到r3

sd r3, C(r0) 指令的流水线执行过程中,EX 阶段实际上不需要用到 r3 的值,因为 sd 指令的 EX 阶段只进行地址计算(即计算 C + r0 的结果)。而 r3 的值实际上是直到 MEM 阶段才会被使用,即存储到计算出的地址中。因此,严格来说,sd 指令的 MEM 阶段才会真正依赖于 dadd 指令的结果。

基于这个理解,我们可以重新绘制流水线图,同时在 MEM 阶段引入转发,以确保 r3 的值能够及时提供给 sd 指令的 MEM 阶段。

  • 重新绘制的流水线图
    假设我们有五级流水线:IF(取指)、ID(指令译码/寄存器读取)、EX(执行/地址计算)、MEM(内存访问/存储操作)和 WB(写回寄存器)。

在这个流水线图中:

  1. 第一周期dadd r3, r4, r5 指令进入 IF 阶段。
  2. 第二周期dadd 指令进入 ID 阶段,sd r3, C(r0) 指令进入 IF 阶段。
  3. 第三周期
    • dadd 指令进入 EX 阶段,并在此计算出结果 r3
    • sd 指令进入 ID 阶段,读取了寄存器 r3 的值(尽管此时的 r3 值可能尚未更新)。
  4. 第四周期
    • dadd 指令进入 MEM 阶段。
    • sd 指令进入 EX 阶段,此时计算存储地址 C + r0
  5. 第五周期
    • dadd 指令进入 WB 阶段,将计算出的结果写回到寄存器 r3
    • sd 指令进入 MEM 阶段,此时通过转发获得 r3 的最新值并执行存储操作。

通过这种方式,sd 指令在其 MEM 阶段能够获得 dadd 指令的结果 r3 的值,从而顺利完成操作,无需等待额外的周期。这就是如何利用转发来解决这种数据依赖问题的过程。

(思考二)能转发到ID吗

通常情况下,转发(Forwarding) 机制是用于在 EX 或 MEM 阶段将运算结果直接传给后续指令的 EX 阶段,因此直接从 EX 转发给 ID 阶段并不常见。然而,在某些高级的流水线实现中,有些架构确实支持早期转发,即允许将结果转发给 ID 阶段以减少等待周期。

在你给的例子中,sd r3, C(r0) 在 ID 阶段需要读取 r3 的值,如果我们能够在 dadd 指令的 EX 阶段计算出 r3 的值并立即转发给 ID 阶段,那么 sd 指令在 ID 阶段就可以获得最新的 r3 值,避免数据依赖带来的延迟。

重新调整的流水线图(假设支持转发给 ID 阶段)

假设流水线支持从 EX 阶段的 r3 结果直接转发给 sd 指令的 ID 阶段,我们的流水线图可以如下表示:

在这个流程中:

  1. 第一周期dadd r3, r4, r5 指令进入 IF 阶段。
  2. 第二周期dadd 指令进入 ID 阶段,sd r3, C(r0) 指令进入 IF 阶段。
  3. 第三周期
    • dadd 指令进入 EX 阶段并计算出 r3 的结果。
    • 同时,通过转发,将 r3 的计算结果从 EX 阶段直接传给 sd 指令的 ID 阶段。
  4. 第四周期
    • dadd 指令进入 MEM 阶段。
    • sd 指令进入 EX 阶段,计算存储地址 C + r0(此时已经获得了 r3 的值)。
  5. 第五周期
    • dadd 指令进入 WB 阶段。
    • sd 指令进入 MEM 阶段,将 r3 的值存储到目标地址。

结论

在这种情况下,通过将 dadd 指令的 EX 结果转发到 sd 指令的 ID 阶段,可以避免数据依赖的延迟。但是,这种早期转发需要硬件支持,并不是所有流水线结构都具备这种能力。

.data

C: .word 0
.text

main:

dadd r3,r4,r5

sd r3,C(r0)

nop

nop

nop

nop

nop

halt

一些参考回答

在有转发机制的流水线中,确实可以在 DADD 指令的 EX 阶段直接将结果转发给 SD 指令的 ID 阶段,而不必等待 DADD 完成 WB(写回)阶段。这是流水线优化中的一种常见手段,可以避免停顿,提高流水线的执行效率。

如何实现转发:DADD 的 EX 直接转发到 SD 的 ID

在这个场景中:

  1. DADD 指令dadd r3, r0, r0)在 EX 阶段计算结果并将结果保存在一个临时寄存器中。
  2. DADD 指令完成 EX 阶段后,它的结果 r3 还未写回寄存器文件,因为它的 WB 阶段还没有开始。
  3. SD 指令sd r3, C(r0))在 ID 阶段会尝试读取 r3 的值。
    • 由于有转发机制,SDID 阶段可以直接接收来自 DADD 的 EX 阶段的结果,而不是从寄存器文件中读取 r3

具体的流程

  • DADD 的 EX 阶段:在 EX 阶段,DADD 指令计算出 r3 = r0 + r0 的结果。转发机制会检测到 SD 指令依赖于 r3,因此会直接将 r3 的值转发到 SD 指令的 ID 阶段。
  • SD 的 ID 阶段:在 SD 指令的 ID 阶段,它原本需要从寄存器 r3 读取数据。但是,由于 DADD 的结果已经通过转发机制传递过来,SD 可以在 ID 阶段直接接收到 r3 的最新值,而不必等待 DADD 写回寄存器。

优点

这种转发的方式可以有效地避免 RAW(Read After Write)数据冒险,因为 SD 指令不需要等待 DADD 完成写回才能获得 r3 的正确值。这样:

  • 节省了一个流水线周期,因为 SD 指令不需要等待 DADD 写回。
  • 提高了流水线效率,使得指令可以更快地执行完毕。

注意事项

  1. 硬件支持:实现这种转发机制需要硬件支持,处理器需要一个额外的数据路径和控制逻辑,确保在 EX 阶段的结果可以直接传递给下一条指令的 ID 阶段。
  2. 依赖检测:流水线控制单元需要检测指令之间的依赖关系,以便在必要时启用转发机制,确保数据在正确的时刻转发到依赖的指令。

总结

通过转发机制,DADD 指令的结果可以在 EX 阶段直接转发到 SD 指令的 ID 阶段,这避免了 SD 指令的停顿,提升了流水线的效率。这种优化对于减少数据冒险、提高指令并行度非常重要。


在典型的流水线实现中,转发通常是将数据转发给依赖指令的 EX(执行)阶段,而不是 ID(指令译码)阶段。所以,在这个案例中,DADDEX 阶段的结果会被直接转发到 SD 指令的 EX 阶段,而不是 SD 的 ID 阶段。

原因解析

  1. ID 阶段的主要任务:ID 阶段(指令译码阶段)主要负责解析指令、读取寄存器的值、并确定指令的操作数和目标寄存器。此阶段通常不会执行实际的算术或逻辑操作。

  2. EX 阶段的主要任务:EX 阶段(执行阶段)是流水线中执行算术、逻辑运算或地址计算的阶段。对于 SD 指令来说,EX 阶段负责计算存储的目标内存地址。此时,SD 需要寄存器 r3 的值,才能将其作为要存储的数据。

  3. 转发给 EX 阶段的目的:在没有转发机制的情况下,SD 指令需要等待 DADD 完成写回,才能在 EX 阶段获得 r3 的值。然而,通过转发机制,DADD 的 EX 阶段结果可以直接提供给 SD 的 EX 阶段,而无需等待 WB 阶段的写回。这避免了数据冒险并消除了不必要的停顿。

具体的转发流程

  • DADD 的 EX 阶段:在 DADD 指令的 EX 阶段,它计算出 r3 = r0 + r0 的结果。
  • SD 的 EX 阶段:当 SD 指令进入 EX 阶段时,转发机制会将 DADD 的 EX 阶段结果直接提供给 SD 的 EX 阶段,使 SD 可以使用最新的 r3 值,而不必等待 DADD 完成写回。

总结

因此,转发是在 DADD 的 EX 阶段将结果直接转发到 SD 的 EX 阶段,这样可以避免等待写回阶段,减少数据冒险的影响,提高流水线的执行效率。

11-09 07:23