流水线中的执行、阶段和吞吐量

2025年03月17日 | 阅读 9 分钟

我们可以通过以下两种方式来提高 CPU 的性能

  • 我们可以引入更快的电路来改进硬件。
  • 我们可以通过安排硬件来同时执行多个操作。

由于更快的电路成本很高,并且硬件的速度也是有限的。由于这些缺点,第二种选择对我们来说是好的。

流水线

流水线可以将一种技术描述为在执行过程中重叠多个指令。流水线有五个阶段,所有这些阶段都相互连接,形成管道状结构。在流水线中,有两端,一端用于输入指令,另一端用于输出指令。由于流水线,指令的整体吞吐量得到提高。流水线系统的每个段都有输入寄存器,后跟组合电路。数据由寄存器保存,对该数据的操作由该组合电路执行。组合电路的结果将应用于下一段的输入寄存器。

Execution, Stages and Throughput in Pipeline

流水线系统也像现代工厂中的装配线一样运作。例如:假设有一个汽车制造行业,其中设置了大量的装配线,并且在每个点上都有机器人手臂执行特定的任务。之后,汽车将被移到下一个手臂。

在流水线过程中, CPU 的硬件元件会以一种可以提高整体性能的方式进行排列。在流水线过程中,可以同时执行多个指令。

例如:这里,我们将通过一个真实生活的例子来学习流水线操作的概念。在这个例子中,我们将假设一个瓶装水厂。瓶子需要经过三个阶段。第一阶段是装瓶(I)。第二阶段是灌装水到瓶子(F)。第三阶段是密封瓶子(S)。现在我们将这些阶段称为第一阶段、第二阶段和第三阶段,以便于理解此示例。我们将假设每个阶段的操作需要 1 分钟。

假设我们有一个非流水线操作。在这里,第一阶段先将瓶子插入工厂。插入 1 分钟后,瓶子将进入第二阶段,在那里为其灌装水。此时,第一阶段没有任何操作。同样,当瓶子进入第三阶段时,在这种情况下,第二阶段和第三阶段都是空闲的。因此,在非流水线操作中制造 1 个瓶子的平均时间是

现在假设我们有一个流水线操作。在这里,当一个瓶子处于第二阶段时,我们可以同时将另一个瓶子装入第一阶段。同样,当瓶子处于第三阶段时,此时第一阶段和第二阶段各有一个瓶子。因此,在第三阶段结束时,我们每分钟都会得到一个新瓶子。因此,在流水线操作中制造 1 个瓶子的平均时间是

因此,通过流水线操作,可以提高系统的效率。

基本流水线设计

  • 流水线基本上包含两个端:第一个是输入端,第二个是输出端。在流水线处理器中,这些端之间有很多阶段/段。每个阶段执行一个特定的操作,一个阶段连接到下一个阶段的输入。
  • 两个阶段之间的中间输出可以通过接口寄存器来保存,接口寄存器也称为缓冲区或锁存器。
  • 一个通用时钟用于将接口寄存器连接到流水线中的所有阶段。

流水线处理器执行

在流水线处理器中,我们可以使用时空图来可视化指令的执行顺序。例如:我们假设处理器包含 4 个阶段,并且我们需要执行 2 条指令。通过以下时空图,我们可以可视化执行顺序如下

现在重叠执行

阶段/周期12345678
S1I1I2
S2I1I2
S3I1I2
S4I1I2

总时间 = 8 个周期

重叠执行

阶段/周期12345
S1I1I2
S2I1I2
S3I1I2
S4I1I2

总时间 = 5 个周期

流水线阶段

在 RISC 处理器中,我们可以通过 5 个指令阶段来执行 RISC 指令集的所有指令。第一个阶段是指令获取,在此阶段从内存中获取指令。第二个阶段是指令解码,在此阶段解码指令并读取寄存器。第三个阶段是指令执行,在此阶段计算地址或执行操作。第四个阶段是内存访问阶段,在此阶段访问内存操作数。第五个阶段是写回阶段,在此阶段将结果写回寄存器。下面将详细解释 RISC 流水线的所有这 5 个阶段及其操作

第一阶段

阶段 1 是指令获取。在这里,从内存(I-Memory)读取指令。在此阶段,程序计数器用于包含内存的值。通过递增当前 PC,我们可以计算 NPC。通过将指令写入 PR 来更新流水线寄存器。指令获取阶段的过程如下

