三大冒险

冒险 成因 解决
数据冒险 RAW (课内主要)
WAR
WAW
流水线气泡
旁路转发
Noop
静态调度
结构冒险 同一周期同一部件收到多个指令访问 增加硬件资源
哈佛架构
控制冒险 下一条指令未知,两种可能 分支预测
分支延迟
软硬件阻塞

数据冒险

成因

  • 读后写 WAR
  • 写后读 RAW
  • 写后写 WAW

解决

  • 硬件
    • 流水线气泡 Stalling/Bubbling
    • 数据转发/旁路 Forwarding/Bypassing 只能转发 ALU result 自返回到操作数解决RAW 读后写冒险中的数据依赖问题,无法解决 load-use 数据冒险
load-use 数据冒险

属于 RAW 读后写冒险,意为 load 后紧跟 use (比如 add) 五级流水线结构中,load 指令流程如下:

  1. IF:取指
  2. ID:解析操作数和寻址方式
  3. EX: 计算寻址结果 (例如基址寻址要计算基址 + 偏移量)
  4. MEM:从 EX 结果寻址取数据
  5. WB:写回数据

如果 load 后紧跟 use,会导致 use 的 EX 阶段 load 还在 MEM 阶段,寻址数据尚未读到. 所以 Bypassing 无法解决

  • 软件
    • 插入 Noop
    • 编译调动指令顺序 (静态调度)

结构冒险

成因

同一周期内,同一部件收到多条指令访问

解决

  • 增加硬件资源
  • 采用哈佛架构,分为指令缓存 i-cache & 数据缓存 d-cache

控制冒险

成因

分支条件计算完成前,后续执行指令未知,流水线无法进行

解决

  • 分支预测
  • 分支延迟
  • 软硬件阻塞
    • stalling/bubbling
    • 软件插入 noop