流水线 (计算机)

维基百科,自由的百科全书
跳转至: 导航搜索

流水线,亦称管线,是现代计算机处理器中必不可少的部分,是指将计算机指令处理过程拆分为多个步骤,并通过多个硬件处理单元并行执行来加快指令执行速度。其具体执行过程类似工厂中的流水线,并因此得名。

如果作出类比,则计算机指令就是流水线传送带上的产品,各个硬件处理单元就是流水线旁的工人。

在使用流水线的处理器中一个指令不是在处理器的一个定時器訊號中完成的,而是被分到多个讯号中去完成,但是与此同时多个指令的分任务被同时处理。由于这些分任务比整个指令要简单,因此可以通过使用流水线提高定時器频率。虽然每个指令需要多个讯号后才能完成,但是通过多个指令的并行运算每个讯号内一个指令可以完成,因此通过这个方法整个速度可以提高。

一条流水线的每个分步骤被称为流水线级。它们被流水线寄存器分开。除指令流水线外在现代系统中还有其它流水线,比如用来计算浮点数的算术流水线。

计时器信号[编辑]

一个级越简单,处理它的频率就可以越高。在现代的中央处理器中一个指令流水线可以长于30级(参见NetBurst)。核节是一个指令每个流水线级所需要的时间。在一个k级流水线中每个指令由k个级组成,每个级需要k个信号数来完成。由于在每个信号里一个新指令开始执行,因此在理想状态下在每个信号中也应该有一个指令完成,离开流水线。

每个节由流水线的周期决定,它由所有级持续时间\tau_i中的最大级持续时间\tau_m和一个附加时间d的和组成。这个其中附加时间是因为把每个级的结果存到流水线寄存器中去导致的。

\tau = \underset{i}{\max} (\tau_i) + d = \tau_m + d

效率提高[编辑]

通过流水线指令完成的总速度提高。设周期时间为\tau,完成nk级指令总时间为:

总时间为T_k = (k+n-1) \cdot \tau

一开始流水线是空的,在k \cdot \tau步中被充满。每级后一个新的指令被调入流水线,而另一个指令完成。因此剩下的指令在(n-1) \cdot \tau步后完成。

将使用没有流水线的指令运行时间除以流水线的指令运行时间获得的商代表着流水线带来的加速:

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趋向无穷大时:

\lim_{n \to \infty}S_k = \frac{n \cdot k}{k+n-1} = k

也就是说随着级数k的提高加速可以无限地提高。但是一个指令无法被分成无限多个级。此外级数的提高也会导致数据和指令冲突的严重性提高,硬件的复杂性也随之提高。

管線危障(pipeline hazards)[编辑]

假如一个指令在执行的时候需要等待流水线上早前的一个指令首先执行完毕的话那么这两个指令相互之间有依赖关系。这可能导致流水冲突。以下三种冲突情况可能出现:

  • 资源冲突:假如流水线上的一个指令需要使用一个已经被另一个指令占据的资源
  • 数据冲突
    • 指令层的数据冲突:一个指令需要的数据还没有计算出来
    • 传输层的数据冲突:一个指令需要的寄存器内容还没有被调入寄存器
  • 控制流冲突:流水线必须等待一个有条件Goto指令是否会被执行。

这些冲突导致相应的指令必须在流水线的开始等候,这会在流水线上导致空缺。这样的话流水线就不能理想运行,其加速下降。因此要尽量避免这样的冲突:

通过增加功能单位可以解决资源冲突。通过把流水线后面的计算结果立刻向前传可以避免许多数据冲突。

通过分支预测器可以避免控制冲突。在这里处理器预测性地继续运算,直到正式预测是正确为止。假如预测错误的话那么在其中已经执行的指令要被推翻。尤其流水线非常长的处理器(比如英特尔的奔腾4或者IBMPowerPC)在这种情况下要浪费许多时间。因此这些处理器拥有非常高级的分支预测技术,只有百分之一的分支预测会发生错误,其流水线需要清除。

优缺点[编辑]

长流水线的优点在于它能够大大地提高处理器速度。缺点在于许多指令被同时执行。假如分支预测错误的话整个流水线上所有的指令全部要被取消,流水线要被重新充满。这需要从内存或者中央处理器缓存中调用指令,导致延迟时间,在这段时间里处理器没有工作。NetBurst架構管線一開始有20級、而後增加至31級,放大其缺點;其後繼者Intel Core微處理器架構就減少管線級數。