Execution, Stages and Throughput in Pipeline

第二阶段

阶段 2 是指令解码阶段。在这里,解码指令,并为操作码位生成控制信号。在此阶段,从寄存器文件中读取源操作数。通过指定符,对寄存器文件进行索引。流水线寄存器会将操作数和立即数发送到下一阶段。它还将 NPC 和控制信号传递到下一阶段。指令解码器阶段的过程如下

Execution, Stages and Throughput in Pipeline

阶段 3

阶段 3 是指令执行阶段。在此阶段执行 ALU(算术逻辑单元)操作。它需要两个操作数来执行 ALU 操作。第一个操作数用于包含寄存器的内容,第二个操作数用于包含立即数或寄存器。在此阶段,可以通过以下公式计算分支目标

流水线寄存器(PR)将更新 ALU 结果、分支目标、控制信号和目标。指令执行过程如下

Execution, Stages and Throughput in Pipeline

阶段 4

阶段 4 是内存访问阶段。在这里,内存操作数能够读取和写入指令中存在的内存。流水线寄存器(PR)将更新来自执行的 ALU 结果、目标寄存器以及来自 D-Memory 的加载数据。内存访问过程如下

Execution, Stages and Throughput in Pipeline

第五阶段

阶段 5 是写回阶段。在这里,将获取的值写回到指令中存在的寄存器。此阶段只需要一个写端口,该端口可用于将加载的数据写入寄存器文件,或将 ALU 的结果写入目标寄存器。

Execution, Stages and Throughput in Pipeline

流水线处理器性能

这里我们将一个段流水线表示为‘k’,时钟周期时间表示为‘Tp’。假设流水线处理器需要完成‘n’个任务。现在,第一条指令将在花费‘k’个周期后退出流水线。另一方面,‘n-1’条指令每条只需要‘1’个周期。这意味着‘n-1’条指令总共需要‘n-1’个周期。在流水线处理器中,当我们尝试执行‘n’条指令时,所需时间如下

ET pipeline = k + n -1 cycle
         = (k + n -1) Tp

在非流水线处理器中,当我们进行相同的情况并尝试执行‘n’条指令时,所需时间如下

ET non-pipeline = n * k * Tp

因此,当我们在同一处理器上执行‘n’个任务时,流水线处理器相对于非流水线处理器的加速比(S)如下

S = Performance of pipeline processor / Performance of Non-pipelined processor

由于执行时间和过程性能成反比。因此,我们有以下关系

S = ET non-pipeline / ET pipeline
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 用来表示流水线中的阶段数。

Also, Efficiency = S / Smax

这里 S 用来表示最大加速比,Smax 表示最大加速比。

We know that Smax = k 
So, Efficiency = S / k

现在吞吐量可以这样描述

Throughput = Number of instruction / Total time to complete the instruction
So throughput = n / (k + n + 1) * Tp

注意:对于理想的流水线处理器,每条指令的周期(CPI)为 1。

流水线冲突

流水线的性能受到各种因素的影响。以下是其中一些因素

时间变化

我们知道流水线不能为所有阶段花费相同的时间。当处理一些指令,而不同的指令需要不同的操作数并花费不同的处理时间时,会发生时间变化问题。

数据冒险

当多条指令并行执行,并且这些指令引用相同数据时,就会发生数据冒险问题。因此,我们应该注意,下一条指令不要尝试访问当前指令已访问过的数据。如果出现这种情况,将产生不正确的结果。

分支

在我们尝试获取和执行下一条指令之前,应该了解该指令。假设当前指令包含条件分支,并且该指令的结果将导致下一条指令。在这种情况下,只要当前指令正在执行,我们就无法知道下一条指令。

中断

由于中断,不受欢迎的指令将被插入指令流中。中断也会影响指令的执行。

数据依赖

当上一条指令的结果将导致下一条指令,但该结果尚未可用时,就会发生数据依赖情况。

流水线的优势

  • 流水线能够提高系统的吞吐量。
  • 我们可以在现代处理器中使用流水线。它还用于缩短处理器的周期时间。
  • 它用于使系统更可靠。
  • 它用于安排硬件,以便能够同时执行多个操作。
  • 假设有一个应用程序需要多次使用另一组数据重复执行相同的任务。在这种情况下,这种技术将非常高效。

流水线的缺点

  • 在这种流水线中,指令延迟更大。
  • 设计流水线的过程非常昂贵且复杂,因为它包含额外的硬件。