指令流水线(Instruction pipeline)

指令流水线(Instruction pipeline)是为了让CPU能够加速指令的通过速度(单位时间内被运行的指令数量)而设计的技术。一条流水线的每个分步骤被称为流水线,一条指令的执行通常被分为取指、译码、执行、回写等多个步骤(级)。

流水线效率

核节\(\mathcal T\) 是一个指令每个流水线级所需要的时间,它由所有级持续时间\(\mathcal T_i\)中的最大级持续时间\(\mathcal T_m\)和一个附加时间d的和组成:\[\mathcal T=\max_i(\mathcal T_i)+d=\mathcal T_m+d\] 其中附加时间是因为把每个级的结果存到流水线寄存器中去导致的。 完成 n个 k级指令总时间为:\[T_k=(k+n-1)\cdot \mathcal T\] 一开始流水线是空的,在\(k\cdot \mathcal T\)步中被充满。每级后一个新的指令被调入流水线,而另一个指令完成。因此剩下的指令在\((n-1)\cdot \mathcal T\)步后完成。 这里用不使用流水线的指令运行时间除以使用流水线的指令运行时间获得的商代表流水线带来的加速: \[S_k=\frac{T_1}{T_k}=\frac{n\cdot k\cdot \mathcal T}{(k+n-1)\cdot \mathcal T}=\frac{n\cdot k}{(k+n-1)}\] 假如在流水线中总是有足够的指令等待执行的话,即在 n 趋向无穷大时: \[\lim_{n\to_\infty}S_k=\lim_{n\to_\infty}\frac{n\cdot k}{(k+n-1)}=k\] 也就是说随着级数 k 的提高,加速可以无限地提高。但是一个指令无法被分成无限多个级。此外级数的提高也会导致数据和指令冲突的严重性提高,硬件的复杂性也随之提高。

管线危障(pipeline hazards)

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

资源冲突:流水线上的一个指令需要使用已经被另一个指令占据的资源

数据冲突:

1. 指令层的数据冲突:指令需要的数据还没有计算出来
2. 传输层的数据冲突:指令需要的寄存器(register)内容还没有被存入寄存器

控制流冲突:流水线必须等待一个有条件Goto指令是否会被执行

这些冲突导致相对应的指令,必须在流水线的开始处等候,这会在流水线上导致空缺(下面提到的非完整流水线示例中的气泡)。这样的话流水线就不能顺利运行,处理速度便开始下降。因此要尽量避免这样的冲突:

通过增加功能单位可以解决资源冲突

通过把流水线后面的计算结果立刻向前传可以避免许多数据冲突

通过分支预测器避免控制冲突

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

流水线图解

如果一条指令流水线能够在每一个时钟频率周期接纳一条新的指令,被称为完整流水线(fully pipelined)。因流水线中的指令需要延迟处理而要等待数个时钟频率周期,被称为非完整流水线。以下为这两种情况下四级指令流水线的示例:

完整流水线

如图所示,绿、紫、蓝、红方块分别代表1条指令,取值(Fetch)、译码(Decode)、执行(Execute)、回写(Write-back)分别代表1个执行单元。设想这四个指令好比传送带上依次排列的四个货物,各个执行单元类比为传送带旁的四个工人。指令在第0个时钟排队等待;第1个时钟第1个指令流入第一执行单元;第2个时钟第1个指令流入第2个执行单元,第2个指令紧随其后流入第1个执行单元;依次类推,到第8个时钟所有指令全部流过执行单元。4个指令全部执行完用了7个时钟周期。

非完整流水线

如图,在编号为2的时钟频率周期中,紫色指令的读取被延迟,并且在编号为3的时钟频率周期中解码层也产生了一个气泡。所有在紫色指令之后的指令都被延迟运行,而在其之前已经运行了的指令则不受影响。由于气泡使指令运行延迟了一个时钟频率周期,完成全部4条指令的运行共需要8个时钟频率周期。而气泡处对指令的读取、解码、运行与写回都没有实质影响。这可以使用nop代码来完成。

总结

长流水线(多级数)的优点在于它能够大大地提高处理器速度。缺点在于许多指令被同时执行。假如分支预测错误的话整个流水线上所有的指令全部要被取消,流水线要被重新充满。这需要从内存或者中央处理器缓存中调用指令,导致延迟时间,在这段时间里处理器没有工作。所以在实际情况中,流水线的级数并不是越多越好。

References

1. Instruction pipelining 2. 流水线

Copyright (C) 2016 archiexie@cnblogs. All Rights Reserved.

相关推荐