PipeLine由来
最初开始,指令一条一条顺序执行,后来当工艺进步了,CPU中的元件越来越多,而在原来的顺序执行的过程中,只有一条指令的某一个阶段在执行,如取指,取数据等等,其他元件都处于等待的状态,于是为了提高CPU吞吐量,以及指令并行的效率,于是PipeLine应运而生
PipeLine原理
PipeLine是指将计算机指令处理过程拆分为多个步骤,并通过多个硬件处理单元并行执行来加快指令执行速度。其具体执行过程类似工厂中的流水线,并因此得名。
- 把一个重复的过程分解为若干子过程
- 每个子过程可以与其它子过程并行进行
- 将每个指令分解成取指,译码,执行,写回等阶段
- 将分解的每个阶段交给不同的元件进行处理
虽然分解完后,每个指令需要多个cycle后才能完成,但是通过多个指令的并行运算每个讯号内一个指令可以完成,因此通过这个方法整个速度可以提高
PipeLine的风险与问题(Harzard)
假如,一个指令在执行的时候,需要等待流水线上前一个指令先执行完毕的话,那么这两个指令相互之间彼此有依赖关系。这可能导致流水线冲突的现象发生。以下三种冲突情况可能出现:
资源冲突:流水线上的一个指令需要使用已经被另一个指令占据的资源,多条指令同时访问同一个硬件单元,目前L1缓存已经被分为指令缓存和数据缓存,所以原来有的结构冲突也就没有了
-
数据冲突:
- 指令层的数据冲突:指令需要的数据还没有计算出来,如下指令,R1中的值还未写回寄存器,下条指令就需要使用
// 前后指令间存在数据相关性,由于流水线导致read before write
// 上条指令还没将结果写回reg,后面的指令就错误操作了reg中之前的数据
add R1,R2,R3;
add R4,R1,R5;
传输层的数据冲突:指令需要的暂存器(register)内容还没有被存入暂存器
控制流冲突:流水线必须等待一个有条件Goto指令是否会被执行。
这些冲突导致相对应的指令,必须在流水线的开始处等候,这会在流水线上导致空缺。这样的话流水线就不能顺利运行,处理速度便开始下降。因此要尽量避免这样的冲突。
PipeLine的解决方案
资源冲突
通过增加功能单位可以解决资源冲突,通常CPU中有很多通用寄存器,x86有8个通用寄存器,Arm有16个,但是RISC处理器通常会内置32或者64个寄存器堆(Register File)以供使用。通过把流水线后面的计算结果立刻向前传可以避免许多数据冲突。通过RAT(Register Alias Table)将指令中寄存器进行重命名,以达到寄存器的充分利用以及数据计算的分离。-
数据冲突
使用out-of-order(ROB,RRF)执行;在冲突指令间插入不相关指令;Forwarding,上条指令的数据有效后就直接送个下条指令而不是先写回存储器;插入Nop空指令(软件解决,但是不好)等。
- 控制流冲突
通过分支预测器(BTB,Static Predictor)可以减少控制冲突。在这里处理器预测性地继续运算,直到正式预测是正确为止。假如预测错误的话那么在其中已经执行的指令要被推翻。尤其流水线非常长的处理器(比如英特尔的奔腾4或者IBM的PowerPC在这种情况下要浪费许多时间。因此这些处理器拥有非常高级的分支预测技术,只有百分之一的分支预测会发生错误,其流水线需要清除。
超标量(SuperScalar)的概念
处理器的内核中一般有多个执行单元(或称功能单元),如算术逻辑单元、位移单元、乘法器等等。未实现超标量体系结构时,CPU在每个时钟周期仅执行单条指令,因此仅有一个执行单元在工作,其它执行单元空闲。超标量体系结构的CPU在一个时钟周期可以同时分派(dispatching)多条指令在不同的执行单元中被执行,这就实现了指令级的并行。
超标量实现原理
标量流水线在运行的过程中,每一个Cycle只取一条指令,发射的时候也只发射一条指令。
而超标量流水线是指在取指的时候,某一时刻读取N条指令(X86 Nehalem每次读4条指令共16bytes),然后将N条指令同时解码(4个解码器),并且解码完毕后将解码完毕的Micro Ops交付给ALU执行,最后在一个cycle内将执行结果分发。就称为这样的流水线为N级发射超标量流水线。
即:在同一时刻,有多条指令被读取,译码,执行,存储,写回。
参考资料
http://www-inst.eecs.berkeley.edu/~cs61c/sp15/lec/13/2015Sp-CS61C-L13-kavs-Pipelining-1up.pdf
https://compas.cs.stonybrook.edu/~nhonarmand/courses/sp16/cse502/slides/06-pipelining.pdf
https://www.zhihu.com/question/35024996/answer/62322067
https://www.coursera.org/learn/jisuanji-zucheng/lecture/dL6g2/604-liu-shui-xian-de-mou-xian