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

流水线的性能
吞吐率 加速比 效率
流水线性能的若干问题
流水线的冲突
产生的原因
冲突的分类
流水线的结构冲突
产生的原因
避免结构冲突的办法
有些流水线的设计允许结构冲突的存在
流水线的数据冲突(暂停和定向)
流水线的数据冲突
产生的原因:当指令在流水线中重叠执行时,流水线有可能改变指令读/写操作数的顺序,使之不同于它们在非流水实现时的顺序,这将导致数据冲突。
消除方法: 向流水线中插入暂停周期
通过定向技术减少数据冲突带来的暂停
定向(forwarding), 也称为旁路
工作过程
主要思路:将计算结果直接从产生的地方送到正需要的地方,就可以避免暂停。
寄存器文件EX/MEM中的ALU运算结果总是回送到ALU的输入寄存器
从定向通路得到输入数据的ALU操作不必从源寄存器里面读取操作数
进一步推广:一个结果不仅可以从某一个功能单元输出定向到其自身的输入,而且还可以定向到功能单元的输入
数据冲突的分类
两条指令 i 和 j, 都会访问同一个寄存器R,假设i先进入流水线,那么它们对R有四种不同的访问顺序:
先写后读冲突(RAW)—— i 写 j 读
最常见的数据冲突,是程序最重要的特征之一。
先写后写冲突(WAW)—— i 写 j 写
修改之后的DLX流水线就会产生WAW相关
这个是后面的指令在前面的指令之前就写回
先读后写冲突(WAR)—— i 读 j 写
注意没有读后读冲突。
需要暂停的数据冲突
并非所有的冲突都可以通过定向技术解决
增加流水线“流水线互锁”部件,当互锁硬件发现这样的冲突之后,就暂停流水线,直到相关解除。
在这种情况下,暂停的时钟周期数就称为“载入延迟”
解决的方法:就是产生气泡,将之前出现数据冲突的方式给再隔开
对数据冲突的编译调度方法
流水线中会遇到多类型的暂停
编译器可以通过重新排列代码的顺序来消除这种暂停,这就是”流水线调度“和“指令调度”
基于调度来执行暂停的方法,可以将不相关的指令来进行调度,可以不仅起到气泡的作用,还可以不影响正常的执行速度
对MIPS流水线控制的实现
指令发射:指令从流水线的译码段进入执行段的过程称为指令的发射
检测数据冲突:
- ID段可以检测所有的数据冲突
- 也可以在使用一个操作数的时钟周期的开始,并确定必须的定向
- 流水线相关硬件可以检测到的各种冲突情况
针对不同的数据相关的内容,就需要检测数据相关的问题:
Load互锁的检测与实现
在ID段检测是否需要启动Load互锁,必须进行三种比较
一旦检测到冲突,控制部件必须在流水线中插入暂停周期,并使IF和ID段中的指令停止前进。
- 讲ID/EX中控制部分清0
- 保持IF/ID的内容不变
对MIPS流水线控制的实现
定向逻辑的实现
- 所有定向都是从ALU/DM的输出到ALU、DM或者0单元的输入
- 形成了一个旁路网络
✔️需要比较哪些信息?
✔️ALU输入端应该采用多少个输入的MUX?
流水线的控制冒险
分支指令的实现
- 一旦分支转移成功,正确的地址要在Mem段才会被写入PC。
- 一旦ID段检测到分支指令,就执行执行其后的指令,直到分支指令到达Mem段,确定新的PC为止
- 分支转移成功将导致MIPS流水线暂停3个周期
减少分支开销的途径
✔️ 两个基本途径:同时采用,缺一不可!
:luc_check:在流水线尽早哦按段分支转移是否成功
:luc_check:转移成功的时候,尽早计算出转移目标地址
经过改进,MIPS流水线可以将分支开销减少一拍
流水段 | 分支指令操作 |
---|---|
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流水线可以将分支开销再减少一拍
减少分支开销的途径
程序中分支指令的行为特点
各种能改变PC值的指令的执行额度
条件分支:
- 整数程序: 14-15%
- 浮点程序: 3-12%
其中,向前分支和向后分支的比:3:1
条件分支转移成功的概率
- 向前转移成功率:60%;向后转移成功率:85%
减少流水线分支损失的方法
冻结或者排空流水线
思路:在流水线中停住或者删除分支之后的指令,直到知道转移目标地址
优点:简单
预测分支转移失败
思路:流水线继续照常流动,如果分支转移成功,就将分支指令后的指令转换为空操作,并从分支目标处开始取指令执行;否则照常执行
预测分支转移成功
思路:始终假设分支成功,直接从分支目标处取指令执行,对MIPS没有任何好处
延迟分支
⭐思路:分支开销为n的分支指令后面紧跟有n个延迟槽,流水线遇到分支指令的时候,按照正常方式来处理,顺带执行延迟槽中的指令,从而减少分支开销。
所以什么样的指令能够放入分支延迟槽
三种调度方法:
- 从前调度
- 从目标处调度
- 从失败的位置调度
各种分支处理方法的性能
- 假设理想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流水线结构
- 超流水结构
- 访存操作流水化
流水线各段的功能
指令序列在流水线中的重叠执行过程。
定向+插入暂停周期
载入延迟为两个时钟周期
指令序列在流水线中的执行时空图
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 进行许可。