5-5中央处理器-指令流水线

news2025/1/15 7:53:51

文章目录

  • 一.基本概念
    • 1.多条指令在处理器中的执行方式
      • (1)顺序执行方式/串行执行方式
      • (2)流水线执行方式
        • ①一次重叠执行方式
        • ②二次重叠执行方式
    • 2.流水线的表示方法(时空图)
    • 3.超标量流水线
  • 二.分类
    • 1.部件功能级、处理机级和处理机间级流水线
    • 2.单功能流水线和多功能流水线
    • 3.动态流水线和静态流水线
    • 4.线性流水线和非线性流水线
  • 三.影响流水线的因素
    • 1.资源冲突
    • 2.数据冲突
    • 3.控制冲突
  • 四.性能指标
    • 1.吞吐率TP
    • 2.加速比S
    • 3.效率E
  • 五.五段式指令流水线
    • 1.运算类指令
    • 2.LOAD指令(取数指令)
    • 3.STORE指令(存数指令)
    • 4.条件转移指令
    • 5.无条件转移指令

一.基本概念

单周期处理机中采用串行方法执行的指令,同一时刻CPU中只有一条指令在执行,各功能部件的使用率不高。现代计算机普遍采用指令流水线技术,同一时刻有多条指令在CPU的不同功能部件中并发执行,大大提高了功能部件的并行性和程序的执行效率。

一条指令的执行过程可分解为若干阶段,每个阶段由相应的功能部件完成。如果将各段视为相应的流水段,那么指令的执行过程就构成了一条指令流水线。

为了提高执行速度,将一条指令的执行过程分为取指令、指令译码、执行和写回四个阶段,就形成了四级流水;若分为取指令IF、指令译码ID、取操作数OF、执行EX、写回WB,就形成了五级流水。

指令流水段的个数以最复杂指令所用的功能段个数为准,流水段的长度以最复杂的操作所花时间为准,因此将每个阶段的耗时取成一样,以最长耗时为准。对于耗时较短的指令,可以将本段处理完成的数据和控制信号保存在流水寄存器/缓冲寄存器/锁存器中,以保证本段的执行结果能在下个时钟周期给下一流水段使用。

每个流水段后面都需要增加一个流水寄存器,用于锁存,

1.多条指令在处理器中的执行方式

(1)顺序执行方式/串行执行方式

前一条指令执行完才能启动下一条指令。冯·诺依曼采用的就是顺序执行方式

优点:控制简单,硬件代价小
缺点:执行指令速度慢,功能部件的利用率低(若取址时内存忙碌,但执行指令部件是空闲的)

假设取址、分析、执行三个阶段的用时均为t,顺序执行n条指令所用时间T=3tn

在这里插入图片描述

(2)流水线执行方式

①一次重叠执行方式

假设取址、分析、执行三个阶段的用时均为t,执行n条指令所用时间T=(n-1)×2t+3t=2nt+t=(2n+1)t

优点:与顺序执行方式相比,程序的执行时间缩短了1/3(当n→∞时),各功能部件的利用率明显提高
缺点:需要付出硬件上较大开销的代价,控制过程也比顺序执行复杂了

在这里插入图片描述

②二次重叠执行方式

T=(n-1)×t+3t=nt+2t=(n+2)t

优点:与顺序执行方式相比,程序的执行时间缩短了2/3(当n→∞时),各功能部件的利用率进一步提高
缺点:需要付出硬件上较大开销的代价,控制过程也比顺序执行复杂了
在这里插入图片描述

2.流水线的表示方法(时空图)

时空图用于分析流水线的性能。
横坐标表示时间,即输入流水线中的各个任务在流水线中经过的时间;纵坐标表示空间,即流水线的每个流水段(即各执行部件)。流水线中各个流水段的执行时间都相等。

第一条指令I1在时刻t0进入流水线,在t0-t1时间段内处于取指令阶段,在t1-t2时间段内处于译码阶段,在时刻t4流出流水线。共有4个不同的功能部件(流水段),因此此图叫做4个功能段的指令流水线时空图

