Noint's Studio.

Hazards in Pipelined CPU

Word count: 819Reading time: 2 min
2023/10/17

在流水线CPU中,”hazards”(或称为冲突)是一种情况,它阻碍了流水线的连续和高效执行。这些冲突通常分为三类:

一、数据冲突(Data Hazards)

数据冲突发生在一个指令需要使用上一个或几个指令尚未完成计算的数据结果。

  • Read After Write (RAW):这是最常见的数据冲突类型。例如,第一条指令正在向寄存器R1写入数据,而第二条指令需要从R1读取数据。

解决方法:

数据前推(Data Forwarding)或者暂停(Stalling)。

截屏2023-10-17 11.01.05

截屏2023-10-17 11.03.06

截屏2023-10-17 11.04.16

二、控制冲突(Control Hazards)

控制冲突发生在分支指令处,因为在分支指令的目标地址计算完成之前,后续要执行的指令是不确定的。

  • Branch prediction:通过预测分支的结果,可以尝试解决这种冲突。

解决方法:

分支预测(Branch Prediction),分支目标缓冲器(BTB,Branch Target Buffer)等。

分支预测是解决控制冲突(Control Hazards)中的一种常用技术。当CPU遇到一个分支指令(例如,ifwhilefor等)时,它需要确定是跳转到新的地址还是继续按照原有的指令顺序执行。分支预测的任务就是预测这个决定,从而允许CPU在不等待分支指令实际执行完成的情况下继续填充和执行流水线。

常见的分支预测方法:

  1. 静态分支预测:不依赖于程序的运行时行为。例如,始终预测分支为“Taken”(会跳转)或“Not Taken”(不会跳转)。
  2. 动态分支预测
    • 一位动态预测器:使用一位(0或1)来记录最近一次分支的结果。
    • 两位饱和计数器:使用两位来更精确地记录分支的历史行为。
    • 分支目标缓冲区(BTB):存储分支指令的目标地址。
    • 局部和全局预测器:使用局部和全局的历史信息来进行更准确的预测。
  3. 混合分支预测器:结合多种预测方法,选择最有可能准确的一个。

三、结构冲突(Structural Hazards)

当多个指令需要使用同一硬件资源时,就会发生结构冲突。

  • 例如,如果有一个指令在访问数据存储器(Data Memory)以加载数据,同时另一个指令也需要访问数据存储器以存储数据,那么就会出现结构冲突。

截屏2023-10-17 10.52.40

解决方法:

可以通过硬件复制或时间多路复用等方法来解决。

多次访问内存

  • 解决方案包括分割指令和数据内存、使用多个内存端口或指令缓冲器。
  • 需要通过提高内存带宽(至少5倍)来改善性能。

多次访问寄存器文件

  • 双倍增速(Double Bump):通过增加寄存器文件的访问速度或并行度来解决。

截屏2023-10-17 10.55.34

非全流水线功能单元

  • 解决方案包括将功能单元全流水线化。
  • 使用多个功能单元进行操作。

实际机器常常存在结构冲突

  • 在现实世界的机器中,结构冲突是一个普遍存在的问题,需要综合考虑多种策略来进行优化。
CATALOG
  1. 1. 一、数据冲突(Data Hazards)
    1. 1.1. 解决方法:
  2. 2. 二、控制冲突(Control Hazards)
    1. 2.1. 解决方法:
  3. 3. 三、结构冲突(Structural Hazards)
    1. 3.1. 解决方法:
      1. 3.1.1. 多次访问内存
      2. 3.1.2. 多次访问寄存器文件
      3. 3.1.3. 非全流水线功能单元
      4. 3.1.4. 实际机器常常存在结构冲突