当前位置: 首页 > news >正文

CPU性能提升:流水线

    一条指令的执行一般要经过取指令,翻译指令,执行指令3个基本流程。CPU内部的电路分为不同的单元,取指但愿,译码单元,执行单元等。指令的执行也是按照流水线工序一步步执行的。如图2-34所示,我们假设每一个步骤的执行时间都是一个时钟周期,那么一条指令执行需要3个时钟周期。

    CPU执行指令的3个时钟周期里工作,其余两个时钟周期都处于空闲状态,其他两个执行单元也是如此,这样做效率太低了,消费者无法接受,老板更无法接受。解决方法就是引入流水线,让流水线上的每一颗螺丝钉都马不停蹄的运转起来。

    2.5.2 超流水线技术

    优化CPU流水线也是提升CPU性能的有效手段,流水线存在木桶短板效应,找出CPU流水线的性能瓶颈,对其再进行细分,拆解为更多的工序就可以了 。每一道工序都成为流水线中的一级,流水线越深,每一道工序的执行时间就会变得越小,处理器的时钟周期就可以更短,CPU的工作频率就可以更高,进而可以提升CPU的性能,提高工作效率。

    在手机生产流水线上,耗时最长的那道工序决定了整条流水线的吞吐率。CPU内部的流水线也是如此,流水线中耗时最长的那道工序单元的执行时间决定了CPU流水线的性能。

   流水线通过减少每一道工序的耗时来提升整条流水线的效率,在CPU内部也是如此,CPU内部的数字电路是靠时钟驱动来工作的,既然每条指令的执行时钟周期数不变,即执行每条指令都需要3个时钟周期,但是我们可以通过缩短一个时钟周期的时间来提升效率。即减少每条指令所耗费的时间,一个时钟周期的时间变短,CPU主频也就相应的提升,影响时钟周期的长短。

组合逻辑 1ns

寄存器1

0.5ns

组合逻辑2

1ns

寄存器2

0.5ns

组合逻辑3

1ns

寄存器3

0.5ns

   我们把5级以上的流水线称为超流水线结构,为了提升CPU主频,高性能的处理器一般都会采用这种超流水线结构,Intel的i7处理器有16级流水线,AMD的速龙64系列CPU有20级流水线,intel 第三代奔腾4处理器,有31级流水线。

    流水线是否越深越好?不一定,本质是拿空间换时间,流水线越深,电路会越复杂,需要更多的组合逻辑电路和寄存器,芯片面积越大,功耗上升了。

    流水线越深,就一定能提升性能吗?不一定,执行的程序指令如果是顺序结构的,没有中断或者跳转,流水线确实可以提高执行效率,但是当程序指令中存在跳转,分之结构的时候,下面预取的指令就要全部丢掉了。

BEQ R1, R2, here

ADD R2, R1, R0

ADD R5, R4, R3

here:

   SUB R2, R1, R0

   sub R5, R4, R3

  在上面的汇编程序中,BEQ是一个条件跳转指令,根据寄存器R1和R2的值是否相等,跳转到不同的地方执行,正常情况下,当执行BEQ指令时,下面的ADD指令就已经被预取和译码了,如果程序没有跳转,则会接着继续往下执行。

   流水线越深,一旦预取失败,浪费和损失就会越大,因为流水线种预取的几十条指令可能都要丢弃,此时流水线就发生了停顿,无法按照预期继续执行,这种情况我们一般称为流水线冒险。

    2.5.3 流水线冒险

   引起流水线冒险的原因有很多种,根据类型不同,我们一般分为3种。

1 结构冒险, 所需要的硬件正在为前面的指令工作

2 数据冒险 当前指令需要前面指令的运算数据才能执行

3 控制冒险:需要根据之前的指令的执行结果决定下一步的行为,

   结构冒险很好理解,如果多条指令都用相同的硬件资源,如果内存单元,寄存器等,就会发生冲突。

ADD R2, R1, R0

SUB R1, R4, R3

 上面这两条指令执行时需要访问寄存器R1, 但是这两条指令之间没有依赖关系,不需要数据的传送。仅仅在使用的硬件资源上发生了冲突,这种冲突我们称为结构冒险。解决结构冒险的方法很简单,我们直接对冲突的寄存器进行重命名就可以了。这种操作可以通过编码器静态实现,也可以通过硬件动态完成,如图2-38所示,我们在流水线中加入寄存器重命名单元就可以了。

取指

译码

重命名