在这里插入图片描述

3.超标量流水线

(1)超标量流水线技术
每个时钟周期内可并发多条独立指令,即以并行操作方式将两条或多条指令编译并执行,为此需配置多个功能部件。在执行时不能调整指令的执行顺序,对于乱序发射可以调整。通过编译优化技术,把可并行执行的指令搭配起来。

在这里插入图片描述
超标量技术在同一时刻发出多条指令,类似于空分复用技术(多个功能部件)

(2)超流水线技术
在一个时钟周期内再分段(图中3段),在一个时钟周期内一个功能部件使用多次。不能调整指令的执行顺序,靠编译程序解决优化问题。

超流水线技术在不同时刻发出指令,类似于时分复用技术(一个部件多次)
在这里插入图片描述

(3)超长指令字
由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字,为此需采用多个处理部件。

在这里插入图片描述

二.分类

1.部件功能级、处理机级和处理机间级流水线

根据流水线使用级别的不同分
(1)部件功能级流水线:将复杂的算术逻辑运算组成流水线工作方式。例如,可将浮点加法操作分成求阶差、对阶、尾数相加以及结果规格化等4个子过程,即将指令流水线细分为部件内部的功能流水线。
(2)处理机级流水线:即指令流水线。把一条指令解释过程分成多个子过程,如取址、译码、执行、访存、写回
(3)处理机间流水线:是一种宏流水。其中每个处理机完成某一专门任务(如一个求阶差,一个对阶),各个处理机得到的结果需存放在与下一个处理机共享的存储器中

2.单功能流水线和多功能流水线

根据可以完成的功能
(1)单功能流水线
只能实现一种固定的专门功能的流水线
(2)多功能流水线
通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线

3.动态流水线和静态流水线

根据同一时间内各段之间的连接方式分
(1)静态流水线
在同一时间内,流水线的各段只能按同一种功能的连接方式工作
(2)动态流水线
在同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算。可以提高流水线的效率,但会使流水线控制变得复杂

4.线性流水线和非线性流水线

根据流水线的各个功能段之间是否有反馈信号分
(1)线性流水线
从输入到输出,每个功能段只允许经过一次,不存在反馈回路
(2)非线性流水线
存在反馈回路,从输入到输出过程中,某些功能段将数次通过流水线,这种流水线适合进行线性递归的运算

三.影响流水线的因素

1.资源冲突

多条指令在同一时刻,争用同一资源而形成的冲突。即由硬件资源竞争造成的冲突。资源冲突也叫资源相关、资源冒险。下同

解决方案:
(1)前一指令访存时,使后一条相关指令(以及其后续指令)暂停一个时钟周期
(2)单独设置数据存储器和指令存储器,使取数和取指令操作各自在不同的存储器中进行

2.数据冲突

(1)写后读(Read After Write,RAW):当前指令将数据写入寄存器后,下一条指令才能从该寄存器读取数据
(2)读后写(Write After Read,WAR):表示当前指令读出数据后,下一条指令才能写该寄存器
(3)写后写(Write After Write,WAW):表示当前指令写入寄存器后,下一条指令才能写该寄存器

解决方案:
(1)把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行,可分为硬件阻塞(stall)和软件插入“NOP”指令两种方法

硬件
在这里插入图片描述
软件在这里插入图片描述
(2)设置相关专用通路,即不等前一条指令把计算结果写回寄存器组,下一条指令也不再读寄存器组,而直接把前一条指令的ALU的计算结果作为自己的输入数据开始计算过程,使本来需要暂停的操作变得可以继续执行,这称为数据旁路技术

在这里插入图片描述
(3)通过编译器对数据相关的指令编译优化的方法,调整指令顺序来解决数据相关

3.控制冲突

指令通常是顺序执行的,但是在遇到改变指令执行顺序的情况,例如执行转移、调用或返回等指令时,会改变PC值,会造成断流,从而引起控制冲突。

