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

2024-08-24 12:36

本文主要是介绍从入门到放弃: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 性能

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

这篇关于从入门到放弃:CPU流水线技术全解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102498

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