流水线是提高系统吞吐率的强大技术。1980s,risc设计的大部分技术都直接或间接以高效流水线技术为目标。
深度流水是获得高速时钟频率的必要条件。
2.1 流水线基础
指令流水线(本书重点)和算术流水线。
2.1.1 流水线设计
2.1.1.1 提出的动机
提高系统吞吐率的同时几乎不增加系统开销。
介绍了IBM360中的earle锁存器。
2.1.1.2 局限性
流水线地每一段可以看作是一个组合逻辑F加上一个锁存器L,信号通过F后在L锁存;
T_MAX通过F地最大传输延迟;
T_MIN通过F地最小传输延迟;
T_L正确建立时钟信号所需要地额外时间,包括必要地建立和保持时间。
时钟周期 T > T_MAX - T_MIN + T_L
T_MAX - T_MIN可以趋向于0(延长最小传输路径)
T_L受整个系统内时钟信号分布影响;==>流水线深度与T_L有关。
2.1.1.3 权衡
流水线性能(深度)和价格;(深度受时钟频率的限制)
一个k级流水线的价格C:
C=G+k∗L(线性)
其中k为流水线的段数,L为每增加一个锁存器的价格,G为原本非流水硬件的价格。
流水线的性能:
P=1/(T/k+S)(非线性)
其中T为非流水线系统延迟,S是由于引入锁存器而带来的延迟
价格性能比:
C/P=LT+GS+LSk+GT/k
求导:
Kopt=(GT/LS)^(1/2)
当k小于Kopt时,流水线系统称为 不够完全流水化,即可以进一步实现流水化,增加流水线深度
当k大于Kopt时,流水线系统称为 过度流水化,此时增加流水线深度而提高的性能由于价格增加而抵消
本模型为考虑到执行的程序和流水线的动态行为。
2.1.2 算术流水线的实例
2.1.2.1 浮点乘法
2.1.2.2 流水化的浮点乘法器
非流水化的浮点乘法器可以通过流水化来提高吞吐率。体会区别。
2.1.3 流水线理想假设
1、一致的运算分量:要完成的整个运算量可以均匀的分成延迟一致的若干分量,将以前的运算量分为若干分量时,没有引入无效时间;段间缓冲的引入没有带来额外的延迟
2、重复的运算:输入数据有大量相同的,重复的运算,所有的流水段总是被充分利用
3、独立的运算:所有相同的重复运算之间没有相关性
2.1.3.1 一致的运算分量
内部碎片:延迟较短的段中的无效时间。(时钟周期取决于延迟最长的段)
还有一个内在的假设:流水段之间引入的缓冲且流水线的时钟信号不会带来额外的延迟。
==>实际芯片设计中可以采用锁存器(比如earle)减小时钟产生的延迟。
==>我们的目标:尽可能使各流水段保持均衡。
2.1.3.2 重复的运算
外部碎片:执行流水段的子集时,由于输入数据的同步性,有些流水段空闲,被称为外部碎片。
这条理想假设还要说明要处理的数据是大量的,以忽略填充和排空的时间。
2.1.3.3 独立的运算
任何两个运算间不存在数据相关和控制相关。
如果相关不可避免,会产生动态的外部碎片,应当尽量减少流水线停顿的次数。
2.1.4 指令流水线
指令流水线实际情况和理想情况差距较算是流水线要大。
2.1.4.1 指令流水线设计
指令周期:逻辑概念,处理一条指令地时间延迟;体系结构(逻辑)的原语,由ISA定义。
机器周期:物理概念,流水线的时钟周期;机器(物理)原语,由微体系结构定义。
每一段“指令周期”的时间延迟决定了“机器周期”。
指令流水线设计的主要任务是将指令周期所对应的运算分成一个子运算的序列,由流水线的各段执行。
1、一致的运算分量
量化流水段,将指令周期分解成多个机器周期的过程;
尽量减少内部碎片,对存储器的访问是关键,寻址方式优化;
保持流水线均衡;
2、重复的运算
指令流水线是多功能流水线,处理多种不同的指令;
减少每种指令的无效或空闲的机器周期,即减少外部碎片,要对不同指令需要的子运算序列资源进行整合。
能支持所有的指令类型;
3、独立的运算
指令流水线指令彼此并不完全独立,须有内部机制来检测相关。
相关会导致流水线停顿,应当尽量减少。
2.1.4.2 ISA的影响
1、一致性运算分量:延迟最长的分量一般是存储器访问,是为关键分量。应优化寻址模式,采用快速cache。
2、重复的运算:对于RISC结构,外部碎片较少,流水线效率较高。
3、独立的运算:尽量减少指令相关引起的流水线停顿,尤其是存储器访问有关。
2.2 流水线处理器设计
主要任务:缩小理想和实际的差异
主要挑战:
一致的运算分量==>保持流水段均衡
重复的运算==>统一指令类型
独立的运算分量==>尽量减少流水线停顿
2.2.1 保持流水段均衡
取指(IF) –> 译码(ID) –> 执行 –> 访存 –> 回写(五段流水线)
取值 –> 译码 –> 取操作数(OF) –> 执行(EX) –> 存储(OS)(基本流水线)
基本的是分为5个分量,但不局限;
量化流水线可以将多个分量合成一个分量,也可以将1个分量进一步分成多个分量;
eg:若某ISA采用定长指令,简单寻址模式和正交指令格式,则IF和ID较其他段设计简单,可将其合并为1个分量。比如MIPS R2000/R3000。
同时需要考虑硬件能力,一个机器周期内可以处理几次读写请求;
2.2.1.2 硬件要求
性价比。
硬件包含:每一段进行控制和完成数据操作的逻辑,支持多个流水段同时访问的寄存器文件端口和存储器端口。
2.2.1.3 指令流水线实例
两个实例。
目前流水线处理器的设计趋势是向着更高的流水程度和更深的流水线深度发展,这样得到的流水线级粒度更小,时钟频率更高。
超标量处理器有个趋势是采用多条级数不等的流水线。
2.2.2 统一指令类型
由于指令类型不同,指令流水线要想满足不同的需求,必须提供所有指令类型所需要的所有分量的超集。以尽量减少外部碎片。
2.2.2.1 指令类型的分类
完成以此运算的三大基本任务:
ALU指令:完成算数和逻辑运算;(寄存器)
load/store指令:完成数据在寄存器及存储器间的移动;(只有该类型能访存,带偏移的寄存器寻址)
分支指令:控制指令执行的顺序;(PC相对寻址,带偏移的寄存器寻址)
指令集设计的关键问题:如何将这三个基本任务分派给ISA中的各种指令。
受RISC影响,现代ISA倾向于采用定长、正交的指令格式、load/store型指令结构和简单的寻址模式。
在现代RISC中,每种指令类型只完成三个基本任务中的一个。
2.2.2.2 资源需求的整合
资源整合为6级流水,load使用6级,其他3种指令使用5级;
ALU:一个空闲周期MEM
ST:不需要WB
branch:不需要WB
优化目标:
1、减少所有指令类型需要的资源总量
2、提高所有流水段的利用率
3、减少每种指令类型的总延迟(如果某指令的空闲周期不可避免,尝试把它放到流水线末尾)
2.2.2.3 指令流水线的实现
2.2.3 减少流水线的停顿
如果有指令相关,化解相关可能会导致流水线停顿;
2.2.3.1 程序相关性和流水线相关
真相关:RAW,先写后读
反相关:WAR,先读后写
输出相关:WAW,写后写
全序执行:指令序列中所有运算分量顺序执行
保证程序语义的必要条件是不违背所有指令间的相关。对程序相关性的违背称作流水线相关。
2.2.3.2 流水线相关的确定
存储器数据相关/寄存器数据相关/控制相关
控制相关可以看作是关于PC的WAR相关。
2.2.3.3 化解流水线相关
延迟分支解决控制相关:在发生分支后的时钟周期内插入一定会执行的指令以减少等待时间。
停止执行发生相关的指令,并保证对相关寄存器的读写是按正常顺序进行的;
2.2.3.4 通过定向路径减少开销
定向路径和关键定向路径的概念
通过定向路径减少开销:新增物理的定向路径输出数据;
2.2.3.5 流水线互锁的实现
流水线互锁机制:检测出所有的流水线相关,并保证所有相关得到满足;流水线互锁机制包括停止流水线的某一段以及数据在定向路径中的传输控制等。(ALU的RAW,Load的RAW,条件分支指令)
2.2.4 产品化的流水线处理器
流水线技术在RISC和CISC均得到了成功的应用。
2.2.4.1 RISC实例
2.2.4.2 CISC实例
2.2.4.3 标量流水线处理器的性能
使CPI接近1
2.3 深流水线处理器
深流水线能缩短时钟周期,提高时钟频率。
要保证总体性能有所提高,频率的增加要超过CPI的增加。
降低深流水线中分支指令带来的负面影响的两种方法:
1、减少前段流水线(取指段到完成分支指令的相应段的距离)的段数,例如RISC,减少译码的复杂性,前端段数就会比较少
2、将前段流水线的一部分移至后端,例如将译码结果存储在某个cache中,跳过之后的译码段
增加流水线深度的权衡(之前有性能和价格的权衡)
1、硬件开销和性能提升之间的权衡
2、增加CPI和提高时钟频率之间的权衡
2.4 总结
流水线技术是一项可以用于任何ISA的微体系结构技术。
性能的主要障碍是流水线停顿,其中最主要的部分是控制相关引起的分支开销。用动态预测分支来减少。
减小分支开销的方法:
1、减少前段流水线的段数
2、增加动态分支预测算法的准确性
传统的CPU设计观念是数据通路和控制通路的设计,流水线这种划分已经不明显。皆被流水化,被合并到同一条流水线。