解决方案:
(1)对转移指令进行分支预测,尽早生成转移目标地址。分支预测分为简单(静态)预测和动态预测。静态预测总是预测条件不满足,即继续执行分支指令的后续指令。动态预测根据程序执行的历史情况,进行动态预测调整,有较高的预测准确率
(2)预取转移成功和不成功两个控制流方向上的目标指令
(3)加快和提前形成条件码
(4)提高转移方向的猜准率

四.性能指标

1.吞吐率TP

在单位时间内流水线所完成的任务数量,或输出结果的数量

TP=任务数/所有任务的总时间

一条指令的执行分为k个阶段(纵),每个阶段耗时△t,取△t为一个时钟周期,任务数为n(横)。则所有任务的总时间=(k-1)△t+n△t=(k-1+n)△t

因此TP=n/[(k-1+n)△t],当n→∞时,TPmax=n/(n△t)=1/△t
在这里插入图片描述
装入时间:从第一条指令从取址到结束所需时间,即k△t
排空时间:最后一条指令从开始运行到结束所需时间

在这里插入图片描述

2.加速比S

完成同样一批任务,不使用流水线与使用流水线所用的时间之比。

在此例中,S=nk△t/[(k+n-1)△t]
当n→∞时,Smax=nk△t/(n△t)=k

在这里插入图片描述

3.效率E

流水线的设备利用率,即忙碌时间占总时间的比例

E=n个任务占用的时空区有效面积/n个任务所用的时间与k个流水段所围成的时空区总面积=中间红色阶梯面积/蓝色大矩形面积

在这里插入图片描述
通过补面,E=紫色部分面积/蓝色矩形面积=n△t/[(k+n-1)△t]
当n→∞时,Emax=1

在这里插入图片描述

五.五段式指令流水线

①取指令IF段包括程序计数器(PC)、指令存储器、下条指令地址的计算逻辑
②指令译码ID段包括操作控制器、取操作数逻辑、立即数符号扩展模块
③执行EX段主要包括算术逻辑单元(ALU)、分支地址计算模块
④访存MEM段主要包括数据存储器读写模块
⑤写回WB段主要包括寄存器写入控制模块。

在这里插入图片描述
各种寄存器和数据存储器均采用统一时钟CLK进行同步,每来一个时钟,就会有一条新的指令进入流水线IF段;同时流水寄存器会锁存前段加工处理完成的数据和控制信号,为下一段的功能部件提供数据输入。

1.运算类指令

(1)IF:根据PC从指令Cache取指令至IF段的锁存器
(2)ID:取出操作数至ID段锁存器
(3)EX:运算,将结果存入EX段锁存器
(4)M:空段
(5)WB:将运算结果写回指定寄存器

2.LOAD指令(取数指令)

如:将Rs寄存器的值+996,以此作为有效地址。取出该地址对应主存单元的数据,放入Rd寄存器中
(1)IF:根据PC从指令Cache取指令至IF段的锁存器
(2)ID:将基址寄存器的值放到锁存器A,将偏移量(立即数)的值放到Imm
(3)EX:运算(相加),得到有效地址EA
(4)M:从数据Cache中取数并放入锁存器
(5)WB:将取出的数写回寄存器

3.STORE指令(存数指令)

如:将Rs寄存器的内容存入Rd(基地址)+996
(1)IF:根据PC从指令Cache取指令至IF段的锁存器
(2)ID:将基址寄存器的值放到锁存器A,将偏移量(立即数)的值放到Imm。将待存的数放到锁存器B
(3)EX:运算(相加),得到有效地址EA。并将锁存器B的内容放到锁存器Store
(4)M:根据EA写入数据Cache
(5)WB:空段

4.条件转移指令

通常采用相对寻址
如:当Rs和Rt寄存器的值相等时,进行转移。转移到(对下一条指令偏移):当前指令PC+指令字长+偏移量×指令字长。不相等时转移到:当前指令PC+指令字长
(1)IF:根据PC从指令Cache取指令至IF段的锁存器
(2)ID:进行比较的两个数放入锁存器A、B;偏移量放入lmm
(3)EX:运算,比较两个数
(4)M:将目标PC值写回PC(耗时短,尽早安排,避免控制冲突)
(5)WB:空段

