0%

Pipeline

流水线

面积换性能

  • 流水线
    • 一个周期执行多条指令
    • 需要额外寄存器
    • 每级流水线内部有各自的组合逻辑数据通路,硬件资源无复用。
  • 状态机
    • 几个周期执行一条指令
    • 硬件资源可以复用

流水线深度

  • 流水线越深

    • 吞吐率高,性能高

    • 面积开销大

    • 反压

    • 分支预测失败/流水线冲刷(Pipeline Flush)

      取值阶段无法得知结果是否跳转,只能进行预测。

      若预测失败,需要将预取的错误指令流全部丢弃,重新取正确的指令流。

      流水线越深,则预取了更多的错误指令,性能的损失、功耗的浪费越严重。

  • 流水线越浅

    • 面积开销小,功耗低
    • 性能弱

反压

  • 取消握手
  • 乒乓缓存
  • 前向旁路缓存

流水线冲突

  • 资源冲突

    • 最常见的是运算单元的冲突

      例:除法运算需要多个周期,若前序除法指令完成运算之前,后序除法指令也需要除法器,则存在资源冲突

    • 解决方法:复制硬件资源、流水线停顿等

  • 数据冲突

    • WAR相关性(先读后写相关性)

      后序指令不能比和它有WAR相关性的前序指令先执行。

      否则后序指令先写回结果到通用寄存器组,导致前序指令读取错误的操作数。

    • WAW相关性(先写后写相关性)

      后序指令不能比和它有WAW相关性的前序指令先执行。

      否则后序指令先写回结果,导致前序指令再写回结果,导致结果被覆盖。

    • RAW相关性(先写后读相关性)

      后序指令不能比和它有RAW相关性的前序指令先执行。

      否则前序指令未写回结果,导致后序指令读取错误的操作数。

    • 解决方法

      • WAR、WAW

        寄存器重命名 (Register_renaming)

        1

      • RAW:真数据相关

        动态调度 (Tomasulo_algorithm)

        • 采用数据旁路传播,尽可能让前序指令的计算结果更快地旁路传播给后序指令的操作数。

        • 尽可能让后序指令在等待过程中不阻塞流水线,让其他无关的指令继续执行。

        • 在每个运算单元前配置乱序发射队列。

          发射队列仅追踪RAW相关性,并不存放操作上,因此可以做到很深。

          在发射队列中的指令一旦解除相关性,再从发射队列中发射出来读取物理寄存器组,然后再发送给运算单元开始计算。