执行

 通过硬件电路对寄存器重命名后,代码就变成了下面的样子,将SUB指令中的R1寄存器重命名为R5,结构冒险解决。

ADD R2, R1, R0

sub R5,R4, R3

 数据冒险指当前质量需要上一条指令的运算结构,上一条指令没有允许结束,当前指令就无法运行。只能暂停。

ADD R2,R1, R0

SUB R4, R2, R3

  第二条SUB指令,要等待第一条ADD指令运行结束,将运算结果写回寄存器R2之后才能执行。现在的经典CPU流水线一般分为5级,取指,译码,执行,访问内存,写回。也就是说,执行指令结束后,还需要吧运行结果写回寄存器,下一条指令才能到这个寄存器取数据。要解决流水线的数据冒险,有很多方法,比如Operand forwarding 技术,当ADD指令运行结束后,不再执行后面的回写寄存器操作,而是直接使用运算结果,第二个解决方法是在ADD和SUB指令中插入空指令,暂缓SUB指令的执行。

    为了防止数据冒险,我们在时钟周期2和时钟周期3内,添加了两个空指令,让流水线暂时停顿,产生空泡。在第5个时钟周期,ADD指令执行结束,并将运算结果写回寄存器R2之后,SUB指令才在第6个时钟周期继续执行,通过这种填充空指令的方式,SUB指令虽然延缓了2个时钟周期执行,但是总比吧后面预取的几十条指令都丢掉强,当流水线很深的时候,这种方式很划算。

    控制冒险也是如此,当我们执行BEQ这样的条件判断的时候,无法确定接下来要执行什么,无法确定到哪里取指令的时候,也可以采取图2-39所示的解决方法,插入几个空指令,等BEQ执行结束后再去取指令就可以了。

相关文章:

CPU性能提升:流水线

一条指令的执行一般要经过取指令,翻译指令,执行指令3个基本流程。CPU内部的电路分为不同的单元,取指但愿,译码单元,执行单元等。指令的执行也是按照流水线工序一步步执行的。如图2-34所示,我们假设每一个步…...

C语言指针初级

目录 一、什么是指针 二、指针和指针类型 三、野指针 1.野指针的成因: 2.如何规避野指针 四、指针运算 1.指针-整数 2. 指针之间的加减 五、二级指针 六、指针数组 一个男人,到底要走多少的路,才能成为一个真正的男人 本专栏适用于…...

C++的历史

C是一种广泛使用的编程语言。C于1983年由丹尼斯里奇(Dennis Ritchie)在贝尔实验室创造,它是C语言的扩展。C的设计初衷是为了提高代码的可重用性和可维护性。它允许开发人员使用面向对象编程(OOP)范例,这使得…...

保姆级别!!!--全网绝对教你会!!教你如何使用MQTTFX连接阿里云平台中的设备----下期告诉你如何创建!

本期需要下载的软件 MQttfx安装包,本人打包的-嵌入式文档类资源-CSDN文库 目录 第一步:建造阿里云设备 这个可以先忽略建造步骤,下期将提供步骤。 第二步:下载mqttfx软件 第三步:填写密钥信息进行连接 查看三元…...

Unexpected token ‘‘‘, “‘{“type“:““... is not valid JSON

尝试低代码schema解析JSON时报错,奇怪的是控制台解析正常,项目js执行JSON.parse()报错,简直无语了,,, 只能挨个检查了,首先温习了下JSON 的标准格式: JSON的合法符号:{(左大括号) }(右大括号) "(双引号) :(冒号) ,(逗号) [(左中括号) ](右中括号) JSON字符串:…...

关于C语言的杂记5

文章目录 引入正文内部函数与外部函数相关数组的知识点数组的初始化测试一维数组在内存中存储的地址:遍历二维数组的值测试二维数组的地址(观察内存情况)数组下标为0开始的由来 两个数交换位置的三种方法 引入 写在前面:关于C语言这部分内容,…...

YOLOv5 vs YOLOv6 vs YOLOv7目标检测模型速度和准确度的性能比较——深入研究

如果您正在进行目标检测项目,您很可能会选择众多 YOLO 模型中的一种。从现有的 YOLO 对象检测模型的数量来看,如何选择最佳模型是一个艰难的选择。 您可能会发现自己正在考虑: 选择哪种 YOLO 模型以获得最佳 FPS? CPU 与 GPU 的推理速度如何?选择哪种 GPU?微型、小型、…...

如何增加网站权重?有效提高网站权重的技巧方法

权重对于网站优化来说非常的重要,那什么是网站权重呢?网站权重是指搜索引擎给网站(包括网页)赋予一定的权威值,对网站(含网页)权威的评估评价。一个网站权重越高,在搜索引擎所占的份…...

路径规划 | 图解快速随机扩展树RRT算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是RRT算法?2 图解RRT算法原理3 算法仿真与实现3.1 ROS C++实现3.2 Python实现3.3 Matlab实现0 专栏介绍 🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);…...