5.无条件转移指令

通常采用相对寻址
如:跳转到偏移量的地址,PC改为:当前指令PC+指令字长+偏移量×指令字长
(1)IF:根据PC从指令Cache取指令至IF段的锁存器
(2)ID:偏移量放入lmm
(3)EX:将目标PC值写回PC(耗时短,尽早安排,避免控制冲突)
(4)M:空段
(5)WB:空段

[a]表示a的存储单元地址
在这里插入图片描述

  • 流水线越多,并行度就越高。那么是否流水段越多,指令执行越快?
    不是。①流水段缓冲之间的额外开销增大。每个流水段有一些额外开销用于缓冲间传送数据、进行各种准备和发送等功能,这些开销加长了一条指令的整个执行时间,当指令间逻辑上相互依赖时,开销更大;②流水段间控制逻辑变多、变复杂。用于流水线优化和存储器(或寄存器)冲突处理的控制逻辑将随流水段的增加而增大,这可能导致用于流水段之间控制的逻辑比段本身的控制逻辑更复杂。
  • 关于指令相关、数据相关
    (1)两条连续的指令读取相同的寄存器时,会产生读后读RAR相关,这种相关不会影响流水线
    (2)某条指令要读取上一条指令所写入的寄存器时,会产生写后读RAW相关,它称数据相关或真相关,影响流水线。按序流动的流水线只可能出现RAW相关
    (3)某条指令的上条指令要读/写该指令的输出寄存器时,会产生读后写WAR和写后写WAW相关。在非按序流动的流水线中,既可能发生RAW相关,又可能发生WAR相关和WAW相关
    (4)对流水线影响最严重的指令相关是数据相关

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第四十五章 动态规划——背包问题模型(二)

一、概述 我们在上一章中已经对背包模型做了一定地讲解,但是我们发现其实在上一章节中我们所介绍的例题大部分是给背包问题套上一个背景,当我们识破了背后的模型后,我们就可以直接套用模板,基本不需要对代码做改变。 那么在这一…

SpringBoot读写Redis客户端并实现技术切换(Jedis)

SpringBoot整合Redishttps://blog.csdn.net/weixin_51882166/article/details/128759780?spm1001.2014.3001.5501 读写客户端 首先应该打开redis服务; cd命令进入Redis安装目录下: 进入Redis客户端: redis-cli.exe -h 127.0.0.1 -p 6379…

梯度下降算法有哪些?有什么区别?【背景、原理、公式、代码】

一、梯度下降算法背景 梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯…

行为型模式-职责链模式

1.概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同…

记一段相亲反思

记一段相亲反思项目系统启动项目相亲需求的细分高净值人群特定类型的高预期结婚结婚前的彩礼引流系统启动流量,从哪里来?作弊避险,什么钱不能赚?这不是一篇找对象的文章,而是帮别人找对象来赚钱的文章。 项目系统 启…

洛谷-P2114 [NOI2014] 起床困难综合症

题目链接: P2114 [NOI2014] 起床困难综合症 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述: 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳。作为一名青春阳光好少…

Bayesian Personalized Ranking from Implicit Feedback 阅读笔记

Abstract BPR主要用于基于隐式反馈(implicit feedback)的Item Recommendation。 尽管有很多做同样事情的算法比如matrix factorization, knearest-neighbor。但他们并不是直接对于物品排名本身进行预测的。 而BPR则是通过贝叶斯分析得到最大的后验估计量来预测排…

基于蜣螂算法优化概率神经网络PNN的分类预测-附代码

基于蜣螂算法优化概率神经网络PNN的分类预测 - 附代码 文章目录基于蜣螂算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立3.基于蜣螂优化的PNN网络5.测试结果6.参考文献7.Matlab代码摘要:针对PNN神经网络的光滑因…

[GYCTF2020]EasyThinking (ThinkPHP V6.0.0)

