从入门到放弃:CPU流水线技术全解析

一、CPU 流水线技术初识

在当今数字化的时代,计算机已经成为我们生活中不可或缺的一部分。而在计算机的核心部位,中央处理器(CPU)则是其重要的组成部分。CPU 的性能决定了计算机的运行速度和处理能力,而流水线技术则是 CPU 性能提升的关键所在。

1.1 指令执行生命周期回顾

一条指令的生命周期分为五个阶段:

取指阶段(Instruction Fetch):取指阶段是指将指令从存储器中读取出来的过程。程序指针寄存器用来指定当前指令在存储器中的位置。读取一条指令后,程序指针寄存器会根据指令的长度自动递增,或者改写成指定的地址。

译码阶段(Instruction Decode):指令译码是指将存储器中取出的指令进行翻译的过程。指令译码器对指令进行拆分和解释,识别出指令类别以及所需的各种操作数。

执行阶段(Instruction Execute):指令执行是指对指令进行真正运算的过程。例如指令是一条加法运算指令,则对操作数进行相加操作;如果是一条乘法运算指令,则进行乘法运算。在“执行”阶段最关键的模块为算术逻辑单元(Arithmetic Logical Unit,ALU),它是实施具体运算的硬件功能单元。

访存阶段(Memory Access):访存是指存储器访问指令将数据从存储器中读出,或写入存储器的过程。

写回阶段(Write-Back):写回是指将指令执行的结果写回通用寄存器的过程。如果是普通运算指令,该结果值来自于“执行”阶段计算的结果;如果是存储器读指令,该结果来自于“访存”阶段从存储器中读取出来的数据。
在这里插入图片描述

1.2 洗衣服流水线

什么是流水线?说的官方一点:流水线(Pipelining)是一种实现多条指令重叠的技术。通俗一点来说,跟工厂里面装配苹果手机的流水线没有什么区别,只不过装配流水线装配的是手机零件,CPU流水线操作的是计算机指令执行步骤。

假设非流水线洗衣过程分为 4 个步骤:

  1. 清洗:用洗衣机清洗

  2. 烘干:洗衣机洗完后,放入烘干机烘干

  3. 叠放:烘干衣服后,将衣服从烘干机去除,放在桌子上叠好

  4. 取走:衣服叠好后,将衣服收好或让顾客取走
    在这里插入图片描述

如果采用流水线的方法可以节省大量的时间。如果第一批衣服从洗衣机清洗完拿出来之后进行烘干,就可以把第二批衣服放入洗衣机清洗了。第一批衣服烘干了之后,第二批衣服也清洗完了,可以进行烘干了。
在这里插入图片描述

流水线的奇妙之处在于,对于单独的一批衣服来说,它的整个过程时间没有缩短,而在有多批任务并行执行时,流水线的优势就体现了出来。因为任务在并行执行,单位时间内完成的工作量就大大增加了。流水线实际上是改善了洗衣系统的吞吐率,使得工作效率大大提升。

可以试想一下,如果所有步骤所需时间一致,并且衣服足够多,那么采用流水线的速度将会是非流水线的 4 倍,正好等于步骤数。在图中的洗衣速度只提高了 2.3 倍的原因是图中只展示了清洗 4 批衣服,流水线在开始和结束阶段没有满载。

1.3 CPU 执行指令流水线

如果流水线各阶段操作平衡,那么在流水线上的指令执行时间为(理想情况下):

流水线指令执行时间 = 非流水线指令执行时间 / 流水线级数

假设指令执行所需要的执行时间如下:

在这里插入图片描述

在非流水线方式中,第一条指令与第四条指令之间的时间差是 3*800 = 2400ps

在流水线方式中,第一条指令与第四条指令之间的时间差是 3*200 = 600ps
在这里插入图片描述

在图中的加速比2400ps /1400ps,并不等于 4。这是为什么呢?这是因为执行指令的数量不够多。

如果在上面流水线中增加 1000000 条指令,每一条指令都将使得整个执行时间增加 200ps,因此整个执行时间变成了 1000000 * 200ps + 1400ps = 200001400ps

在非流水线方式下,执行时间将变成 1000000 * 800ps + 2400ps = 800002400ps

二者比值即无限接近于 4。

1.4 CPU 流水线技术的优势

从上面这两个例子,可以看到流水线技术是很有优势的:

  1. 提高执行效率:通过并行处理多条指令,流水线技术大大提高了 CPU 的执行效率。

  2. 降低延迟:由于指令可以在多个阶段同时进行,因此可以减少等待时间,降低指令执行的延迟。

  3. 提高吞吐量:流水线技术使得 CPU 可以在单位时间内处理更多的指令,从而提高系统的吞吐量。

二、流水线中的冒险

流水线技术之所以能提高性能,究其本质是利用了时间上的并行性,那它让原本应该先后执行的指令在时间上一定程度的并行起来,然而这也会带来一些冲突和矛盾,进而可能引发错误。

在流水线中我们希望当前每个时钟周期都有一条指令进入流水线可以执行。但在某些情况下,下一条指令无法按照预期开始执行,这种情况就被称为冒险。