【Stable Diffusion WebUI】一篇文章教你如何安装和使用Stable Diffusion WebUI

文章目录 Stable Diffusion WebUI1. 安装1.1 下载 stable-diffusion-webui1.2 运行 webui.sh 2. 安装插件2.1 命令行安装2.2 extensions 安装2.3 常用插件 3. 使用教程3.1 页面布局3.3 快捷栏设置3.3.1 PNG Info3.3.2 Tagger Stable Diffusion WebUI 1. 安装 1.1 下载 stable…...

Python篇——数据结构与算法(第二部分)

目录 二、排序算法(承接第一部分) 1、堆排序算法——树的基础知识补充 2、树的基本概念 3、二叉树基础知识 (1)满二叉树 (2)完全二叉树 (3)二叉树的存储方式(表示方式…...

人工智能之读懂CNN卷积神经网络

通过往期文章的分享,我们了解了神经网络的结构,一般分为输入层,隐藏层,输出层 TensorFlow神经网络 那什么是卷积神经网络那,这就要我们追溯一下人类识别图像的原理 人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现…...

go手写Redis(1)之协议说明

手写Redis 参考大佬的go实现redis,自己实现一个简单版本的用于学习go以及网络编程相关 https://github.com/HDT3213/godis https://coding.imooc.com/class/576.html #慕课网课程 源码地址: https://gitee.com/haijun1998/go_redis RESP协议 Redis Ser…...

Hadoop/HbBase/Hive/HDFS/MapReduce都是什么?

目录 一图胜万言!! 解释说明 1. hadoop 2. hive 3. hbase 总结 一图胜万言!! 解释说明 1. hadoop 它是一个分布式计算分布式文件系统,前者其实就是 MapReduce,后者是 HDFS 。后者可以独立运行&…...

羽毛球中级提高班课后总结

2023.3.28第一课 🏸️四点对角线步伐练习🏸️ 1️⃣每一次接球一定要有启动步,脚跟离地; 2️⃣两边上网都是先迈右腿,加一个并步,最后一步大迈步,脚跟先落地; 3️⃣右边上网脚尖朝…...

多维时序预测 | Matlab基于最小二乘支持向量机LSSVM多维时间序列预测,LSSVM多变量时间序列预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 基于最小二乘支持向量机LSSVM多维时间序列预测LSSVM多变量时间序列预测,matlab代码 评价指标包括:MAPE、MAE、RMSE和R2等,代码质量极高,...

KDZK-F水轮发电机转子测试仪

一、产品概述 KDZK-F水轮发电机转子测试仪是判断发电机转子绕组有无匝间短路的专用仪器,可以自动、手动(单向或双向)测量转子绕组的电压、电流、阻抗、功率、相位角等参数。 二、功能与特点 旋转鼠标,操作更方便。 可选择快速的…...

I2C通信协议原理和MPU6050

一、串口通讯 只能在两个设备之间进行 若要三台设备两两通信,则每个设备得需要两组窗口,为3组相互独立的窗口通讯 为解决这个问题:设计了总线通讯,有多种,I2C为其中一种 二、I2C通信 (1&#…...

3.5 RDD持久化机制

一、RDD持久化 1、不采用持久化操作 查看要操作的HDFS文件 以集群模式启动Spark Shell 按照图示进行操作,得RDD4和RDD5 查看RDD4内容,会从RDD1到RDD2到RDD3到RDD4跑一趟 显示RDD5内容,也会从RDD1到RDD2到RDD3到RDD5跑一趟 2、采用持久化…...

Nginx(四)

部署LNMP架构动态网站WordPress LNMPLinuxNginxMySQLPhp 环境 192.168.29.141centos8Nginx1.24.0192.168.29.142centos8MySQL8.0.33192.168.29.143centos8Php7.2.24 关闭firewalld systemctl stop firewalld systemctl disable firewalld 关闭selinux setenforce 0 sed -ir…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

【JVM】- 内存结构

引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线, n r n_r nr​ 根接收天线的 MIMO 系…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...