[GYCTF2020]EasyThinking 打开以后就注册一些功能,注册admin admin,成功然后尝试search这个方法是否有任意文件读取漏洞,试了试没有任何的回显。 然后个人中心,显示的是自己的历史命令 接下来,呃呃呃就没思路了&…

DFS(五)N皇后

51. N 皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案…

★ 我的世界各类奇葩武器实现!(命令方块1.13+)

新版execute一出很多玩家都不会了。开头先给大家说一下怎么以旧换新: e.g. 旧版: /execute e[typearrow] ~ ~ ~ summon tnt 新版就改为: /execute at e[typearrow] run summon tnt 非常简单! 注记 以下代码块里的命令未经表明一…

Mysql入门技能树-数据类型

数值的隐式类型转换 Joe 需要使用下列表做一项数值计算 create table points(id int primary key auto_increment,x int,y int );计算查询为: select id, (x^2 y^2)/2 as result from points; 得到的结果集中,result 列的类型应该是: 答…

剑指Offer 第1天 第2天

第 1 天 栈与队列(简单) 剑指 Offer 09. 用两个栈实现队列 class CQueue { public: CQueue() {} void appendTail(int value) { s1.push(value); } int deleteHead() { while(!s1.empty()) { …

AtCoder Regular Contest 154 C. Roller(思维题)

题目 T(T<5e3)组样例&#xff0c;每次给定一个数n(n<5e3)&#xff0c; 和长为n的两个数组a,b&#xff0c;你可以执行以下操作任意次&#xff1a; 操作&#xff1a;选择一个下标i(1<i<n)&#xff0c;将替换为&#xff0c;其中被认为是 问若干次操作后&#xff0…

JUC面试(十)——线程池Callable接口

线程池&Callable接口 前言 获取多线程的方法&#xff0c;我们都知道有三种&#xff0c;还有一种是实现Callable接口 实现Runnable接口实现Callable接口实例化Thread类使用线程池获取 Callable接口 这是一个函数式接口&#xff0c;因此可以用作lambda表达式或方法引用的…

JDBC连接池多线程通过CountDownLatch实现线程并发执行

目录 1.连接池 1.1 什么是连接池 1.2 为什么使用连接池 1.3 连接池的工作原理 1.4我们如何手写【难点】 1.4.1编写说明 1.4.2 创建jdbc.properties 1.4.3 封装一个连接类 1.4.4 创建一个连接池接口 1.4.5 创建一个连接池实现类以及对应方法 1.4.6 创建一个连接池的维…

spingboot如何接受前端请求

首先我们是否用的是rest风格开发的的都是适用的.普通参数get 请求发送方注:由于是get请求不用body(json)接收.接受方post请求发送端注意:在请求体(body)里面用x-www-from-urlencoded(不仅可以发请求,还可以发文件)接受体没有5种不同参数类型的传递普通参数[简单数据]&#xff1…

用 Java 实现计算器功能

练习一 1.设计一个类模拟一个计算器 达到什么需求&#xff1f;加减乘除 需要设计一个方法一个计算方法 控制台输出 首先请输入第一个数 例如数字 1 请输入符号 例如 请输入第二个数 例如 2 第二次 数字 3 请输入符号 - 请输入第二个数 2 结果 1 程序解析&#…

27. 作用域

1. 定义 作用域就是一个 python 程序可以直接访问命名空间的正文区域。 在一个 python 程序中&#xff0c;直接访问一个变量&#xff0c;会从内到外依次访问所有的作用域直到找到&#xff0c;否则会报未定义的错误。 python 中&#xff0c;程序的变量并不是在哪个位置都可以访…

【Hadoop】MapReduce原理剖析(Map,Shuffle,Reduce三阶段)

文章目录1. Map阶段1.1 把输入文件(夹)划分为很多InputSplit(Split)1.2 分配并执行map作业2. Shuffle阶段2.1 Partition(分区)2.2 Sort(排序)2.3 Group(分组)2.4 Combiner(规约)2.5 序列化并写入Linux磁盘内存2.6 反序列化读取数据到不同的reduce节点2.7 Reduce端数据进行合并、…