为了提高CPU的性能,我们有两种选择:
1)通过引入更快的电路来改善硬件。
2)安排硬件,以便可以同时执行多个操作。
由于硬件速度受到限制,更快的电路成本也很高,因此我们必须采用第二种选择。
流水线:流水线是CPU硬件元素的排列过程,可以提高其整体性能。在流水线处理器中同时执行多个指令。
让我们看一个实际的例子,该例子适用于流水线操作的概念。考虑一个水瓶包装厂。让瓶子经过三个阶段,分别是插入瓶子( I ),向瓶子中注水( F )和密封瓶子( S )。让我们将这些阶段分别视为第一阶段,第二阶段和第三阶段。让每个阶段花费1分钟以完成其操作。
现在,在非流水线操作中,首先将瓶子插入工厂,然后在1分钟后将瓶子移至第二阶段,在第二阶段中注满水。现在,在第一阶段,什么都没有发生。类似地,当瓶子移至阶段3时,阶段1和阶段2均处于闲置状态。但是在流水线操作中,当瓶子处于阶段2时,可以在阶段1装载另一个瓶子。类似地,当瓶子处于阶段3时,阶段1和阶段2可能每个都有一个瓶子。 ,我们在第3阶段结束时得到了一个新瓶子。因此,制造1个瓶子所需的平均时间为:
没有流水线= 9/3分钟= 3m
I F S | | | | | |
| | | I F S | | |
| | | | | | I F S (9 minutes)
流水线= 5/3分钟= 1.67m
I F S | |
| I F S |
| | I F S (5 minutes)
因此,流水线操作提高了系统的效率。
基本管道的设计
- 在流水线处理器中,流水线具有两端,即输入端和输出端。在这些末端之间,存在多个级/段,使得一个级的输出连接到下一级的输入,并且每个级执行特定的操作。
- 接口寄存器用于保存两级之间的中间输出。这些接口寄存器也称为锁存器或缓冲器。
- 流水线中的所有阶段以及接口寄存器都由一个公共时钟控制。
在流水线处理器中执行
流水线处理器中的指令执行顺序可以使用时空图可视化。例如,考虑具有4个阶段的处理器,并让2条指令要执行。我们可以通过以下时空图可视化执行顺序:
非重叠执行:
Stage / Cycle | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
S1 | I1 | I2 | ||||||
S2 | I1 | I2 | ||||||
S3 | I1 | I2 | ||||||
S4 | I1 | I2 |
总时间= 8个周期
重叠执行:
Stage / Cycle | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
S1 | I1 | I2 | |||
S2 | I1 | I2 | |||
S3 | I1 | I2 | |||
S4 | I1 | I2 |
总时间= 5个周期
管道阶段
RISC处理器具有5级指令流水线,以执行RISC指令集中的所有指令。以下是RISC管道的5个阶段及其各自的操作:
- 第一阶段(取指令)
在此阶段,CPU从内存中的地址中读取指令,该值的值出现在程序计数器中。 - 第二阶段(指令解码)
在此阶段,对指令进行解码,并访问寄存器文件以从指令中使用的寄存器中获取值。 - 第三阶段(指令执行)
在此阶段,将执行ALU操作。 - 阶段4(内存访问)
在此阶段,从指令中存在的内存中读取和写入内存操作数。 - 阶段5(回写)
在此阶段,将计算/获取的值写回到指令中存在的寄存器中。
流水线处理器的性能
考虑一个时钟周期为“ Tp”的“ k”段流水线。让“ n”个任务在流水线处理器中完成。现在,第一条指令将花费“ k”个周期从流水线中退出,而其他“ n – 1”条指令将仅花费“ 1”个周期,即总共“ n – 1”个周期。因此,在流水线处理器中执行“ n”条指令所花费的时间:
ETpipeline = k + n – 1 cycles
= (k + n – 1) Tp
在相同情况下,对于非流水线处理器,“ n”条指令的执行时间为:
ETnon-pipeline = n * k * Tp
因此,当在同一处理器上执行“ n”个任务时,流水处理器比非流水处理器的加速(S)为:
S = Performance of pipelined processor /
Performance of Non-pipelined processor
由于处理器的性能与执行时间成反比,因此,
S = ETnon-pipeline / ETpipeline
=> S = [n * k * Tp] / [(k + n – 1) * Tp]
S = [n * k] / [k + n – 1]
当任务’n’的数量明显大于k时,即n >> k
S = n * k / n
S = k
其中“ k”是管道中的阶段数。
同样,效率=给定加速速度/最大加速速度= S / S max
我们知道,Smax = k
因此,效率= S / k
吞吐量=指令数/完成指令的总时间
因此,吞吐量= n /(k + n – 1)* Tp
注意:理想的流水线处理器的每条指令周期(CPI)值为1
请参阅第2组有关依存关系和数据危险,以及第3组有关管道和停顿的类型。
资料来源:goo.gl/J9KVNt
https://zh.wikipedia.org/wiki/危险区(计算机架构)
https://zh.wikipedia.org/wiki/数据依赖
本文由Saurabh Sharma提供。