从入门到放弃: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

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.