CA-第九讲 流水线中的冲突

Molaters Lv5
[[计算机体系结构]]

流水线的性能

吞吐率 加速比 效率

流水线性能的若干问题

流水线的冲突

产生的原因

冲突的分类

流水线的结构冲突

产生的原因

避免结构冲突的办法

有些流水线的设计允许结构冲突的存在

流水线的数据冲突(暂停和定向)

流水线的数据冲突

image.png

产生的原因:当指令在流水线中重叠执行时,流水线有可能改变指令读/写操作数的顺序,使之不同于它们在非流水实现时的顺序,这将导致数据冲突。

消除方法: 向流水线中插入暂停周期

通过定向技术减少数据冲突带来的暂停

定向(forwarding), 也称为旁路

工作过程

主要思路:将计算结果直接从产生的地方送到正需要的地方,就可以避免暂停。

  • 寄存器文件EX/MEM中的ALU运算结果总是回送到ALU的输入寄存器

  • 从定向通路得到输入数据的ALU操作不必从源寄存器里面读取操作数

进一步推广:一个结果不仅可以从某一个功能单元输出定向到其自身的输入,而且还可以定向到功能单元的输入

image.png

数据冲突的分类

两条指令 i 和 j, 都会访问同一个寄存器R,假设i先进入流水线,那么它们对R有四种不同的访问顺序:

先写后读冲突(RAW)—— i 写 j 读

最常见的数据冲突,是程序最重要的特征之一。

先写后写冲突(WAW)—— i 写 j 写

修改之后的DLX流水线就会产生WAW相关

image.png

这个是后面的指令在前面的指令之前就写回

先读后写冲突(WAR)—— i 读 j 写

注意没有读后读冲突。

需要暂停的数据冲突

并非所有的冲突都可以通过定向技术解决

增加流水线“流水线互锁”部件,当互锁硬件发现这样的冲突之后,就暂停流水线,直到相关解除。

在这种情况下,暂停的时钟周期数就称为“载入延迟

image.png

解决的方法:就是产生气泡,将之前出现数据冲突的方式给再隔开

对数据冲突的编译调度方法

流水线中会遇到多类型的暂停

编译器可以通过重新排列代码的顺序来消除这种暂停,这就是”流水线调度“和“指令调度

image.png

基于调度来执行暂停的方法,可以将不相关的指令来进行调度,可以不仅起到气泡的作用,还可以不影响正常的执行速度

对MIPS流水线控制的实现

指令发射:指令从流水线的译码段进入执行段的过程称为指令的发射

检测数据冲突

  • ID段可以检测所有的数据冲突
  • 也可以在使用一个操作数的时钟周期的开始,并确定必须的定向
  • 流水线相关硬件可以检测到的各种冲突情况

针对不同的数据相关的内容,就需要检测数据相关的问题:

image.png

Load互锁的检测与实现

在ID段检测是否需要启动Load互锁,必须进行三种比较

一旦检测到冲突,控制部件必须在流水线中插入暂停周期,并使IF和ID段中的指令停止前进。

  • 讲ID/EX中控制部分清0
  • 保持IF/ID的内容不变

对MIPS流水线控制的实现

定向逻辑的实现

  • 所有定向都是从ALU/DM的输出到ALU、DM或者0单元的输入
  • 形成了一个旁路网络
    ✔️需要比较哪些信息?
    ✔️ALU输入端应该采用多少个输入的MUX?

image.png

流水线的控制冒险

分支指令的实现

  • 一旦分支转移成功,正确的地址要在Mem段才会被写入PC。
  • 一旦ID段检测到分支指令,就执行执行其后的指令,直到分支指令到达Mem段,确定新的PC为止
  • 分支转移成功将导致MIPS流水线暂停3个周期

image.png

减少分支开销的途径

✔️ 两个基本途径:同时采用,缺一不可!

:luc_check:在流水线尽早哦按段分支转移是否成功
:luc_check:转移成功的时候,尽早计算出转移目标地址

经过改进,MIPS流水线可以将分支开销减少一拍

image.png

流水段 分支指令操作
IF IF/ID.IR $\leftarrow$ Mem[PC]; IF/ID.NPC,PC $\leftarrow$ (if ID/EX.Cond {ID/EX.NPC} else {PC+4})
ID
EX
MEM
WB

再改进,MIPS流水线可以将分支开销再减少一拍

image.png

减少分支开销的途径

程序中分支指令的行为特点

各种能改变PC值的指令的执行额度

条件分支:

  • 整数程序: 14-15%
  • 浮点程序: 3-12%

其中,向前分支和向后分支的比:3:1

条件分支转移成功的概率

  • 向前转移成功率:60%;向后转移成功率:85%

减少流水线分支损失的方法

  1. 冻结或者排空流水线

    思路:在流水线中停住或者删除分支之后的指令,直到知道转移目标地址

    优点:简单

  2. 预测分支转移失败

    思路:流水线继续照常流动,如果分支转移成功,就将分支指令后的指令转换为空操作,并从分支目标处开始取指令执行;否则照常执行

  3. 预测分支转移成功

    思路:始终假设分支成功,直接从分支目标处取指令执行,对MIPS没有任何好处

  4. 延迟分支

    ⭐思路:分支开销为n的分支指令后面紧跟有n个延迟槽,流水线遇到分支指令的时候,按照正常方式来处理,顺带执行延迟槽中的指令,从而减少分支开销。

image.png

所以什么样的指令能够放入分支延迟槽

三种调度方法:

  • 从前调度
  • 从目标处调度
  • 从失败的位置调度

各种分支处理方法的性能

  1. 假设理想CPI = 1,则加速比

$$
S = D / (1+C) = D / (1+f \times p_{分支})
$$
这里,D为流水线的深度,$p_{分支}$为分支开销,C为分支引起的流水线暂停时钟周期数

实例分析 : MIPS R4000

MIPS R4000的整型流水线
MIPS R4000的浮点流水线
MIPS R4000流水线性能分析

整型流水线

指令集:64位MIPS-3指令集

MIPS R4000流水线结构

  • 超流水结构
  • 访存操作流水化

流水线各段的功能

指令序列在流水线中的重叠执行过程。

定向+插入暂停周期

载入延迟为两个时钟周期

指令序列在流水线中的执行时空图

image.png

R4000流水线的定向路径远多于MIPS流水线

ALU输入端的定向源有4个:EX/DF,DF/DS,DS/TC,TC/WB

  • 标题: CA-第九讲 流水线中的冲突
  • 作者: Molaters
  • 创建于 : 2023-11-24 11:30:49
  • 更新于 : 2023-10-12 17:04:20
  • 链接: https://molaters.github.io/2023/11/24/计算机体系结构/CA-第九讲 流水线中的冲突/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论