超长流水线的性能瓶颈
你说流水线能增加 CPU 吞吐率,流水线级数就越深越好咯?
增加流水线深度,是有性能成本的。
同步时钟周期的,不再是指令级别,而是流水线阶段级别。
每一级流水线对应的输出,都要放到流水线寄存器(Pipeline Register),然后在下一个时钟周期,交给下一个流水线级去处理。
所以,每增加一级流水线,就要多一级写入到流水线寄存器的操作。
虽然流水线寄存器非常快,比如只有20皮秒(ps,1 0 − 12 10^{-12}10 -12)。
但不断加深流水线,这些操作占整个指令的执行时间的比例就会不断增加。最后,性能瓶颈就会出现在这些overhead。
若指令执行有3ns=3000ps:
- 20级流水线,则流水线寄存器写入就要400ps,占超过10%
- 50级流水线,就要多花费1ns在流水线寄存器上,占到25%
这意味着,单纯增加流水线级数,不仅不能提升性能,反而会有更多overhead开销。所以,设计合理的流水线级数也是现代CPU中非常重要的一点。
总结
为不浪费CPU性能,通过把指令执行过程,切分成一个个流水线级,提升CPU吞吐率。而CPU设计,又是由一个个独立的组合逻辑电路串接起来形成,适合这样采用流水线“专业分工”的工作方式。
因为每一级overhead,一味地增加流水线深度,并不能无限提高性能。
因为指令的执行不再是顺序一条条执行,而是在上条执行到一半时,下一条就已经启动了,所以给程序带来很多挑战。这些挑战和对应解决方案,你就得持续关注这个系列文章了!
参考
- 《深入理解计算机系统》的4.4章节
- 《计算机组成与设计 硬件/软件接口》的4.5章节