【计组】中央处理器CPU

目录

[1 CPU的功能和基本结构](#1 CPU的功能和基本结构)

[1.1 CPU基本功能](#1.1 CPU基本功能)

[1.2 运算器和控制器的功能](#1.2 运算器和控制器的功能)

[1.2.1 运算器的基本结构](#1.2.1 运算器的基本结构)

[1.2.1.1 专用数据通路方式](#1.2.1.1 专用数据通路方式)

使用多路选择器

使用三态门

CPU内部单总线方式(最常用)(总线也称为BUS)

[1.2.2 控制器的基本结构](#1.2.2 控制器的基本结构)

[1.3 CPU总结构](#1.3 CPU总结构)

[2 指令执行过程](#2 指令执行过程)

[2.1 指令类型](#2.1 指令类型)

[2.2 指令周期流程](#2.2 指令周期流程)

取指周期

间址周期

执行周期

中断周期

[2.3 指令执行方案](#2.3 指令执行方案)

单指令周期

多指令周期

流水线方案

[3 数据通路的功能和基本结构](#3 数据通路的功能和基本结构)

[3.1 CPU内部单总线](#3.1 CPU内部单总线)

[3.2 专用数据通路](#3.2 专用数据通路)

[4 控制器的功能和工作原理](#4 控制器的功能和工作原理)

[4.1 控制器如何工作](#4.1 控制器如何工作)

[4.2 控制单元(控制器CU)的输入和输出](#4.2 控制单元(控制器CU)的输入和输出)

[4.3 硬布线控制器](#4.3 硬布线控制器)

[4.3.1 CPU的控制方式](#4.3.1 CPU的控制方式)

同步控制方式

异步控制方式

联合控制方式

[4.3.2 安排微操作时许](#4.3.2 安排微操作时许)

安排微操作时许的原则

[4.3.3 电路设计](#4.3.3 电路设计)

[4.4 微程序控制器](#4.4 微程序控制器)

[4.4.1 微程序的基本思想](#4.4.1 微程序的基本思想)

[4.4.2 微程序控制器的基本结构](#4.4.2 微程序控制器的基本结构)

[4.4.3 微指令的格式](#4.4.3 微指令的格式)

[4.4.4 微指令的编码方式](#4.4.4 微指令的编码方式)

1.直接编码(直接控制)方式

2.字段直接编码方式

3.字段间接编码(隐式编码)

[4.4.5 微指令的地址形成方式](#4.4.5 微指令的地址形成方式)

1.微指令的下地址字段指出

2.根据机器指令的操作码形成

3.增量计数法(不常用)

4.分支转移(不常用)

5.测试网络(不常用)

6.硬件产生微程序入口地址(不常用)

[4.4.6 微程序控制器的基本概念(总结)](#4.4.6 微程序控制器的基本概念(总结))

[4.4.7 微程序控制单元的设计](#4.4.7 微程序控制单元的设计)

[5 指令流水线](#5 指令流水线)

[5.1 指令流水的定义](#5.1 指令流水的定义)

[5.2 流水线的表示方法](#5.2 流水线的表示方法)

[5.2.1 指令执行过程图](#5.2.1 指令执行过程图)

[5.2.2 时空图](#5.2.2 时空图)

[5.3 流水线的性能指标](#5.3 流水线的性能指标)

[5.4 指令流水线的影响因素](#5.4 指令流水线的影响因素)

[5.4.1 结构相关(资源冲突)](#5.4.1 结构相关(资源冲突))

[5.4.2 数据相关(数据冲突)](#5.4.2 数据相关(数据冲突))

[5.4.3 控制相关(控制冲突)](#5.4.3 控制相关(控制冲突))

[5.5 流水线的分类](#5.5 流水线的分类)

[5.6 流水线的多发技术](#5.6 流水线的多发技术)

[5.6.1 超标量技术](#5.6.1 超标量技术)

[5.6.2 超流水技术](#5.6.2 超流水技术)

[5.6.3 超长指令字](#5.6.3 超长指令字)


本文很长且内容相当琐碎

本文很长且内容相当琐碎

本文很长且内容相当琐碎

1 CPU的功能和基本结构

CPU可以看作是算数逻辑单元(ALU),寄存器,时序逻辑电路(CU)和中断系统组成的。

1.1 CPU基本功能

指令控制:完成取指令、分析指令和执行指令的操作,即程序的顺序控制

操作控制:一条指令的功能往往是若干操作信号组合实现。CPU管理并产生这些由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作

时间控制:对各种操作加以时间上的控制,时间控制要为每条指令按时间顺序提供应有的控制信号

数据加工:对数据进行算数和逻辑运算

中断处理:对计算机运行过程中出现的异常情况和特殊请求进行处理

1.2 运算器和控制器的功能

(CPU可以拆分为运算器和控制器(逻辑上))

运算器:对数据进行加工

控制器:协调并控制计算机各部件执行程序的指令序列,基本功能包括取指令,分析指令,执行指令,中断处理

1.2.1 运算器的基本结构

由算术逻辑单元 和寄存器组成

算数逻辑单元(ALU)的主要功能是进行算数/逻辑运算,通过外部信号,对传入的数据进行相加或者相减等操作
通用寄存器:一般我们可以用R0,R1,R2这样的符号表示,也可以用AX,BX,CX,SP等表示(AX这样的表示方式一般是用于区别高低地址的,AH是寄存器A中的高地址,AL是低地址,AX表示整个寄存器)。通用寄存器用于存放操作数(包含源操作数,目的操作数和中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶地址

累加寄存器(ACC):它本质上也是通用寄存器,在ALU进行累加的时候暂存ALU的运算结果,用于加法实现

程序状态字寄存器(PSW):保留由算数逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志(OP)、符号标志(SF)、零标志(ZF)、进位标志(CF)等。PSW中的这些位参与并决定微操作的形成

暂存寄存器 :用于暂存从主存读来的数据,这个数据不能存放在通用寄存器中,否则会破坏其原有内容(本质上起一个缓冲的作用,不然A和B同时从总线上读数据,ALU不能正常工作了)

算数逻辑单元和寄存器之间的连线可以分为两种:专用数据通路方式 和CPU内部单总线方式。

1.2.1.1 专用数据通路方式

像下图根据指令执行过程中的数据和地址的流动方式安排连接线路的称为专用数据通路方式。

即每个寄存器单独与算数逻辑单元(ALU)通信。

专用数据通路方式的性能高,数据冲突少,但结构复杂,硬件量大。

从上图我们发现,算数逻辑单元(ALU)不能区别数据从哪个寄存器发送过来(多个寄存器同时传输),于是我们有以下解决方案:

使用多路选择器

使用多路选择器根据控制信号选择一路输出(共享开关)

使用三态门

使用三态门可以控制每一路是否输出(每个单独开关)

CPU内部单总线方式(最常用)(总线也称为BUS)

在系统内部设置公共通路,将所有寄存器的输入端和输出端都连接到一条公共的通路上(该通路称为CPU内部总线或者ALU总线)

这样设计的结构简单,容易实现,但数据传输存在较多冲突的现象,性能较低

暂存寄存器 :用于暂存从主存读来的数据,这个数据不能存放在通用寄存器中,否则会破坏其原有内容(本质上起一个缓冲的作用,不然A和B同时从总线上读数据,ALU不能正常工作了)

1.2.2 控制器的基本结构

1.程序计数器(PC):用于指出下一条指令在主存中的存放地址。CPU就是根据PC的内容去主存中取指令的。程序中指令一般是顺序执行的,所以PC有自增功能(PC与指令寻址有关看计算机指令系统-CSDN博客)

2.指令寄存器(IR):用于保存当前正在执行的指令

3.指令译码器(ID):仅对操作码字段进行译码,向控制器提供特定的操作信号

4.微操作信号发生器:根据IR的内容(指令)、PSW的内容(状态信息)和时许信号,产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种

5.时许逻辑:用于产生各种时许信号,它们都是由统一时钟(CLOCK)分频得到

6.存储器地址寄存器(MAR):用于存放所要访问的主存单元的地址

7.存储器数据寄存器(MDR):用于存放向主存写入的信息或者从主存中读出的信息

1.3 CPU总结构

其中橙色的表示用户可见,可编程(或者可以辅助用户进行编程操作);灰色代表机器自动管理,用户不可见

2 指令执行过程

指令周期:CPU从主存中每取出并执行一条指令所需的全部时间。

指令周期 常常用若干机器周期 来表示,机器周期又叫CPU周期。

一个机器周期 又包含若干时钟周期 (也称为节拍、T周期 或CPU时钟周期,CLK(CLOCK缩写)),时钟周期是CPU操作的基本单位。

每个指令周期内机器周期可以不等,每个机器周期内的节拍数也可以不等。

2.1 指令类型

空指令NOP:空指令只包含取指令的时间

加法指令ADD:指令周期可以拆分为取指周期和执行周期

乘法指令MUL:指令周期拆分为取指周期和执行周期,由于乘法本质上是多次加法,所以执行周期比加法长

具有间接寻址的指令:指令周期分为取指周期,间址周期和执行周期

带有中断周期的指令:指令周期分为取址周期,间址周期,执行周期和中断周期

..................

由于每个指令的任务和操作不同,就导致了定长和不定长的机器周期出现

2.2 指令周期流程

我们可以用触发器来表示系统目前的状态:

在四个工作周期中都有CPU访存操作,只是访存的目的不同。取指周期是为了取指令,间址周期是为了取有效地址,执行周期是为了取操作数,中断周期是为了保存程序断点。

取指周期

1.当前指令地址送至存储器地址寄存器,(PC)->MAR

2.CU发出控制信号,经控制总线传到主存,这里是读信号,1->R

3.将MAR所指主存中的内容经数据总线送入MDR,M(MAR)->MDR

4.将MDR中的内容(指令)送入IR,(MDR)->IR

5.CU发出控制信号,形成下一条指令地址,(PC)+1->PC

间址周期

1.将指令的地址码送入MAR,Ad(IR)->MAR或者Ad(MDR)->MAR

2.CU发出控制信号,启动主存做读操作,1->R

3.将MAR所指主存中的内容经数据总线送入MDR,M(MAR)->MDR

(4.将有效地址送到指令的地址码字段,MDR->Ad(IR)或者MDR->MAR(这里主要看机器如何设计,部分认为送到IR中转没有必要,这也是第一步出现差异的原因))

执行周期

对不同操作数和地址码进行操作,根据具体指令内容完成

对它们的操作可以看

计算机指令系统-CSDN博客https://blog.csdn.net/eighth_antidote/article/details/163250192?spm=1001.2014.3001.5502

中断周期

中断的目的是暂停当前任务去做其他任务,所以回来时原状态应该保存,即保存断点

一般使用堆栈来保存断点,假设SP指向栈顶元素。

1.CU控制SP减1,修改后的地址送入MAR,(SP)-1->SP (SP)->MAR

(本质上是将断点存入存储单元,假设其地址为a,可以记作a->MAR)

2.CU发出控制信号,启动主存做写操作,1->W

3.将断点(PC中地址)送入MDR,(PC)->MDR

4.CU控制将中断服务程序的入口地址(由向量地址形成部件产生)送入PC,向量地址->PC

2.3 指令执行方案

由于每条指令执行所需时间不同,所以导致CPU在执行指令的时候会有许多方法:

单指令周期

固定每条指令的执行时间,即使该指令所需时间短于该固定时间

对所有指令选用相同的执行时间来完成。这导致指令之间串行执行,即指令周期取决于执行时间最长的指令的执行时间

对于哪些本来可以在更短时间内完成的指令,要使用这个较长的周期来完成,会降低系统运行速度

这样设计非常简单,但运行效率比较低(因为指令是一条执行的)

多指令周期

对不同类型的指令选用不同的执行步骤来完成,单独处理每条指令的执行时间,本质上是对单指令周期的优化

指令之间串行执行,可选用不同个数的时钟周期来完成不同指令的执行过程

这样设计会比单指令周期复杂一点,执行效率比单指令周期高一点

流水线方案

在每一个时钟周期启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤中

对于每一条指令,它所需要的硬件是不同的,而那些空闲的硬件可以用来执行其他指令。

指令之间并行执行

3 数据通路的功能和基本结构

对于数据通路,我们进行分类讨论,但这里的内容以理解为主,不需要特别记忆。重在理解逻辑

3.1 CPU内部单总线

这里我们假设CPU为单总线的,结合前面来解释

数据通路指的是数据在部件之间的路径,即数据流

如下图为CPU内部结构(假设),和上面的CPU总结构那里面的结构类似,我们取运算器的那部分,控制器那部分先忽略。

在此之前先解释一下总线,总线也叫Bus,可以简单分为内部总线和系统总线。

内部总线指的是同一部件内部的总线,如CPU总线

系统总线指的是计算机系统各部件之间的总线,如CPU,内存,I/O接口之间的总线
CPU内部的数据通路 也可以分为三类(本质上一样,人为稍微区分一下,不区分也没事):

(此处以上面的结构为例,看图不方便开两个网页)

1.寄存器之间的数据传送:比如在MAR和PC或者ACC之间的操作

如将PC内容送到MAR:

(PC)->Bus PCout有效,PC内容送达总线

Bus->MAR MARin有效,总线内容送到MAR

2.CPU与主存之间的数据传送:先读进来,再完成第一类数据传送的过程

如CPU从主存读取指令,实现传送操作的流程及控制信号:

(PC)->Bus->MAR PCout和MARin有效,将指令从PC送到MAR中暂存

1->R CU向主存发读命令,主存读内容

MEM(MAR)->MDR MDRin有效(这个MDRin指的是和主存之间的数据线)

MDR->Bus->IR MDRout和IRin有效,当前指令送往IR

3.执行算数或逻辑运算:

如一条加法指令,微操作序列及控制信号为(假设两个加法数一个在主存中,一个在ACC中):

Ad(IR)->Bus->MAR 因为IR没有out线,所以只能使用MDR中存放的地址码来寻找

MEM(MAR)->数据线->MDR 将加法数读入CPU中的MDR暂存

MDR->Bus->Y MDRout和Yin有效,操作数移到Y中,准备加法运算

(ACC)+(Y)->Z 在ALU中完成加法运算,存放到Z寄存器中

3.2 专用数据通路

此处逻辑和CPU专用线路一样,只是其中结构变了,就不废话了

取址周期过程如下:

4 控制器的功能和工作原理

4.1 控制器如何工作

控制器指挥整个系统的工作

控制器的结构:

作为计算机系统的指挥中心,控制器的主要功能有:

1.从主存中取出一条指令,并指出下一条指令在主存中的位置

2.对指令进行译码或测试,产生相应的操作控制信号,以便启动规定的动作

3.指挥并控制CPU,主存,输入和输出设备之间的数据流动方向

4.2 控制单元(控制器CU)的输入和输出

输入:

1.指令寄存器:

OP(IR)->CU本条指令的操作码部分,规定了CU的控制信号

2.时钟:

一个时钟脉冲发送一个命令或者一组需要同时执行的操作命令,通过时钟告诉CU时钟周期。本质上是计数(叫做计时也行?)用的

3.标志:

根据标志位决定下一步操作,标志主要来自运算器中的程序状态字寄存器(标志寄存器)

4.外部信号(系统总线的控制信号):

比如中断请求信号INTR,总线请求信号HRQ
输出:

1.CPU内部的控制信号:

寄存器之间的数据传输,PC的修改,控制ALU进行相应的运算

2.到控制总线的控制信号:

到存储器:访存控制信号MREQ,读命令RD,写命令WR

到IO设备:访问IO设备的控制信号IO

中断相应信号INTA,总线相应信号HLDA

硬布线和微程序是控制单元CU设计的两种方案。

4.3 硬布线控制器

控制器设计步骤:

1.分析每个阶段的微操作序列

2.选择CPU的控制方式

3.安排微操作时许

4.电路设计

分析微操作序列可以看前文的数据通路,那里有比较详细的分析,所以在此就不进行分析了

4.3.1 CPU的控制方式

CPU的控制方式:产生不同微操作命令序列所用的时许控制方式

同步控制方式

整个系统所有的控制信号均来自一个统一的时钟信号,此模式适用于定长机器周期。通常以最长的微操作序列和最烦的微操作作为标准,采取完全统一的,具有相同时间间隔和相同数目的节拍作为机器周期来运行不同的指令。以偏概全,用最长的机器周期来替代所有的机器周期。

当然也有不定长的:

同步控制方式的控制电路简单,但运行速度慢。不管是定长还是不定长,它们的节拍都一样,由时钟周期统一控制

异步控制方式

异步控制不存在基准时标信号。即类似上面标准的T0节拍不存在。

异步控制是按照每个部件各自的固有工作速度工作,通过应答方式进行联络

异步虽然运行速度快,但是它的控制电路比较复杂

联合控制方式

对各种不同指令的微操作实行大部分同步,小部分异步。

4.3.2 安排微操作时许

安排微操作时许的原则

1.微操作的先后顺序不得随意更改

2.被控对象不同的微操作尽量安排在一个节拍内完成

3.占用时间短的微操作,尽量安排在一个节拍内完成,并允许有先后顺序

用一句话来总结就是在先后顺序不改变的情况下尽可能多地完成微操作

4.3.3 电路设计

对于硬布线来说,电路设计就是组合逻辑设计,可以分为以下三步:

1.列出操作时间表

2.写出微操作命令的最简表达式

3.画出逻辑图

4.4 微程序控制器

微程序分类

我看的课把微程序的分类放最后面,不理解为什么。

1.静态微程序设计和动态微程序设计

静态 微程序无需改变,采用ROM

动态 通过改变微指令和微程序改变机器指令,有利于仿真,采用EPROM

2.毫微程序设计

微程序设计 用微程序解释机器指令

毫微程序设计 用毫微程序解释微程序

和套娃一样

硬布线 的工作原理是通过组合逻辑电路根据当前的指令码、状态和时许即时产生的

而微程序控制器 的工作原理是实现将微操作控制信号存储在一个专门的存储器中,将每一条机器指令编写成一个微程序(微程序和机器指令类似,存在微操作码(操作控制),微地址码(顺序控制),所以你可以将微程序和机器指令等价起来看)。用控制存储器存储这些微程序,用寻址用户程序机器指令的办法来寻址每个微程序中的微指令

4.4.1 微程序的基本思想

基本概念:

机器指令由微命令组成,而微操作是微命令的执行过程。

相容性微命令:可以同时产生、共同完成某些操作的微命令(如 PC->MAR 和 1->R )

互斥性微命令:在机器中不允许同时出现的微命令

所以我们可以将相容的微操作编写为微指令,互斥的单独编写为微指令。

于是这些概念之间的连接就显现出来:

微操作命令(微命令)->微指令->微程序=机器指令

4.4.2 微程序控制器的基本结构

微指令控制器主要由以下部件组成:控制存储器CM,地址译码,微地址寄存器CMAR,微指令寄存器CMDR,顺序逻辑和微地址形成部件

它们的功能分别为:

地址译码:接受微地址寄存器CMAR中的微地址,将地址码转化为存储单元控制信号,本质为译码器

控制存储器CM:用于存放各指令对应的微程序,控制存储器可用只读存储器ROM构成,可以理解为存放的是指令集

微地址寄存器CMAR:接收其他部件送来的微地址,暂时存放

微指令寄存器CMDR:用于存放控制寄存器CM中取出来的微指令(位数一般与微指令字长相等)

微地址形成部件:产生初始微地址和后继微地址,让微指令可以连续执行

顺序逻辑:顺序逻辑接入时钟和标志来判断当前微地址是初始微地址还是后继微地址,保证其连续

整体的工作流程为:

OP->微地址形成部件->顺序逻辑->CMAR->地址译码->CM->CMDR->顺序逻辑->......

外部向微程序控制器中传入操作码字段OP

微地址形成部件产生初始微地址传入顺序逻辑

顺序逻辑判断其为初始微地址传入CMAR

CMAR将地址码暂存,转移到地址译码

地址译码将地址码解析在控制寄存器CM中找到微指令

控制存储器CM将找到的微指令存放到微指令寄存器CMDR中

微指令寄存器CMDR将微指令中下一条指令的地址转移到顺序逻辑中,继续下一条指令。微指令运行后产生的结果通过CMDR传输到CPU内部或系统总线

4.4.3 微指令的格式

1.水平型微指令------一次能定义并执行多个并行操作

将多个操作集成在操作控制中,微程序短并且执行速度快 。但微指令长并且编写微程序麻烦

2.垂直型微指令------类似机器指令操作码的方式,由微操作码字段规定微指令的功能

微指令较短,简单,规整,便于编写微程序。但由于每条微指令单独编写,微程序长,执行速度慢,工作效率低。

3.混合型微指令------将前面两个混起来

在垂直型的基础上增加一些不太复杂的并行操作,结合上面两个的优点

4.4.4 微指令的编码方式

微指令的编码方式又称微指令的控制方式,指如何对微指令的控制字段进行编码,形成控制信号。编码的目标是在保证速度的情况下,尽量缩短微指令字长。

微命令组成微指令

微命令组成微指令

微命令组成微指令

以水平型微指令为例:

1.直接编码(直接控制)方式

在微指令的操作控制字段中,每一位代表一个微操作命令,某位为"1"表示该控制信号有效。

即控制字段与微操作一一映射。

该编码方式简单直接,执行速度快并且操作的并行性好。

但这样会导致微指令字长过长,n个微命令就要求微指令的操作字段有n位,造成控存容量极大。

2.字段直接编码方式

将微指令的控制字段分成若干"段",每段经过译码后发出控制信号

微命令字段分段原则:

1.互斥性微命令分在同一段内,相容性微命令分在不同段内

2.每个小段中包含的信息位不能太多,否则将增加译码线路的复杂性和译码时间

3.一般每个小段还要留出一个状态,表示本字段不发出任何微命令。如字段长度为3,最多表示7个互斥微命令,000表示不操作

直接编码的方式可以缩短微指令的字长。但需要通过译码电路后发出微命令,因此比直接编码方式慢

3.字段间接编码(隐式编码)

当一个字段的某些微命令需要另一个字段的某些微命令来解释时,这种方法就称为字段间接编码,又称隐式编码

简单来说就是在直接译码的基础上再套一层译码。两层译码。

通常作为辅助手段,在直接编码不能胜任的时候,会辅助使用间接编码

4.4.5 微指令的地址形成方式

编码方式是微指令的内容编码和解读,微指令的地址形成方式关乎微指令能否连续执行。

1.微指令的下地址字段指出

微指令格式中设置一个下地址字段,由微指令的下地址字段直接指出后继微指令的地址,这种方式又称为断定方式。

2.根据机器指令的操作码形成

当机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成。即存储在机器指令的操作码中,译码后自动取得

3.增量计数法(不常用)

类似于 (PC)+1->PC,机器自动计数加一。(CMAR)+1->CMAR

4.分支转移(不常用)

直接将分支做到微指令中,微指令由:操作控制字段,转移方式和转移地址组成

转移方式:指明判别条件

转移地址:指明转移成功后的去向

5.测试网络(不常用)

微指令的不同字段规定了不同的作用(类似上面分支转移),通过一定的硬件来产生下地址

6.硬件产生微程序入口地址(不常用)

如第一条微指令地址由专门硬件产生

中断周期由硬件产生中断周期微程序首地址

4.4.6 微程序控制器的基本概念(总结)

下图为CPU的大概结构

将控制单元CU放大

在4.4微程序控制器中我们提到了以下内容:

1.微命令与微操作:

微命令是微操作的控制信号

微操作是微命令的执行过程

2.微指令与微周期:

微指令是若干微命令的集合

微周期通常指从控制存储器中读取一条微指令并执行相应的微操作所需的时间

3.主存储器与控制存储器:

主存储器用于存放程序和数据,在CPU外部,用RAM实现;

控制存储器(CM)用于存放微程序,在CPU内部,用ROM实现

4.程序与微程序:

程序是指令的有序集合,用于完成特定的功能;

微程序是微指令的有序集合,一条指令的功能由一段微程序来实现

4.4.7 微程序控制单元的设计

设计步骤:

1.分析每个阶段的微操作序列

2.写出对应机器指令的微操作命令及节拍安排

3.确定微指令格式

4.编写微指令码点

写不动了,这块不写了。写这么多我真的会看吗 :(

到这里已经8000字了啊

还有个知识图,tm的这么多给人学的啊?看完后面忘记前面

没事,还差一个流水线CPU这块就差不多了

5 指令流水线

5.1 指令流水的定义

一条指令的执行过程可以分成多个阶段(或过程)。根据计算机的不同,具体的分发也不同

我们可以简单分为三个阶段:取指,分析,执行。

取指:根据PC内容访问主存储器,取出一条指令送到IR中。

分析:对指令操作码进行译码,按照给点的寻址方式和地址字段中的内容形成操作数的有效地址EA,并从有效地址EA中取出操作数。

执行:根据操作码字段,完成指令规定的功能,即把运算结果写道通用寄存器或主存中

我们可以发现三个阶段用到的硬件不一样,于是我们可以有不同的指令执行方式

1.顺序执行方式

取指k->分析k->执行k->取指k + 1->分析k + 1->执行k + 1

即传统冯诺依曼机采用顺序执行方式,又称串行执行方式

优点:控制简单,硬件代价小

缺点:执行指令的速度较慢,在任何时刻,处理机中只有一条指令在执行,各功能部件的利用率很低

总耗时T=3nt(假设取指,分析和执行都为t的时间,共n条指令)

2.一次重叠执行方式

一次重叠就是在执行的时候同时进行下一轮指令的取指(两条指令之间存在一次重叠)

优点:程序的执行时间缩短了1/3,部件利用率提高

缺点:硬件开销变大,同时执行过程变复杂

总耗时T=(1 + 2n)t

3.二次重叠方式

两条指令之间存在两次重叠,与一次重叠相比再次减少1/3。

二次重叠是一种较理想的指令执行方式,在正常情况下会有3条指令同时执行

优点:.........

缺点:..........

总耗时T=(2 + n)t

5.2 流水线的表示方法

我们观察发现指令执行存在多种方式,即流水线不同。同一条流水线存在不同的表示方式(和同一组数据可以用直方图,折线图等等来表示一样)

5.2.1 指令执行过程图

和上面的图片的表示方式类似,即类似这样的图例表示方式

但是会在此基础上加上一些坐标表示,如指令序列,时间等:

指令执行过程图一般用于分析指令执行过程以及影响流水线的因素

5.2.2 时空图

时空图的y轴表示不同阶段所对应的不同硬件资源,可以简单理解为物理元件的占用情况(或者某阶段是否发生)

时空图一般用于分析流水线的性能(为什么可以用于分析性能可以看下面)

5.3 流水线的性能指标

判断指令流水线的性能主要看三点:吞吐率,加速比,效率。

人话就是:工作效率(吞吐率)

和之前相比效率提升多少(加速比)

设备被压榨的占比(处于工作状态设备占比)(效率)。

吞吐率

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

假设任务数为n,处理n个任务所用的时间为

则计算流水线吞吐率(TP)的最基本公式为

在理想情况下,流水线的时空图为下图:

一条指令的执行分为k个阶段,每个阶段耗时,一般取=一个时钟周期,得到的计算公式:

带入上式得到TP计算公式,可以看出当n->∞的时候,得到最大吞吐率为
加速比

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

假设为不使用流水线的执行时间,即顺序执行所用的时间;表示使用流水线时的执行时间,则计算流水线加速比(S)的基本公式,在理想情况下计算,,

带入S的公式得到,同样当n->∞的时候,最大加速比
效率

流水线的设备利用率称为流水线的效率

效率被定义为:完成n个任务占用的时空区有效面积与n个任务所用的时间与k个流水段所围成的时空区总面积之比。

则流水线效率的定义就为:

这样讲起来非常抽象,可以看下图,本质上就是两个面积之比:

当连续输入任务n->∞时,最高的效率为(即空闲的面积可以忽略不计)

5.4 指令流水线的影响因素

流水线可以分为五个流水带(指令的执行阶段):取指阶段,译码阶段,执行阶段,访存阶段,写回阶段。

每一个阶段所消耗的时间是不同的,为了方便流水线的设计,将每个阶段的耗时取成一样,以最长耗时为基准。

为了保证各阶段耗时相同,会在每个功能段部件后面设置一个缓冲寄存器(锁存器),其作用是保存本流水段的执行结果,提供给下一流水段使用

本质就是加一个延迟器,统一所有流水段的时间。

5.4.1 结构相关(资源冲突)

多条指令在同一时刻争用同一资源而形成的冲突称为结构相关。

产生原因

假设上图中的取指和访存阶段使用的为同一寄存器。就会产生资源冲突:


解决方式

1.对后一相关指令暂停一个周期。即先来先得,后来排队

2.重复配置资源。即多设置一些存储器,让资源充足

5.4.2 数据相关(数据冲突)

数据相关指在一个程序中,存在必须等前面指令完成以后才可以执行后一条指令的情况,则这两条指令数据相关。

产生原因

前一条指令的数据后一条指令也要用,如下图r1在多条指令中都需要。比如第一条和第二条指令,r1不能同时存在于ALU和Reg中,导致指令流水线运行错误(当然如果是指令的顺序执行是可以正常执行的)


解决办法

1.将遇到数据相关的指令和后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行。具体方法分为硬件阻塞(stall)和软件插入"NOP"(插入空指令)两种办法。

2.使用数据旁路技术。即不等待r1回到寄存器中,而是想办法直接从ALU中把r1取出来,半路拦截回寄存器的r1,让它直接到下一条指令中

3.编译优化:通过编译器调整指令顺序来避免指令数据冲突。本质上是软件层面的优化

5.4.3 控制相关(控制冲突)

当流水线遇到转移指令和其他改变PC值的指令而造成断流时,会引起控制相关

产生原因

比如下图:当前运行的指令需要进行跳转,直接跳转到第五条指令。但是按照流水线的顺序操作,中间的第二到四条指令就报废了(粉色部分),因为中途插入了第五条指令。


解决办法

1.提前判断转移是否发生,尽早生成转移目标地址(看看当前指令有没有跳转)

2.预取转移成功和不成功两个控制流方向上的目标指令(顺序情况和转移的指令都保存?这块我不太理解)

3.加快和提前形成条件码(和第一种方式类似,但有优化)

4.提高转移方向的猜准率(通过统计学来预测该指令是转移还是不转移,从而判断下一条指令是否执行)

前面已经将流水线的定义,图例表示,性能指标和影响流水线工作的因素介绍完成了。下面算是一个总结和补充

5.5 流水线的分类

没啥用处,了解即可

部件功能级,处理机级和处理机间级流水线

根据流水线使用的级别的不同,流水线可分为部件功能级流水线,处理机级流水线和处理机间流水线(很拗口)

部件功能级流水:将复杂的算术逻辑运算组成流水线工作方式。如:将浮点加法操作分成求阶差、对阶、尾数相加以及规格化等四个子过程(这四步组成流水线)

处理机级流水:把一条指令解释过程分成多个子过程。如取指、译码、执行、访存和写回

处理机间流水:是一种宏流水,其中每一个处理机完成某一专门任务,各个处理机得到的结果存放在与下一个处理机共享的存储器中
单功能流水线和多功能流水线

按流水线可以完成的功能,分为单功能和多功能

单功能流水线:只能实现一种固定的专门功能的流水线

多功能流水线:通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线(和工厂流水线类似,可以产面包也可以产无人机的流水线)
动态流水线和静态流水线

按同一时间内各段之间的连接方式,流水线可分为静态流水线和动态流水线(静态指单一任务的流水线,动态指单流水线多任务)

静态流水线:同一时间内,流水线各段只能按照同一种功能的连接方式工作

动态流水线:同一时间内,当某些段正在实现某种运算时,另一些段在进行另一种运算。流水线效率较高,但控制复杂
线性流水线和非线性流水线

按流水线的各个功能段之间是否有反馈信号,分为线性和非线性

线性流水线:从输入到输出,每个功能段只经过一次,不存在回路(单向)

非线性流水线:存在反馈回路,某些功能段将数次通过流水线,该流水线适合进行线性递归运算(存在回路)

5.6 流水线的多发技术

通过一些方法提高流水线的运行效率

5.6.1 超标量技术

解释:黑色部分代表执行部件(这个我不确定,有疑问的查一下),横着每四块为一条指令。

通过超标量技术,我们可以在每个周期内并发多条独立指令 。同时我们发现在t=0的时候,存在三条指令同时运行,所以需要配置多个功能部件(具体看需求) 。由于同时运行多条指令,调整指令执行顺序变得异常复杂,所以不能调整指令的执行顺序 。若想要优化,需要通过编译优化技术,把可并行执行的指令搭配起来。

5.6.2 超流水技术

通过在一个时钟周期内再分段,让一个功能部件在一个时钟周期内多次使用(如上图流水线的效率为正常流水线的三倍)。

但这样也有坏处,即不能调整指令的执行顺序,只能靠编译程序解决优化问题

5.6.3 超长指令字

这个可能比较难理解。

由编译程序挖掘出指令间潜在的并行性 ,将多条能并行操作的指令组合成一条,最后组成具有多个操作码字段的超长指令字(几百位)。

如上图第一条指令运行到一半的时候发现第一条和第二条之间存在关联,于是将他们并行运行,将第一条的运行结果暂存给第二条使用,以此类推............

相关推荐
FakeOccupational1 小时前
【电路笔记 信号】DBPSK 波形查找表+脉冲成形(升余弦+根升余弦滤波)
开发语言·笔记
打工仔折腾 AI2 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战
ZealSinger2 小时前
Java虚拟线程上线后瓶颈转移到哪看三层
java·开发语言·firefox
2601_961133282 小时前
盘立方软件指标文华期货公式下载
java
蜗牛互联网2 小时前
长任务多Agent共享文件系统的Manifest交接模式
java·人工智能·后端
Sirens.2 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
sunshine22 girl3 小时前
Java学习五 面向对象高级5 内部类1
java·学习
weixin_440730503 小时前
函数return、参数、参数组、递归函数、高阶函数等小结
开发语言·python
sugarzhangnotes4 小时前
【无标题】
开发语言·人工智能·python