冒险分为三种:

  • 结构冒险:如果一条指令需要的硬件部件还在为之前的指令工作,而无法为这条指令提供服务,那就导致了结构冒险。(这里结构是指硬件当中的某个部件)
  • 数据冒险:如果一条指令需要某数据而该数据正在被之前的指令操作,那这条指令就无法执行,就导致了数据冒险。
  • 控制冒险:如果现在要执行哪条指令,是由之前指令的运行结果决定,而现在那条之前指令的结果还没产生,就导致了控制冒险。

2.1 结构冒险

示例一:如果指令和数据放在同一个存储器中,则不能同时读存储器

在这里插入图片描述

解决方案一:我们有一个方便又简便的方法,即流水线停顿(stall),产生空泡(bubble)。
在这里插入图片描述

虽然流水线停顿能用来解决各种冒险,但它的效率低下,应尽量避免。

解决方案二(推荐):在存储器中设置单独的指令高速缓存和数据高速缓存。(在计算机中主存储器(内存)是统一存放指令和数据的,这也是冯诺依曼结构的要求,只是在CPU当中 的一级高速缓存会采用指令和数据分别存放的方式)。
在这里插入图片描述

示例二:如果读寄存器和写寄存器同时发生,如何处理?

在这里插入图片描述

解决方案(推荐):前半个周期写,后半个周期读,并且设置独立的读写端口。
在这里插入图片描述

2.2 数据冒险

示例一:一条指令需要使用之前指令的结果,但是结果还没有写回。

在这里插入图片描述

解决方案一:流水线停顿(stall),产生空泡(bubble)。
在这里插入图片描述

解决方案二(推荐):数据前递(Forwarding)
在这里插入图片描述

示例二:一条指令需要使用之前指令的运算结果,但是结果还没有写回
在这里插入图片描述

解决方案(推荐):数据前递(Forwarding)
在这里插入图片描述

示例三:一条指令需要使用之前指令的访存结果(数据前递无法解决)
在这里插入图片描述

解决方案(推荐):流水线停顿 + 数据前递
在这里插入图片描述

2.3 控制冒险

示例一:尚未确定是否发生分支,如何进行下一次取指?
在这里插入图片描述

解决方案一:流水线停顿,产生冒泡
在这里插入图片描述

解决方案二:静态分支预测,假设分支不发生

例如,假设经过beq指令分支不发生,最坏情况是其实分支总是发生,所以执行两条错误的lw、sw指令,又执行两条正确的指令,这样导致50%的性能浪费。
在这里插入图片描述

这也是因为转移指令本身和流水线的模式是冲突的,因为转移指令会改变指令的流向, 而流水线则希望能够依次地取回指令,将流水线填满。

那如果这种情况是非常罕见的,也许我们还可以容忍,但实际上转移指令是非常常用的指令。

解决方案三:动态分支预测,类似“天气预告”

解决方案四:改造电路,缩短分支延迟
在这里插入图片描述

解决方案五:延迟转移技术,使流水线不停顿
在这里插入图片描述

三 CPU 动态流水线乱序执行和发射技术

3.1 什么是动态流水线

“动态流水线”是通过重新排列指令执行顺序来提高 CPU 性能的一种优化技术。

传统流水线将指令执行过程划分为固定的阶段,每个阶段处理特定的任务。乱序执行则是打破了指令原本的顺序执行模式。在乱序执行机制下,只要当前指令所依赖的数据准备就绪,CPU 就可以立即执行该指令,而不必等待前面未准备好的指令,提高了流水线的效率。
在这里插入图片描述

3.2 什么是乱序执行

乱序执行并不是真的“乱序”,其实是“有序取指、重排列执行顺序、有序结束”,指令的结束顺序其实是符合软件中的原始顺序的。

3.3 什么是“发射”

发射其实是动态流水线专有的术语。动态流水线的电路结构中,新增了“保留站”(Reservation Station),用来保存一组等待执行的指令,有的也称为“发射队列”(Issue Queue)。

将发射队列中就绪的指令送入功能单元进行执行的操作叫做“发射”。

3.4 什么是多发射

多发射(Multiple Issue)是指流水线的每个阶段都能处理多于一条的指令

在乱序执行的 CPU 中,每一个时钟节拍处理的指令数量超过了一条。在取指阶段,一次可以从内存中读取多条指令;在译码阶段,可以同时对多条指令分析相关性,并送入不同的发射队列;在发射阶段,每一个时钟节拍都可以从发射队列中分别发出一条指令;在执行阶段,多个计算单元独立工作,并行地进行运行。

多发射并不是说 CPU 有多条流水线,而是在一条流水线上增加了处理指令的宽度,在一个时钟节拍中可以同时处理多份指令。

四、小结

总的来说,CPU 流水线技术是计算机领域一项重要成就,利用了时间上的并行性,让原本应该先后执行的指令在时间上一定程度的并行起来,然而这也会带来一些冲突和矛盾(冒险)。虽然流水线冒泡可以解决冒险,但是还有更优雅的方式。“动态流水线”通过重新排列指令执行顺序来提高 CPU 性能

参考资料:北京大学《计算机组成》陆俊林

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

James Shangguan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值