流水线
提到流水线,第一个闯入脑海中的就是工厂车间,各司其职的工人干着自己的本职工作,没有人闲着,生产产品及其高效
在数字系统里,流水线机制是将一个复杂的任务分解为n个子任务,分别由n个单元按照一定的顺序来完成。
再举一个简单的例子
一个人择菜、洗菜、炒菜,每个阶段各需五分钟,每道菜15分钟。
三个人,一个人专门负责择菜、一个人专门负责洗菜、一个人专门负责炒菜、于是第二个人开始洗猜的时候,择菜的人可以开始准备择下一道菜,除了第一道菜要15分钟,剩下的菜5分钟就可以完成一道。
电路级特点:
主任务分成多个子任务
单个子任务有独立资源
各子任务按顺序执行,所有子任务执行一遍,任务就完成了
任何时间点,所有处理单元都在处理自己所负责的任务(资产阶级就是这样让工人产生最大效益的)
每个子任务的处理时间不尽相同,理想情况是所有处理单元消耗的时间相同,负责就有子任务在等待
主任务所包含的子任务的数量称作流水线深度,增加流水线的深度,每个处理单元消耗的时间就会变小,单位时间就可以完成更多的任务,实现更大的吞吐率,但深度过大会产生各种不利影响,例如某一个环节出现问题,所有的流水线上的电路都需要被清理,故障恢复过程很复杂,一般流水线深度为4级到8级。
流水线结构和并行操作的区别:
共同处:都能增加吞吐率(吞吐率指的是每个时钟周期干的活,就是完成的计算量)
不同处:并行操作里包含多个单元,每个并行单元互相独立,但并行操作会比流水线结构消耗更多资源,流水线每个阶段的输出和前面阶段的输出是相关的。
硬件里的流水线是通过在较长的组合逻辑路径中插入寄存器,降低了组合逻辑的延时,从而增加了时钟频率,提高性能,但是也会带来系统延迟和面积的增加。
具体是如何降低组合逻辑的延时呢?
首先时钟频率是指数据流入系统后,再一次在输出端出现的速率,其实也就是数据走完这么一截组合逻辑需要多长时间,即周期,取倒数即为频率,而最大的频率即最大路径延时的倒数,取决于最长的那截路所花费的时间,这受很多因素的影响。
很多因素包括:
时钟偏差:实际电路,系统时钟到达每级寄存器的时间并不是为0或者完全相同,而是因为延迟有所偏差,与系统时钟的差距称为时钟偏差
时钟抖动:到达电路某一点的连续时钟边沿之间间隔的变化称为时钟抖动,也就是本来应该准准的第5ns抵达,结果5±x0.0002ns的时间范围内抵达。
当两个寄存器中间有很多很多的组合逻辑时,流水线的延迟(即时间周期)是从数据抬脚迈入流水线时开始算起,直到数据经过一系列操作从流水线的输出端走出来。
整个电路的时钟周期=Tcomb +Tregister +Tclocking
Tclocking:时钟偏差和时钟抖动算作时钟开支
Tregister :寄存器开支包括寄存器的传输响应时间TCQ和建立时间Tsetup
当给上述同样的电路中间插入n级流水线时:
随便哪一级流水线阶段的周期=(Tcomb)stage+Tregister +Tclocking
最大延迟的流水线的周期=max{Tcomb}+Tregister +Tclocking
总的时钟周期=n(max{Tcomb}+Tregister +Tclocking)
理想情况下各级流水的延迟相等,就使得流水线中最大的组合逻辑延时相等=Tcomb/n
随便哪一级流水线阶段的周期= (Tcomb/n )+Tregister +Tclocking
理想的总的时钟周期=n((Tcomb/n )+Tregister +Tclocking)= Tcomb+ n(Tregister +Tclocking)
重点来了
理想情况下插入流水线后的组合逻辑的延时从Tcomb +Tregister +Tclocking变为(Tcomb/n )+Tregister +Tclocking
理想情况下插入流水线后的电路速度增加=(Tcomb +Tregister +Tclocking)/ ((Tcomb/n )+Tregister +Tclocking)