流水线
计时器信号
一个级越简单,处理它的频率就可以越高。在现代的中央处理器中一个指令流水线可以长于30级(参见NetBurst)。核节是一个指令每个流水线级所需要的时间。在一个k级流水线中每个指令由k个级组成,每个级需要k个信号数来完成。由于在每个信号里一个新指令开始执行,因此在理想状态下在每个信号中也应该有一个指令完成,离开流水线。
每个节由流水线的周期决定,它由所有级持续时间τ τ -->i{\displaystyle \tau _{i}}中的最大级持续时间τ τ -->m{\displaystyle \tau _{m}}和一个附加时间d{\displaystyle d}的和组成。这个其中附加时间是因为把每个级的结果存到流水线寄存器中去导致的。
τ τ -->=maxi(τ τ -->i)+d=τ τ -->m+d{\displaystyle \tau ={\underset {i}{\max }}(\tau _{i})+d=\tau _{m}+d}
效率提高
通过流水线指令完成的总速度提高。设周期时间为τ τ -->{\displaystyle \tau },完成n{\displaystyle n}个k{\displaystyle k}级指令总时间为:
总时间为Tk=(k+n− − -->1)⋅ ⋅ -->τ τ -->{\displaystyle T_{k}=(k+n-1)\cdot \tau }
一开始流水线是空的,在k⋅ ⋅ -->τ τ -->{\displaystyle k\cdot \tau }步中被充满。每级后一个新的指令被调入流水线,而另一个指令完成。因此剩下的指令在(n− − -->1)⋅ ⋅ -->τ τ -->{\displaystyle (n-1)\cdot \tau }步后完成。
将使用没有流水线的指令运行时间除以流水线的指令运行时间获得的商代表着流水线带来的加速:
Sk=T1Tk=n⋅ ⋅ -->k⋅ ⋅ -->τ τ -->(k+n− − -->1)τ τ -->=n⋅ ⋅ -->kk+n− − -->1{\displaystyle S_{k}={\frac {T_{1}}{T_{k}}}={\frac {n\cdot k\cdot \tau }{(k+n-1)\tau }}={\frac {n\cdot k}{k+n-1}}}
假如在流水线中总是有足够的指令等待执行的话,则在n{\displaystyle n}趋向无穷大时:
limn→ → -->∞ ∞ -->Sk=n⋅ ⋅ -->kk+n− − -->1=k{\displaystyle \lim _{n\to \infty }S_{k}={\frac {n\cdot k}{k+n-1}}=k}
也就是说随着级数k{\displaystyle k}的提高加速可以无限地提高。但是一个指令无法被分成无限多个级。此外级数的提高也会导致数据和指令冲突的严重性提高,硬件的复杂性也随之提高。
管线危障(pipeline hazards)
假如,一个指令在执行的时候,需要等待流水线上前一个指令先执行完毕的话,那么这两个指令相互之间彼此有依赖关系。这可能导致流水线冲突的现象发生。以下三种冲突情况可能出现:
资源冲突:流水线上的一个指令需要使用已经被另一个指令占据的资源
数据冲突
控制流冲突:流水线必须等待一个有条件Goto指令是否会被执行。
这些冲突导致相对应的指令,必须在流水线的开始处等候,这会在流水线上导致空缺。这样的话流水线就不能顺利运行,处理速度便开始下降。因此要尽量避免这样的冲突:
通过增加功能单位可以解决资源冲突。通过把流水线后面的计算结果立刻向前传可以避免许多数据冲突。
通过分支预测器可以避免控制冲突。在这里处理器预测性地继续运算,直到正式预测是正确为止。假如预测错误的话那么在其中已经执行的指令要被推翻。尤其流水线非常长的处理器(比如英特尔的奔腾4或者IBM的PowerPC)在这种情况下要浪费许多时间。因此这些处理器拥有非常高级的分支预测技术,只有百分之一的分支预测会发生错误,其流水线需要清除。
优缺点
长流水线的优点在于它能够大大地提高处理器速度。缺点在于许多指令被同时执行。假如分支预测错误的话整个流水线上所有的指令全部要被取消,流水线要被重新充满。这需要从内存或者中央处理器缓存中调用指令,导致延迟时间,在这段时间里处理器没有工作。NetBurst架构管线一开始有20级、而后增加至31级,放大其缺点;其后继者Intel Core微处理器架构就减少管线级数。
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值