流水线概念简析之流水线模式、流水线深度
扫描二维码
随时随地手机看文章
1.1. 每一个具体步骤就是一条业务指令 1
2. 流水线的级数(深度 2
2.1. 如何确定合适的级数 深度 2
3. 流水线深度 3级流水 5级别 15级别 2
4. 流水线深度过深的问题 3
4.1. 复杂度也不能一直细化划 3
4.2. 分支预测流水线冲刷(Pipeline Flush) 3
5. 流水线其他概念 4
5.1. ”流水线停顿(pipeline stall)” 4
5.2. 两条指令之间的关系可以分为:数据相关和控制相关,数据相关分为; 4
5.3. 流水线互锁实现 5
5.4. 动态分支预测 5
1.1. 每一个具体步骤就是一条业务指令
流水线处理器性能的主要障碍是指令相关引起的流水线停顿,其中控制相关引起的分支开销是最重要的部分。
动态分支预测能减少这一部分的开销,预测成功时,流水线没有停顿。在检测到预测失败时,必须清空流水线。
减少从取指段到完成分支指令段的距离也可以减少分支指令引起的开销。
在流水线处理器设计中,不仅仅数据通道被流水化了,连控制通道也被流水化了,传统的数据通道和控制通道被合并到同一条流水线。
2. 流水线的级数(深度
采用流水线技术后,并没有加速单条指令的执行,每条指令的操作步骤一个也不能少,只是多条指令的不同操作步骤同时执行,因而从总体上看加快了指令流速度,缩短了程序执行时间。
为了进一步满足普通流水线设计所不能适应的更高时钟频率的要求,高档次处理器中的流水线的深度(级数)在逐代增多。当流水线深度在5~6级以上时,通常称为超流水线结构(SuperPipeline)。显然,流水线级数越多,每级所花的时间越短,时钟
2.1. 如何确定合适的级数 深度
产上的装配流水线。在CPU中由5—6个不同功能的电路单元组成一条指令处理流水线,然后将一条X86指令分成5—6步后再由这些电路单元分别执行,这样就能实现在一个CPU时钟周期完成一条指令,因此提高CPU的运算速度。经典奔腾每条整数流水线都分为四级流水,即取指令、译码、执行、写回结果,浮点流水又分为八级流水。
面6 bit标识指令的操作码,即这条指令是干什么的,后面26 bit是这个跳转指令的跳转地址。指令是一串0、1序列,译码单元要将这条指令包含的有用数据解出来,如果是跳转指令,就要知道它的地址,如果是运算指令,就要知道的它的源操作数、目的操作数在哪,这样处理器才能进行后续的运算。
3. 流水线深度 3级流水 5级别 15级别
发展到 Cortex-A(32-bit)/ARMv7-A/Cortex-A8 已经支持多达 13 级流水线,后续支持更深度的甚至乱序(out-of-order)的超标量(superscalar)流水线结构。
以下列举了 List of ARM microarchitectures 中由 ARM 公司设计的 ARM cores(family/architecture/core) 对应的流水线级数发展史
4.3 MIPS经典五级流水线
(1)MIPS的五级流水线
MIPS体系架构依据流水线结构设计。只要CPU从缓存中获取数据,那么执行每条MIPS指令就被分成五个流水阶段,并且每个阶段占用固定的时间,通常是只耗费一个处理器时钟周期。RD/WB操作只占用半个时钟周期,故MIPS五段流水线只占用四个时钟周期。
MIPS处理器在设计时,将处理器的执行阶段划分为以下五个阶段:
对于运算指令,在MEM阶段空闲。对于load指令,在EX阶段计算要访问的地址,在MEM阶段从内存中将数据读入到MEMregister(MEM和WB之间的流水线寄存器)中,在WB阶段,将MEM register的数据写回到Register File中。对于store指令,在EX阶段计算要访问的地址,在MEM阶段将寄存器中的数据写回到存储器中。
大,对流水线性能有一定影响现在很多cpu都是将超标量和超级流水线技术一起使用,例如pentiumIV,流水线达到20级,频率最快已经超过3GHZ。教科书上用于教学的经典MIPS只有5级流水
4. 流水线深度过深的问题
以最知名的ARM Cortex-A系列处理器IP为例,Cortex-A7主打的低功耗前提下的能效比,其流水线级数为8级;而Cortex-A15主打高性能,其流水线深度为15级。
当然流水线越来越深也需有其限度,曾有某些商业处理器产品一味地追求极端流水线深度(达到几十级)反而遭遇失败的例子。目前最新的Intel处理器和ARM 高性能Cortex-A系列处理器的流水线深度都在十几级的范围左右。
4.1. 复杂度也不能一直细化划
流水线并不能被无限制的增加下去,因为时钟的限制(setup time/clock uncertainty),流水线的划分有一个物理局限。
复杂度也不能一直细化划分下去那么远样划分成本很高
4.2. 分支预测流水线冲刷(Pipeline Flush)
较深的处理器流水线还有一个问题,由于在流水线的取指令阶段无法得知条件跳转的结果是跳还是不跳,因此只能进行预测,而到了流水线的末端才能够通过实际的运算得知该分支是真的该跳还是不该跳,如果发现真实的结果(譬如该跳)与之前预测的结果(譬如预测为不跳)不相符,则意味着预测失败,需要将所有预取的错误指令流全部丢弃掉,而重新取正确的指令流,这个过程叫做流水线冲刷(Pipeline Flush),虽然可以使用分支预测器来保证前期的分支预测尽可能的准确,但是也无法做到万无一失。那么,流水线的深度越深,则意味着已经预取了很多的错误指令流,需要将其全部抛弃然后重启,不仅白白的浪费了功耗,还造成了性能的损失。流水线越深则意味着浪费和损失越严重,流水线越浅则浪费和损失越少。这是流水线加深的另一个主要的负面意义。
5. 流水线其他概念5.1. ”流水线停顿(pipeline stall)”5.2. 两条指令之间的关系可以分为:数据相关和控制相关,数据相关分为;
数据相关即可以发生在存储器中也可以发生在寄存器中。
1):先写后读,(RAW,read after write),后一指令的操作数是该指令的结果。该指令的结果被后指令使用。真相关。
2):先读后写,(WAR,write after read),反相关,防止后一指令的结果对上一指令的操作数产生影响。
3):写后写,(WAW,write after write),两条指令的顺序不能改变。输出相关。
4):读后读,(RAR,read after read),无影响。
5.3. 流水线互锁实现
2):流水线互锁实现。检测出所有的流水线相关,并保证所有的相关得到满足。包括停止流水线的某一段,以及,数据在定向路径中的传输控制。
RAW相关的检测是通过比较器,连续比较连续两条指令的寄存器标识来实现的。如果检测到数据的相关性,则使能相关的定向路径。
如果没有相关的定向路径,则停止流水线的某段。
5.4. 动态分支预测
流水线处理器性能的主要障碍是指令相关引起的流水线停顿,其中控制相关引起的分支开销是最重要的部分。
动态分支预测能减少这一部分的开销,预测成功时,流水线没有停顿。在检测到预测失败时,必须清空流水线。
减少从取指段到完成分支指令段的距离也可以减少分支指令引起的开销。
在流水线处理器设计中,不仅仅数据通道被流水化了,连控制通道也被流水化了,传统的数据通道和控制通道被合并到同一条流水线。