流水线:按流水作业特点所组成的生产程序。
流水线技术:把一个复杂的过程分解为若干子过程,每个子过程由专门的功能部件来实现。(把多个处理过程在时间上相互错开,依次通过各功能段,这样每个子过程就可以与其他的子过程并行执行)
流水线的段流:流水线中的每个子过程及其功能部件称为流水线的段。流水线的段数称为流水线的深度。流水线深度一直是影响处理器效率的重要原因,流水线深度的增加可以让处理器时钟频率进一步提高,但是会让处理器单个周期执行效率降低,同时容易产生分支预测等问题。

流水线的性能指标

吞吐率:在单位时间内流水线所完成任务数量或输出结果。

Tp=n / Tk ( n: 任务数;Tk: 处理完成这n个任务所用的时间)

各段时间均相等的流水线(时空图) x(时间)-y(工序数)

流水线构建前端项目 dockerfile_数据冲突


流水线完成n个连续任务所需要的总时间为:

Tk=kΔt+(n-1)Δt=(k+n-1)Δt

流水线的实际吞吐率
TP=n / (k+n-1)Δt

最大吞吐率(对n取无穷大)
TPmax=lim[n / (k+n-1)Δt]=1 / Δt

最大吞吐率与实际吞吐率的关系:
TP=[n / (k+n-1)]TPmax
(TP与流水线段数k和输入到流水线的任务数n有关)

各段时间不完全相等的流水线
流水线中时间最长的段称为流水线的瓶颈段
消除瓶颈问题的方法:
1.细分瓶颈段(即把瓶颈段切分为时间更短的段)
2.重复设置瓶颈段(这相当于把多个瓶颈段并联起来)

流水线的加速比

完成同一批任务,不适用流水线所用的时间与用流水线所用的时间之比称为流水线的加速比。用S表示
S=Ts / Tk

1.流水线各段时间相等(都是Δt)
流水线实际加速比
S=nk / (k+n-1)

最大加速比
Smax=lim[nk / (k+n-1)]=k

2.流水线的各段时间不完全相等时(一条k段流水线完成n个连续任务的实际加速比为:)

流水线构建前端项目 dockerfile_加速比_02

流水线的效率

流水线中的设备实际使用时间与整个运行时间的比值,即流水线设备的利用率。
从时空图上看,效率就是n个任务占用的时空面积和k个段总的时空面积之比。

流水线冲突(冒险)

对于具体的流水线来说,由于相关的存在,使得指令流中的下一条指令不能在指定的时钟周期执行。
流水线冲突有3种类型:
结构冲突:因硬件资源满足不了指令重叠执行的要求而发生的冲突。
数据冲突:当指令在流水线中重叠执行时,因需要用到前面指令的执行结果而发生的冲突。
控制冲突:流水线遇到分支指令和其他会改变PC值的指令所引起的冲突。(控制冒险造成的性能损失大于数据冒险)

流水线冲突的解决方法:
结构冲突
1.可以在前一条指令访问存储器时,将流水线停顿一个时钟周期,推迟后面取指令的操作,这个停顿周期(stall)往往被称为流水线气泡.
2.设置相互独立的指令存储器和数据存储器,或者将统一的Cache分成独立的指令Cache和数据Cache

数据冲突:
写后读冲突(RAW)
在i写入之前,j先去读,j读出的内容是错误的
写后写冲突(WAW)
在i写入之前,j先写。最后写入的结果是i 的。
读后写冲突(WAR)
在i读之前,j先写,i读出的内容是错误的,由反相关引起的。
数据冲突的解决办法:
1.可以采用 定向技术/旁路(forwarding/by-passing)(将计算结果从其产生的地方直接送到其他指令需要它的地方避免停顿)来解决写后读冲突。
2.需要设置一个“流水线互锁机制”功能部件,其作用是检测发现数据冲突,并使流水线停顿(插入气泡bubble),直至冲突消失。
3.让编译器重新组织指令顺序来消除冲突,这种技术称为指令调度或流水线调度。(通过调整原本指令执行的顺序可消除原来为了避免冲突加入的停顿)

控制冲突的解决办法
处理分支指令最简单的办法是“冻结”或“排空”流水线,即一旦流水线的译码阶段(ID)检测到分支指令,就暂停执行其后的所有指令,直到分支指令到达访存(MEM)段,确定是否成功,并计算出新的PC值为止。
由分支指令引起的延迟称为分支延迟,可采用两种措施来减少分支延迟:
1在流水线中尽早判断出分支转移是否成功
2.尽早计算出分支目标地址
延迟分支实际上使用延迟槽中的指令来掩盖分支延迟

流水线技术要点

1.流水线技术并不能提高单个任务的执行效率,它可以提高整个系统的吞吐率。
2.流水线中的瓶颈----最慢的那一段
3.多个任务同时执行,但使用不同的资源
4.其潜在的加速比=流水线的级数
5.流水线所需时间不均衡降低加速比
6.流水线存在装入时间和排空时间,使得加速比降低
7.由于存在相关问题,会导致流水线停顿
8.流水线提高的是指令带宽(吞吐率),而不是单条指令的执行速度
9.相关限制了流水线性能的发挥(相关(dependence)并不一定产生冒险,冒险发生了就会产生stall,就会降低性能,所以说相关是潜在的冒险):
结构相关(硬件资源不足导致):需要更多的硬件资源
数据相关:需要定向(forwarding/bypassing),编译器调度(软件方法)
控制相关(影响最大,大概会导致30%的性能下滑):尽早检测条件,计算目标地址,延迟转移,预测
10.增加流水线的级数会增加相关产生的可能性
11.异常,浮点运算使得流水线控制更加复杂
12.编译器可降低数据相关和控制相关的开销:
Load延迟槽
Branch延迟槽
Branch预测

五级指令流水线

取址(IF):从指令高速缓存中获取下一条指令并计算PC+4
译码(ID):从寄存器取数,同时指令在译码器进行译码
执行(EX):在ALU中对操作数进行计算或逻辑操作
访存(MEM):该阶段指令可以读写数据高速缓存中的内存变量
写回(WR):把ALU计算的结果写到寄存器堆中