
流水线法
-
2023年3月4日发(作者:狐假虎威教学反思)计算机流⽔线(Pipeline)技术
流⽔线是现代RISC核⼼的⼀个重要设计,它极⼤地提⾼了性能。
对于⼀条具体的指令执⾏过程,通常可以分为五个部分:取指令,指令译码,取操作数,运算(ALU),写结果。其中
前三步⼀般由指令控制器完成,后两步则由运算器完成。按照传统的⽅式,所有指令顺序执⾏,那么先是指令控制器⼯作,完
成第⼀条指令的前三步,然后运算器⼯作,完成后两步,在指令控制器⼯作,完成第⼆条指令的前三步,在是运算器,完成
第⼆条指令的后两部……很明显,当指令控制器⼯作是运算器基本上在休息,⽽当运算器在⼯作时指令控制器却在休息,造
成了相当⼤的资源浪费。解决⽅法很容易想到,当指令控制器完成了第⼀条指令的前三步后,直接开始第⼆条指令的操作,
运算单元也是。这样就形成了流⽔线系统,这是⼀条2级流⽔线。
如果是⼀个超标量系统,假设有三个指令控制单元和两个运算单元,那么就可以在完成了第⼀条指令的取址⼯作后直接
开始第⼆条指令的取址,这时第⼀条指令在进⾏译码,然后第三条指令取址,第⼆条指令译码,第⼀条指令取操作数……这样
就是⼀个5级流⽔线。很显然,5级流⽔线的平均理论速度是不⽤流⽔线的4倍。
流⽔线系统最⼤限度地利⽤了CPU资源,使每个部件在每个时钟周期都⼯作,⼤⼤提⾼了效率。但是,流⽔线有两个⾮
常⼤的问题:相关和转移。
在⼀个流⽔线系统中,如果第⼆条指令需要⽤到第⼀条指令的结果,这种情况叫做相关。以上⾯哪个5级流⽔线为例,当
第⼆条指令需要取操作数时,第⼀条指令的运算还没有完成,如果这时第⼆条指令就去取操作数,就会得到错误的结果。所
以,这时整条流⽔线不得不停顿下来,等待第⼀条指令的完成。这是很讨厌的问题,特别是对于⽐较长的流⽔线,⽐如20
级,这种停顿通常要损失⼗⼏个时钟周期。⽬前解决这个问题的⽅法是乱序执⾏。乱序执⾏的原理是在两条相关指令中插⼊
不相关的指令,使整条流⽔线顺畅。⽐如上⾯的例⼦中,开始执⾏第⼀条指令后直接开始执⾏第三条指令(假设第三条指令
不相关),然后才开始执⾏第⼆条指令,这样当第⼆条指令需要取操作数时第⼀条指令刚好完成,⽽且第三条指令也快要完成
了,整条流⽔线不会停顿。当然,流⽔线的阻塞现象还是不能完全避免的,尤其是当相关指令⾮常多的时候。
另⼀个⼤问题是条件转移。在上⾯的例⼦中,如果第⼀条指令是⼀个条件转移指令,那么系统就会不清楚下⾯应该执⾏
那⼀条指令?这时就必须等第⼀条指令的判断结果出来才能执⾏第⼆条指令。条件转移所造成的流⽔线停顿甚⾄⽐相关还要严
重的多。所以,现在采⽤分⽀预测技术来处理转移问题。虽然我们的程序中充满着分⽀,⽽且哪⼀条分⽀都是有可能的,但
⼤多数情况下总是选择某⼀分⽀。⽐如⼀个循环的末尾是⼀个分⽀,除了最后⼀次我们需要跳出循环外,其他的时候我们总
是选择继续循环这条分⽀。根据这些原理,分⽀预测技术可以在没有得到结果之前预测下⼀条指令是什么,并执⾏它。现在
的分⽀预测技术能够达到90%以上的正确率,但是,⼀旦预测错误,CPU仍然不得不清理整条流⽔线并回到分⽀点。这将损
失⼤量的时钟周期。所以,进⼀步提⾼分⽀预测的准确率也是正在研究的⼀个课题。
越是长的流⽔线,相关和转移两⼤问题也越严重,所以,流⽔线并不是越长越好,超标量也不是越多越好,找到⼀个速度
与效率的平衡点才是最重要的。