文章目录
- 前言
- 一、CPU的功能与基本结构
- 1.1、CPU的功能
- 1.2、运算器与控制器需要实现功能
- 1.3、运算器的基本结构
- 1.3.1、基本结构构成(七个部分)
- 1.3.2、各个部件详细介绍
- ①算数逻辑运算单元
- ②通用寄存器组(介绍数据通路的基本结构2个)
- ③暂存寄存器
- ④累加寄存器
- ⑤程序状态字寄存器
- ⑥移位器
- ⑦计数器
- 1.4、控制器内部的基本结构
- 1.4.1、基本结构构成(七个部分)
- 1.4.2、各个部件详细介绍
- ①程序计数器
- ②指令寄存器
- ③指令译码器
- ④微操作信号发生器
- ⑤时序系统
- ⑥存储器地址寄存器(MAR)
- ⑦存储器数据寄存器(MDR)
- 1.5、CPU运算器、控制器完整结构
- 本节回顾
- 二、指令执行过程
- 2.1、指令周期
- 2.1.1、认识指令周期与机器周期
- 2.1.2、实际的指令周期例子
- 2.1.3、指令周期流程
- 2.2、指令周期的数据流
- 2.2.1、概述
- ①取指周期
- ②间址周期
- ③执行周期
- ④中断周期
- 2.3、指令执行方案(三种)
- 本节回顾
- 三、数据通路的功能和基本结构
- 3.1、数据通路的功能和基本结构
- 3.1.1、数据通路的功能
- 3.2、数据通路的基本结构
- 3.2.1、认识数据通路的基本结构
- 3.2.2、CPU内部单总线方式
- 3.2.2.1、三类数据流动
- 3.2.2.2、CPU内部单总线方式-例题
- 3.2.3、专用通路结构
- 3.2.3.1、专用数据通路方式(含取指周期过程)
- 3.2.3.2、专用数据通路方式-例题
- 本节回顾
- 四、控制器的功能和工作原理
- 4.1、硬布线控制器
- 4.1.1、硬布线控制单元图
- 4.1.2、硬布线控制器的设计
- 详细完整步骤
- ①分析每个阶段的微操作序列
- ②选择CPU的控制方式
- ③安排微操作时序
- ④电路设计
- 1、列出操作时间表
- 2、写出微操作命令的最简表达式
- 3、画出逻辑图
- 硬件控制器设计总结
- 4.2、微程序控制器
- 4.2.1、微程序控制的基本原理
- 4.2.1.1、微程序控制器的设计思路
- 4.2.1.2、微程序控制器的基本结构与执行原理
- 4.2.1.2、微程序控制器的工作原理
- 总结
- 4.2.2、微指令的设计
- 4.2.2.1、微指令的格式
- 4.2.2.2、微指令的编码方式(三种)
- 4.2.2.3、微指令的下地址部分
- 知识点回顾
- 4.2.3、微指令控制单元的设计
- 4.2.3.1、微指令控制单元的设计步骤
- 4.2.3.2、微程序设计分类
- 4.2.3.3、硬布线与微程序对比
- 微程序控制器回顾
- 五、异常和中断机制
- 六、指令流水线
- 6.1、指令流水线的基本概念与性能指标
- 6.1.1、指令流水的定义
- 6.1.2、流水线表示方法
- 6.1.3、流水线的性能指标
- 本节回顾
- 6.2、指令流水线的影响因素与分类
- 6.2.1、机器周期的设置(五段流水线)
- 6.2.2、三个影响流水线的因素
- 1、结构相关(资源冲突),两个解决方案
- 2、数据相关(数据冲突),三个解决方案
- 3、控制相关(控制冲突),四个解决方案
- 6.2.3、流水线分类(3种)
- 1、根据流水线的使用级别不同来进行分类
- 2、按照流水线可以完成的功能分类
- 3、按同一时间内各段之间的连接方式
- 4、按各个功能段之间是否有反馈信息
- 6.2.4、流水线的多发技术(3种)
- 1、超标量技术(空分复用技术)
- 2、超流水技术(时分复用技术)
- 3、超长指令字
- 6.3、五段式指令流水线
- 6.3.1、认识五段式流水线
- 6.3.2、常见的五类指令(包含各个指令的执行过程)
- ①运算类指令
- ②Load指令
- ③Stroe指令
- ④条件转移指令
- ⑤无条件转移指令
- 实际大题
- 七、多处理器的基本概念
- 7.1、多处理器的基本概念
- 7.1.1、SISD(单指令流单数据流)
- 7.1.2、SIMD(单指令流多数据流)
- 7.1.3、MISD(多指令流单数据流)
- 7.1.4、MIMD(多指令流多数据流,介绍多处理机系统)
- 7.1.5、向量处理机(SIMD思想进阶应用)
- 总结回顾
- 7.2、硬件多线程
- 7.2.1、介绍支持与不支持硬件多线程处理器
- 7.2.2、三种硬件多线程实现方式(支持硬件多线程)
- 7.2.2.1、细粒度多线程
- 7.2.2.2、粗粒度多线程
- 7.2.2.3、同时多线程
- 总结(三种硬件多线程)
- 7.3、共享内存多处理器(UMA与NUMA)
前言
目前正在备考24考研,现将24计算机王道的408学习整理的知识点进行汇总整理。
博主博客文章目录索引:博客目录索引(持续更新)
一、CPU的功能与基本结构
1.1、CPU的功能
1、指令控制:包含取指令、分析指令、执行指令操作。
2、操作控制:一条指令的功能往往是由若干个操作信号的组合来实现的。根据具体的指令来发出具体的操作信号,相应的操作信号会发送到相应部件,接着对应部件会按照信号进行相应的动作。
3、时间控制:每个具体的微操作信号需要按照时间顺序来进行逐一的发出。
4、数据加工:算数、逻辑运算。
5、中断处理:对计算机出现的异常以及特殊请求进行处理。
- 若是一段程序正在运行,此时我们鼠标点击(此时则会运行中断处理程序)对应正在运行的程序会中断先去执行我们鼠标的点击事件执行完成之后回到中断的程序位置继续执行。
- 若是没有中断程序,那么我们CPU执行命令只能是顺序往下执行。
1.2、运算器与控制器需要实现功能
运算器:算数、逻辑、移位运算,主要是对数据进行加工。
控制器:基本功能包含取指令、分析指令、执行指令,会进行协调并控制计算机各部件执行程序的指令序列。
- 取指令:会自动的形成指令地址(PC+1),自动发出取指令的命令(取完一条之后会自动发出)。
- 分析指令:操作码译码,分析本条指令要完成什么操作,产生操作数的有效地址。
- 执行指令:主要是形成操作信号控制序列的过程,从而控制运算器、存储器以及IO设备完成相应操作。
- 每执行完一条指令之后,就会执行中断处理程序来检查是否出现异常。中断处理:控制器会完成总线、输入输出的处理,检测是否异常情况处理。
1.3、运算器的基本结构
1.3.1、基本结构构成(七个部分)
包含有如下七个部分:
1.3.2、各个部件详细介绍
①算数逻辑运算单元
算数逻辑运算ALU包含有两个输入操作数A、B,以及一个输出口用于输出运算结果。
②通用寄存器组(介绍数据通路的基本结构2个)
通用寄存器组:包含AX、BX、CX、DX、SP。相对应会拆分为AH、AL,BH、BL,CH、CL,DH、DL。同样包含SP堆栈指针,用来指示栈顶的地址。
那很多情况下,我们会把需要参与运算的一些呃数据提前的存放到某一些通用寄存器当中,所以运算器的内部还需要提供一些通用寄存器组:
- 每一个寄存器都会与ALU中的A、B操作数位置连通,这个连通方式叫做:专用数据通路方式。根据指令执行过程中的数据和地址的流向方向安排连接线路。
介绍专用数据通路以及CPU内部单总线方式
对于专用数据通路存在的问题?
①每一个寄存器都与ALU有数据连接通路,那么寄存器数量增多后线路也会增多,此时成本就会增大。
②若是直接用导线连接,那么相当于多个寄存器同时并且一直向ALU传输数据?
解决方法1:使用多路选择器(MUX),根据相应的控制信号来进行选择输出。
- 若是左边传输00,此时就表示选择R0传输来的数据。
解决方案2:使用三态门,可以控制每一路是否输出。默认三态门是不导电的,每一个三态门都有一个接口R0out(表示R0是否可以输出),若是高电平那么就可以进行导电,此时就表示对应的寄存器数据可以通过。
同样包含另一种数据通路的方式:CPU内部单总线方式。
CPU内部单总线方式:将所有寄存器的输入端和输出端都连接到一条公共的通路上。
如何将R0的数据复制到R2上呢?不仅仅将R0的输入设置为1,还要将R2的输入也设置为1,此时两者导通就可以完成复制功能了。
优点:结构简单,容易实现。
缺点:由于在一根总线上传输,数据传输存在较多冲突现象,性能比较低。
③暂存寄存器
暂存寄存器:同样也可以对暂存寄存器添加一些功能,如移位寄存器、累加寄存器。
此时我们将总线与ALU进行连接,此时可能会造成冲突。
此时执行:ADD R0, R1
若是此时R0、R1同时传输到总线上,此时ALU无法判断A、B的值。
- 解决方案: 我们可以在其中一端设置暂存寄存器,首先让R0导通此时可以将数据传输到暂存寄存器中,接着我们关闭R0,让R1导通此时就能将R1传输到B中,这样就能够完成数据的传输。
此时通过这样子我们可以解决传输A、B数据的问题,但是ALU对A、B计算得到的值也会直接传输到总线上,此时同样可能会与R0发出的信号产生冲突,如何解决呢?
- 解决方案:在ALU的输出位置我们同样加一个暂存寄存器,此时当R0通过总线传输数据到达B稳定,ALU会把计算的结果先放在暂存寄存器中,在暂存寄存器的上面加一个三态门,一旦等到ALU的输出结果稳定的时候,再让三态门导通,将运算结果输出到总线上,此时让R0导通,就可以将对应的结果值输入到R0寄存器中。
对于暂存寄存器同样还增加了一些功能如算数移位、累加移位,此时就可以构成移位寄存器、累加寄存器。
④累加寄存器
实际在整个CPU中我们也可以单独增加一个累加寄存器,来进行存放中间结果。
⑤程序状态字寄存器
同样在CPU中也可以设置一个PSW(程序状态字寄存器)主要用于来保存运算结果的一些标志状态对应刚才运算的结果。
这些标志位可以参与并决定微操作的形成。
⑥移位器
同样ALU输出的位置通常还有移位功能,此时就是移位寄存器。
⑦计数器
执行了几次加几次减则让计数器来进行统计。
1.4、控制器内部的基本结构
1.4.1、基本结构构成(七个部分)
主要由七个部分构成:
1.4.2、各个部件详细介绍
①程序计数器
程序计数器:指明下一条指令在程序中的存放地址。
②指令寄存器
指令寄存器:用于保存当前正在执行的那条指令。
根据PC来取得对应的指令存放到指令寄存器,在指令中包含操作码以及地址码,对应地址码需要送到输出总线上,而操作码部分送到控制单元CU。
- 注意此时操作码会先送到一个指令译码器中。
③指令译码器
指令译码器:将指令寄存器中指令的操作码作为指令译码器的输入吗,接着这个译码器对应的某一个输出端会被选通,接着就可以根据这个输出信号来决定接下来执行哪些微操作。
④微操作信号发生器
微操作信号发生器:此时指令译码器得到的输出结果将作为输入到微操作信号发生器。
⑤时序系统
对于微操作的序列还需要一个先后次序,此时还需要有一个时序系统,用于产生时序信号。
操作信号发生器每接受到一个节拍信号,它就会执行下一个微操作发出下一个微操作所发出的操作信号。
对于所说的时序系统、指令译码器以及微操作信号发生器都属于CU单元:
根据当前的指令操作码以及PSW里面某一些标志位,可以确定接下来的微操作到底是什么。
⑥存储器地址寄存器(MAR)
⑦存储器数据寄存器(MDR)
1.5、CPU运算器、控制器完整结构
下面图中对于红色寄存器是可编程的,对于灰色的是不可编程写入数据的:
之后章节着重为CU。
本节回顾
二、指令执行过程
2.1、指令周期
2.1.1、认识指令周期与机器周期
细分指令执行的各个阶段
之前分析指令是单独分一个部分,在这里分析指令可以归于取值周期当中。
一个指令周期由取指周期、执行周期组成,其中取指周期包含取指令、指令译码两个部分。
一个机器周期包含若干个时钟周期,对于一次取指令(机器周期)则需要4个时钟周期才能够完成。
- 一个机器周期也可以说是完成了一个完整的子工作,其所需要的时间为一个机器周期。
通常所说的3.0Ghz,这里一个√就是一个hz,也就是一个微操作,也可以说是一个时钟周期。
机器周期分为定长机器周期以及不定长机器周期。不定长的机器周期指的是不同指令所消耗的节拍数不一样,可能一个执行指令所需要的一个机器周期时间比取指令所需要的一个机器周期节拍数少。
2.1.2、实际的指令周期例子
空指令NOP
:什么也不做。也是需要一个取指令与分析指令(这两个包含在取指周期中) 。1个机器周期
加法指令ADD
:包含有取指周期和执行周期。2个机器周期
乘法指令MUL
:包含有取指周期和执行周期(这个执行周期比加法指令的时间长,因为中间涉及到多次加法以及移位操作)。2个机器周期
具有间接寻址的指令:包含有取指周期、间址周期、执行周期(其中间址周期主要是中间地址转换的过程,也就是形式地址得到有效地址的时间,这段时间也需要进行访存)。3个机器周期
带有中断周期的指令:包含有取指周期、间址周期、执行周期、中断周期(最终会留出专门的一段时间来检查)。
- 除非此时处于关中断的状态,不然最后都要留一部分来进行一个机器周期的中断处理。
2.1.3、指令周期流程
CPU如何确定当前处于什么阶段?
- 可以设置四个触发器FE、IND、EX、INT,分别对应取址、间址、执行和中断周期。
如何判定?处于什么状态那么对应的触发器设置为1,其他都设置为0。
2.2、指令周期的数据流
指令执行各个阶段的数据流向
2.2.1、概述
四个工作周期都有对应的访存操作,各自的目的都各不相同:
- 取指周期:取指令。
- 间址周期:取有效地址。
- 执行周期:取操作数。
- 中断周期:保存程序断点。
①取指周期
取指周期:根据指令地址从主存中获取指令
1、将当前要取出指令的地址送至存储器地址寄存器。(PC)->MAR。
2、CU控制单元发出控制信号(读信号)经过控制总线到主存。1->R
3、将MAR所指的主存中的内容经数据总线传入到MDR当中,实际为主存读出数据经由数据总线传入到MDR。M(MAR)->MDR
4、将MDR中读到的数据送入到IR指令寄存器中。(MDR)->IR
5、CU发出控制信号,形成下一条访问地址。(PC)+1->PC
②间址周期
间址周期:通过拿IR中的指令的地址码(间接寻址)获取到有效地址
1、将指令中的地址码送入MAR。Ad(IR)->MAR
2、CU发出控制信号,启动主存做读操作。1->R。
3、将MAR所指的主存中的内容经过数据总线送入到MDR。(MAR)->MDR
4、将MDR中的有效地址送到指令中的地址码字段。(MDR)->Ad(IR)
对于传输到MDR中之后,此时MDR中的就是EA有效地址,一般有两种做法:
第一种做法:直接将MDR中的EA传输到MAR,用来指明操作数的地址。
第二种做法:会将这个得到的EA有效地址直接拼接到这个指令的地址码中,将原本的形式地址覆盖即可。接下来再执行这条指令的时候,把这个地址码当做是直接地址来进行访问就可以了。
③执行周期
执行周期:根据IR中的操作码与有效地址来通过ALU操作产生执行结果。
不同指令的执行周期操作不同,因此没有统一的数据流向。
④中断周期
中断周期:暂停执行当前的程序,转而去执行其他的程序。
1、CU控制将SP-1(栈顶指针),修改后的地址送入到MAR。(SP)-1->SP,(SP)->MAR。
2、CU发出控制信号,启动主存来做写操作。1->W
3、将断点(PC内容)送入MDR。(PC)->MDR
4、CU控制将中断服务程序入口地址由向量地址形成部件产生送入PC,实际就是中断程序执行的指令地址。向量地址->PC
每一个进程,每一个程序运行的过程当中。操作系统都会给这个进程在主存当中开辟一片空间,作为这个进程的运行堆栈。然后堆栈指针SP会指向当前这个进程的运行,堆栈的栈顶元素。
2.3、指令执行方案(三种)
三种指令执行的方案:
一个指令周期通常包括几个时间段(执行步骤),每个步骤完成指令的一部分功能,几个依次执行的步骤完成这条指令的全部功能。
执行方案1:单指令周期(串行执行)
所有指令的指令周期都是相同的。
好处:设计指令执行的控制电路的时候,我们需要根据这个节拍数来确定一条指令的执行是否结束。因为无论什么指令所需要的节拍数肯定都是一样的。这种方式设计电路更方便。
缺点:本来可以在更短时间内完成的指令,要使用较长的周期来完成,会降低整个系统的运行速度。
注意:使用该种方案,指令执行是串行执行的。
针对于执行方案1,我们提出了更好的解决方案:
执行方案2:多指令周期(串行执行)
允许不同类型的指令长度选用不同的执行步骤完成。
好处:比第一种执行方案效率高得多。
缺点:需要更加复杂的硬件设计。
方案3:流水线方案(并行执行)
在每一个时钟周期启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤当中。
本节回顾
三、数据通路的功能和基本结构
3.1、数据通路的功能和基本结构
3.1.1、数据通路的功能
指令周期的数据流:
数据通路的功能:
3.2、数据通路的基本结构
3.2.1、认识数据通路的基本结构
数据通路的基本结构如下:
- 单总线方式:同一时间只能有两个部件相互之间进行数据交换。
- 多总线方式:若是有3组总线,那么同时可以进行3组部件的交换。
- 专用数据通路:只要有两个寄存器之间有数据流动,那么就会单独的在两个寄存器之间建立一个数据通路进行连线。
着重了解单总线方式之间进行数据的流动:对于PCin、PCout都是由控制信号CU发出的
- 内部总线:指的是CPU的内部连接各个寄存器及运算部件的总线。
- 系统总线:指的是同一个计算机系统中的各部件,如CPU、内存、通道和各类I/O接口互相连接的总线。
3.2.2、CPU内部单总线方式
3.2.2.1、三类数据流动
数据流动分为三类:
①寄存器与寄存器之间流动:
- 过程中控制信号会导通相应的PCout、MARin,来让对应的寄存器数据在总线上导通流通。
(PC)->Bus:PCout有效,PC内容送总线 # CU发出控制信号,令PCout有效,并将PC中待执行指令地址传输到总线中。
Bus->MAR:MARin有效,总线内容送MAR # CU发出控制信号,令MARin有效,将总线中的指令地址传输到MAR中。
对于上面两条指令实际上可以合并为一条指令:(PC)->Bus->MAR
或者 PC->Bus->MAR
,着重描述数据流向即可。
②主存与CPU之间的数据传送(寄存器与主存之间流动):
目的:CPU从主存中读出指令,实现传送操作的流程。
- 完成指令地址->MAR中后,需要将MAR的地址信息读出到主存中,此时首先需要CU发出一个读命令,并且CU还要发出一个信号让MAR地址信息通过地址总线发送给主存。接着主存将对应的数据通过数据总线传送到MDR(这个操作同样需要控制总线去发送信号,一般为MDRinE,表示的是从外部总线进来的)。
(PC)->Bus->MAR:PCout和MARin有效, 现行指令地址->MAR
1->R CU发出读命令
MEM(MAR)->MDR MDRin有效 # 从主存中读出指令传输到MDR中
MDR->Bus->IR MDRout和MARin有效 # 将指令通过总线传输到指令寄存器中
③执行算数或逻辑运算(寄存器与ALU算数逻辑运算单元之间的流动):
Ad(IR)->Bus->MAR:MDRout和MARin有效 或者 AdIRout和MARin有效 # 其中Ad表示add,实际之前IR以及将对应的指令从主存读出传输到MDR了,此时也就是说IR与MDR中都是存着一份相同的指令,此时我们将MDRout和MARin设置为有效,即可将MDR中的指令传输到对应的MAR中了。
1->R:CU发出读命令
MEM(MAR)->数据线->MDR:MDRin有效 # 这里的话我们需要将MAR中的操作数从主存里取出相应的数放到MDR中,这里设置MDRin有效即可完成输入。
MDR->Bus->Y:MDRout和Yin有效,操作数->Y # 此时我们就需要将对应的数据取出放入到ALU的暂存器中,这里也是通过总线来进行传送。
# 注意对于单总线同一时间只能够传输一个信号,此时就先将一个操作数传入到寄存器中。
(ACC)+(Y)->Z:ACCout和ALUin有效,CU向ALU发送加命令 # 此时会将ACC累加器中的一个操作数以及Y寄存器中的操作数向ALU发送加命令最终输出到Z寄存器里。当输出稳定后将对应的in、out信号释放。
# 对于使用多总线时,我们就不需要将一个数先放入到暂存器中,而是直接通过另一个总线直接传输到ALU中与另一个传入到ALU中的数进行运算即可。
Z->ACC Zout和ACCin有效,结果->ACC # 将结果传输到ACC累加器中
3.2.2.2、CPU内部单总线方式-例题
ADD (R0), R1
:其中R1表示可以直接从R1寄存器中读出数据,(R0)表示需要走一次间接寻址。
- 取指周期:从PC中取出待执行的指令地址,接着从主存中取出指令,传输到MDR中,最后经由总线传输到IR指令寄存器里。
- 主要完成一个间址寻址,得到有效地址。
- 完成一个实际累加运算操作,最终将加法结果写回主存(由于原本的(R1)实际上进行间接寻址的,这里要写回到主存中)。
3.2.3、专用通路结构
专用数据通路:在任何两个进行数据流动的部件之间都建立起一个专用的数据通路。实际对应的中间过程与CPU内部单总线十分相似。
3.2.3.1、专用数据通路方式(含取指周期过程)
取指周期:将PC中的指向的指令地址从主存中读出指令并传输到指令寄存器IR中,最终将指令中的操作码传输到CU中完成译码。
对于扩展的ADD …:
# 此时在MAR中已经有我们的地址了
Ad(IR)->Bus->MAR # 将指令中的操作数地址传输到MAR中
MEM(MAR)->MDR # 根据操作数地址取出操作数传输到MDR
(MDR)+(ACC)->ACC # 将MDR中的操作数取出与ACC中的操作数相加交给ALU完成运算后传入到ACC累加器中
3.2.3.2、专用数据通路方式-例题
**(1)**a:MDR、b:IR、c:MAR、d:PC
解析:
首先看到+1,可以联想到程序计数器在取指完成后会进行+1,此时d就是PC。
在PC中存储的是下一条指令的指令地址,由于d只与c连通,此时可以确定c是地址寄存器MAR。
可以看到b是与微操作信号发生器相连接,对应指令中的操作码则要进行该操作,所以确定b为IR
通过排除最后可以确定a就是MDR,主存可以向MDR写数据,MDR也可以向主存写数据。
(2):整个过程就是从PC中取出指令地址,最终根据指令地址从主存中读出并保存到IR寄存器中的过程,最终PC还要进行+1
(PC)->MAR # 从PC中取出指令地址到MAR
MEM(MAR)->MDR # 从主存中根据指令地址取出指令存放到MDR
(MDR)->IR # 从MDR中取出指令传输到IR
op(IR)->微操作信号发生器 # 可以从IR中取出操作符发送给微操作信号发生器来进行译码
(PC)+1->PC # 取指完成后PC+1
**(3)**本题是来描述数据在运算器、控制器之间进行存/取访问的数据通路
前提:存/取数据已放在ACC中,数据地址放在MAR中
# 取
M(MAR)->MDR # 直接从主存中取出对应地址的数据传输到MDR
(MDR)->ALU->ACC # 从MDR中取出数据,由于MDR只与ALU连通,所以这里需要先传入到ALU中进行累加(操作数+0=操作数)后得到的结果传输到ACC里
# 存
(ACC)->MDR # 从ACC中取出数据传输到MDR中
(MDR)->M(MAR) # 将MDR中的数据传输到主存中的指定地址
**(4)**题目指的是将根据x地址取出数据后传输到ACC中
X->MAR # 将x地址传输到MAR中
MEM(MAR)->MDR # 根据MAR中的地址从主存中取出放置到MDR中
(MDR)->ALU->ACC # 最终与第二小问中的取一致,先通过ALU后再传输到ACC累加器里
**(5)**对于(ACC)+(Y)->ACC,首先需要根据Y的地址从主存中取出数据,接着来与ACC中的数据进行运算后传回到ACC累加器
Y->MAR
MEM(MAR)->MDR # 取出Y地址的操作数
(MDR)->ALU,(ACC)->ALU # 取出MDR中的操作数以及ACC中的操作数传输到ACC累加器里
ALU->ACC # 最终运算结果传输到ACC中
(6)(ACC)->Z,将ACC累加器中的值传输到Z主存地址
Z->MAR # 将Z的地址传输到MAR中
(ACC)->MDR # 将ACC中的操作数传输到MDR里
(MDR)->MEM(MAR) # 将MDR中的操作数传送到Z的主存地址中
本节回顾
四、控制器的功能和工作原理
微操作:描述的是我们要做的细分的工作,这个工作要完成什么样的功能。
- 有一些微操作是完成并行处理的,采用专用的数据通路。在同一个节拍中可以同时完成两个微操作。
微命令: 则是完成这个细分工作的发出的一些有效的控制信号。每发出一条微命令,意味着一个与之对应的微操作。
- 对于取指、间址、执行、中断周期中执行、中断中空出了一个节拍,原因是让所有的周期都能够保持相同的工作周期。
对应每个周期的节拍包含有如下特质:
- 特质1:一个节拍内可以并行的完成多个相容的微操作。
- 特质2:同一个微操作可能在不同指令的不同阶段被使用。
- 特质3:不同指令的执行周期所需要的节拍数各不相同,为了简化设计,选择定长的机器周期以可能出现的最大节拍数为准,通常以访存所需的节拍数作为参考。
- 特质4:若是实际所需节拍数较少,可将微操作安排在机器周期末尾几个节拍上进行。
4.1、硬布线控制器
硬布线控制器就是使用纯硬件的方式来实现控制器,并且硬件电路设计起来十分复杂。
4.1.1、硬布线控制单元图
完整的一个硬布线控制单元图如下图所示:
接下来这些是设计控制器的思想。
指令寄存器将n位操作码传给操作译码器,实际就是对应有2n个状态及线,此时输出传输给控制单元CU,若是为0000,那么就是0号接高电平,若是00001,则是1号线接高电平。
第一个需要信息(指令操作码):通过CU不仅需要判断当前的指令要执行什么操作。
第二个需要信息(目前的机器周期):通过四个触发器来进行判断,集成在CPU内部。
第三个需要信息(目前机器中的第几个节拍):需要给CU输入一个节拍信号,这是由一个节拍发生器给出的,其中的时钟部件会有规律的发出脉冲信号,每一个脉冲信号就是一个时钟周期,每发出一个就会让一根线进行导通(To-Tm不断循环),此时CU就可以根据这些线来判定当前是处于第几个节拍。
第四个需要信息(机器状态条件):标志来自于执行单元的反馈信息。
接着就需要探究每个输出的控制信号在对应的这个节拍中应该发出哪些"微命令"?
- 若是要让C1线对应操作(PC)->MAR,则需要将其接到PCout、MARin即可。
- 若是当前触发器FE=1且节拍处于T0时,此时要完成(PC)->MAR,可知C1=FE.T0,若是触发器与节拍都满足即为1。
此时根据这个逻辑表达式,可以设计出CU内部的一个部分,一旦为1时就会发出对应(PC)->MAR的微命令。
纯硬件的方式实现CPU的控制功能
4.1.2、硬布线控制器的设计
详细完整步骤
设计步骤:
1、分析每个阶段的微操作序列。(取指、间址、执行、中断)
2、选择CPU的控制方式。
3、安排微操作时序。
4、电路设计。
CU内部组合逻辑电路大致的原理
如何得到与一个微操作所对应的电路,搞清楚这个问题就能够知道硬布线控制器如何设计。
硬布线控制器设计(考试并不考)
①分析每个阶段的微操作序列
②选择CPU的控制方式
③安排微操作时序
取指周期:
间址周期:
执行周期:
④电路设计
同样包含三步骤:
①列出操作时间表
②写出微操作命令的最简表达式。
③画出逻辑图。
1、列出操作时间表
取指阶段:
- 若是I条件满足,需要将1放到IND中。IND表示是否处于间址周期的触发器。若是将1放到IND中,此时就会进入到间接寻址的阶段。
- 若是没有I特征位,此时就会将1放到EX中,EX表示执行阶段。
间址阶段:
- 若是IND没有特征时,才会去转到执行阶段。
执行阶段:
2、写出微操作命令的最简表达式
针对M(MAR)->MDR
我们来整个各个阶段所出现的所有情况,最终来构建出微操作命令的逻辑表达式:
3、画出逻辑图
硬件控制器设计总结
4.2、微程序控制器
4.2.1、微程序控制的基本原理
4.2.1.1、微程序控制器的设计思路
对于微程序控制器会引入软件的思想,通过使用微指令来描述一条机器指令的执行过程。
一条微指令可能包含多个微命令。一个指令可以是一个微程序,一个微程序可以包含多条微指令。
微指令是存储在"控制器存储器"当中的。
4.2.1.2、微程序控制器的基本结构与执行原理
微程序控制器的基本结构:
- 控制存储器CM:由只读存储器ROM构成。
- CMAR:指明了控制存储器CM地址的一个寄存器。
- 实际上就是PC与MAR的结合体。
- 地址译码:将地址码转化为存储单元控制信号。
- CMDR:用于存储从CM中取出的指令,该位数与微指令字长相同。
- 微地址形成部件:用来产生初始的微地址与后继微地址。根据这条机器指令的操作码来确定它所对应的微程序的起始地址到底是什么。
- 顺序逻辑:用于控制微指令的执行顺序的。
微指令序列一条条往下的执行原理:
①CPU取到一条指令之后,首先将指令的OP传入到微地址形成部件用来确定这一条指令所对应的微指令序列起始的地址。
②接下来根据顺序逻辑的标志这类信息,确定接下来这条要执行的微指令的地址,把微指令的地址放入到CMAR当中。
③经过地址译码器的译码后就可以选中CMAR所指向的那条微指令。
④接着从控制器存储器CM中取出微指令放入到CMDR中。
- CMDR中存储的一条微指令一部分是用来描述这条微指令所对应的控制信号。第二部分则是描述接下来要执行的一条微指令的一个地址,称为下地址。
⑤执行这条微指令之后,需要将下地址的信息送给顺序逻辑,接着顺序逻辑再结合上某一些机器标志信息再来决定下一条要决定执行的微指令地址,然后再把下一条微指令的执行地址送给CMAR。
4.2.1.2、微程序控制器的工作原理
思考:所有指令的取指、间址、中断周期所对应的微指令序列都一样,是否可以共享使用?
工作原理:
重点(解题):
1、取指周期微程序通常都是公用的,若是某指令系统中有n条机器指令,则CM中微程序的个数至少是n+1个(对应n个指令的执行周期微程序以及1个公用的取指周期的微程序)。
- 微程序段可以有n个;微程序的个数可以有n+1个。
2、一些早期的CPU、物联网设备的CPU可以不提供间接寻址以及中断功能,因此这类CPU可以不包含间址周期、中断周期的微程序段。
3、对于取指、间址、中断、执行这几个逻辑段也可以看作是一个整体。一条指令对应一个微程序。
总结
4.2.2、微指令的设计
本章节探讨:如何根据一条微指令来发出一条控制信号。
4.2.2.1、微指令的格式
微指令的格式:水平、垂直、混合型。
1、水平型微指令:执行一条就可以完成多条并行的微命令。
2、垂直型微命令:每执行一条可以完成一个微命令。
- 对于水平、垂直型命名由来:同样执行一个微指令,由于水平型一条可以完成多条并行微命令,此时就只需要几行即可,看起来胖胖的,对于垂直型一条完成一个微命令,那么就需要多条微命令,看起来瘦瘦的此时,此时就称为垂直型。
3、混合型:在垂直型的基础上增加一些不太复杂的并行操作。综合水平、垂直的特点与折中。
4.2.2.2、微指令的编码方式(三种)
对于微指令中的操作控制部分如何取进行编写的?
方式一:直接编码(直接控制)方式
在微指令的操作控制字段中,每一位就代表的是一个微操作命令。令该位为1则表示该控制信号有效。若是想要完成并行,那么就在多位上设置为1。
优点:简单、直观,执行速度快,操作并行性好。
缺点:微指令字长过长,n个微命令就要求微指令的操作字段有n位,造成控存容量极大(对于这种情况可以采用编码方式2来解决)。
方式二:字段直接编码方式
采用分段实现,每段经过译码后发出控制信号。
- 那么对于这种实现如何实现并行?互斥的微命令分在同一段中,相容性微命令分在段内,此时我们就可以多段并发,并发过程中每段任意一个都可以。
- 那么为什么一段在并行的时候只发出一个信号呢?比如一段我们3个位表示,一次一段就会发出三个位如000、010,此时就只能在并行时只能一个段发出一个信号了。
缺点:需要进行译码后才能够发出微命令,因此比直接编码方式慢。
示例小题:
方式三:字段间接编码方式
一个字段的某些微命令需要由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,故称为字段间接编码,又称隐式编码。
4.2.2.3、微指令的下地址部分
接着需要探讨微指令的下一部分:下地址
下地址如何确定?
1、微地址的下地址:直接根据微地址的下地址确定得到。
2、根据机器指令的操作码形成:由操作码经由微地址形成部件形成。
3、增量计数法:(CMAR)+1 -> CMAR,顺序找到下一条指令要确定的地址
4、分支转移:根据判别条件来确定实际要转移的i地址。
5、测试网络
- 根据顺序逻辑以及其中的标志信息,再结合上当前执行形成的微指令的某一些bit信息来决定接下来微指令的地址。
- 这里测试网络指的是内部处理的电路
6、由硬件直接产生微程序入口地址
专门硬件、中断周期的专门硬件
考察例题:
知识点回顾
4.2.3、微指令控制单元的设计
4.2.3.1、微指令控制单元的设计步骤
设计的步骤与硬布线控制器类似。
设计步骤:
1、分析每个阶段的微操作序列:同样与硬布线控制器的节拍安排一致,只不过这里操作码是交给"微地址形成部件"进行译码分析的,硬布线设计中则是ID(指令译码器)。对于三个节拍那么就可以使用三条微指令完成!
- 每一条指令结束之后都需要一个节拍来将微微指令的下地址传输给到CMAR中去:Ad(CMDR)->CMAR。
- 最后一条指令结束后会再需要一个节拍来将微地址形成部件所指明的当前这条指令它的执行周期所对应的首地址(也就是微程序的首地址)放入到CMAR当中:微地址形成部件->CMAR。
我们可以看到微程序控制器的速度比硬布线控制器更慢。
2、写出对应机器指令的微操作命令
3、确定微指令格式:包含操作码、下地址
4、编写微指令码点
4.2.3.2、微程序设计分类
毫微程序设计指的就是微程序设计指令再细分
4.2.3.3、硬布线与微程序对比
微程序控制器回顾
五、异常和中断机制
暂无
六、指令流水线
6.1、指令流水线的基本概念与性能指标
6.1.1、指令流水的定义
指令不同的执行方式包含有下面三种:
1、顺序执行(早期的冯诺依曼机)
好处:实现简单,硬件代价小
2、一次重叠执行方式:在顺序执行的基础上增加一些硬件部件
3、二次重叠执行方式(最理想情况)
6.1.2、流水线表示方法
方法一:指令执行过程图
方法二:时空图:主要用来、分析流水线的性能
6.1.3、流水线的性能指标
流水线的性能指标
1、吞吐率:单位时间内可以完成多少条指令
流水线代的时空图包含有装入时间、排空时间。
- 装入时间指的是:第一条指令从取指一直到结束所需要花费的时间,也就是让这个硬件部件逐渐装入的时间段。
- 排空时间指的是:最后一条指令从从开始运行到最后结束这一段时间,也就是让这个硬件部件逐渐退出的时间段。
当连续输入的任务n->无穷,最大吞吐量为TPmax = 1 /
2、加速比:完成同一批任务,不适用流水线与使用流水线所用的时间之比。
特征:引入流水线后,比起没有引入流水线的时候,这个速度增加了几倍。
计算公式:S = T0/Tk
当连续输入的任务n->无穷,最大加速比为Smax = k。
3、效率:指的是流水线的设备利用率。
特征:各个功能部件或者说各个设备的一个利用率,它们处于忙碌的时间占总时间的比例是多少。
设备利用率,就是忙碌的时间占总时间的一个比例。
如何计算?我们的指令分为了四个阶段,也就是在这种情况下,总共是由四组设备。
公式:E = T0 / kTk(n个任务占用k时空区有效面积 / n个任务所用的时间与k个流水段所围成的时空区总面积)
当我们输入的任务n->无穷时,最高效率为Emax = 1,表示随时都在忙碌,因为自始至终也只有最左半部分以及最右半部分为空,无穷时可忽略不计。
本节回顾
6.2、指令流水线的影响因素与分类
6.2.1、机器周期的设置(五段流水线)
在6.1中展示的是完美的流水线工作,但是在实际应用中会有影响指令流水线各个阶段的原因从而导致并不是衔接的很完美,此时我们来探讨相对应的一些影响因素。
五段式指令流水线(大题、选择最常考):分为五个阶段取指令、译码、执行、访存、写回。
- 该五段式就是经典的MIPS架构,其是第一个精简指令集RISC的系统,对应ARM架构同样也是RICS系统。
- 在MIPS架构下,所有的指令一定都是五个周期的,可能有些指令某些阶段不做任何操作,但是这五个阶段都是不能够被省略掉的。
注意:为了方便流水线设计,每个阶段的耗时取为一样,以最长耗时为准。
机器周期的设置(对于大部分MISP架构以及一些精简指令集系统来说都是以每个机器周期长度相等为准)。
锁存器作用:通过使用锁存器可以保存当前指令流水段的执行结果,提供给下一个流水段使用,这样可以来统一每个阶段的时间周期。
- 在流水线中的每一个功能段部件后面都有一个缓冲寄存器(或锁存器),作用就是保存本流水段的执行结果,提供给下一流水段使用。
在MIPS架构下主要都是分为五个周期,接下里探讨下每个阶段:
阶段1-取指令:根据PC所指向的位置去Instruction Cache(由于局部性原理,这里就是说的是大部分情况下,而不需要去进行访存)中找到该条指令,接着将该条指令放入到锁存器中。
阶段2-译码:完成指令译码以及取数的操作,接着会将操作数放置到锁存器a、b中。
- 取数这里会从通用寄存器中直接取出,不可能会有去主存取的情况,因为如果来自于主存,那么一定会先把那个数据放置到通用寄存器中。
阶段3-执行阶段:需要使用ALU来进行运算,取出直接放到锁存器中的a或b,接着另一个数通过从寄存器或者在图中的imm(锁存器,存储立即数的)中取得接着进行运算,最终将运算结果放置到锁存器中(也有可能会写回主存)。
- imm:在ID与EX中间虚线的那个寄存器,这个锁存器是专门用来存立即数的,因为有些情况操作数是直接存储在指令中,也就是立即寻址。
阶段4-访存:访问的是要操作的一部分不是指令而是数据,这里的话是Data Cache。
- CPU中包含有两个cache一个是第一阶段的Instruction Cache,另一个是第4阶段的Data Cache,通过将指令和数据分开存放其目的就是能够对两个模块进行并发进行访问取或读,这样可以更好的安排流水线工作。
- 若是我们要读或者写的数据没有在Data Cache中命中?此时指令流水线会出现断流的情况,此时就必须去访问主存。
阶段5-写回:将运算结果写回到一个通过寄存器中,也有可能不写回,具体情况具体分析。
6.2.2、三个影响流水线的因素
五个阶段描述完了,在第二个阶段可能会对一个通过寄存器进行读,在第五个写回阶段中,也有可能将数据写回到一个寄存器中,这两个阶段会对寄存器的读或写造成一些问题,此时就需要探讨影响指令流水线的具体因素,主要分为三大类:
1、结构相关(资源冲突):操作系统中互斥问题,某些资源不可以同时共享。
2、数据相关(数据冲突):同步问题,不同的指令可能会有一前一后的相互依赖关系。
3、控制相关(控制冲突):控制相关的因素。
1、结构相关(资源冲突),两个解决方案
产生的原因:通过采用流水线实现时,①当执行第四条指令时,刚好第一阶段与第一条指令第四阶段是同一时间执行,此时刚好第一阶段是从主存中取指令,第四阶段也正好去主存读取数据,此时就造成了资源冲突;②与此同时执行第四条指令的第二个阶段与第一条指令的第五个阶段前者是从寄存器中取数据,后者则是写回数据到寄存器中,此时又正好出现了资源冲突。
解决方案:
- 后一相关指令暂停一周期后再执行,此时就不会冲突。
- 资源重复配置,数据存储器+指令存储器(指令的第二阶段设置指令存储器,第四阶段设置数据存储器,也就是使用两个存储器,此时就可以解决问题)
2、数据相关(数据冲突),三个解决方案
产生的原因:某一些指令,它们中间使用到的操作数依赖于上一条指令最终得到的结果值,此时若是采用完美流水线时,第二条指令在进行读取所依赖第一条指令的结果时,第一条指令还没有完成运算,此时若是直接取数据就是得到的有问题的数据,这类前后关系强依赖的则就会产生数据冲突!如下图的2、3、4条指令都产生了数据冲突,因为它们都依赖于第一条指令的r1最终结果。
解决方案:
第一类解决方法:数据没解决好,我们就往后拖。
- 硬件方式:硬件阻塞,直接让硬件系统从第二条指令开始空出三个节拍,此时直到第一条指令得到结果了才取执行第二条指令,此时的r1操作数已写回寄存器了。
- 软件方式:在第一第二条指令中间插入三条空指令(具体插几条,是编译器所关心的事情),每一个空指令都会完整经过五个周期,此时也可以保证第二条指令读取r1数据的情况。
第二类解决方法:数据旁路(利用转发机制)。
- 数据旁路:我们依旧按照完美流水线方式进行,我们实际上对于r1中的数据不一定要非要从第一条指令写入的寄存器中读取,通过观察到当执行第二条指令在执行ALU运算时,实际上第一条指令的ALU已经得到了运算结果,此时我们可以将ALU的输出段接入到ALU的输入端,此时第二条在执行ALU时需要数据此时就直接在输入端了!!!无需进行等待
第三类解决方法:编译优化
通过编译器调整指令顺序来解决数据相关问题。
举例:若是第一条与第二条之间存在三个空节拍才能够保证数据直接不会读取到脏数据,此时我们看后续的指令是否有没有不相关第一条指令的最终结果r1,可以将该指令向前移动,此时若是有三个不相关指令,那么此时就可以完美衔接解决!
3、控制相关(控制冲突),四个解决方案
原因:由于完美流水线的缘故,我们的指令会依次每一条指令的一个周期后接上,此时若是出现类似于if判断的分支时,当第一条指令去ALU中得到结果后判定执行的指令后,此时中间的这几个顺序指令就会造成时间上的浪费,也就是原本无须指令的此时就预先先进行了执行,实际无需执行,此时就出现了控制冲突!!!
解决方案:
1、转移指令分支预测:直接简单无脑猜是true或者false。
2、预取转移成功和不成功两个控制流方向的目标指令:实际就是将true和false的两条指令直接取出到第一条指令后。
3、加快和提前形成条件码:类似于加法器中一位全加器的串联,每个全加器会依赖前边的全加器产生的进位信息,可以通过电路改造的方式让某些信息提前的传递。
4、提高转移方向的猜准率:引入一些方法提高方案1的猜测概率。
6.2.3、流水线分类(3种)
1、根据流水线的使用级别不同来进行分类
①部件功能级流水线:指令执行分为不同的阶段,每一个阶段所需要用到的功能部件不一样,将某一个阶段用到的功能部件再进一步的细分。例如我们要将运算的操作数送给ALU,此时可以将ALU进行运算过程进行细分。
- 举例:浮点数加法运算可分为求阶差对阶,尾数相加、规格化几个部分进行功能分段,并且对应使用的电路也各不相同,此时对于四个分段功能可以采用流水线来进行实现。
②处理机级流水线:对应就是之前的指令,指令的执行分为多个段,每个段所需要的使用的部件不一样就可以形成指令流水线。
③处理机间流水线:每个CPU去完成对应的功能,例如第一个CPU完成阶差对阶,第二个CPU完成尾数相加,第三个完成规格化,一个CPU完成一个专门的任务,最终将它们拼接起来就可以完成一个完整的工作。
2、按照流水线可以完成的功能分类
单功能流水线:对应的一条流水线中只完成固定功能的指令。
多功能流水线:一条流水线中可以完成多条不同的功能指令。
3、按同一时间内各段之间的连接方式
静态流水线:流水线的各段在同一时间内只能按照一种功能的连接方式,例如在ALU内部的各个部件在同一时间内,只能完成这种浮点数加法的运算。
动态流水线:在同一时间内,可以完成多个功能,例如定点数加法、减法等。
4、按各个功能段之间是否有反馈信息
线性流水线:从输入到输出,每个功能段只允许经过一次,不存在反馈电路。
非线性流水线:例如想要解决数据冲突问题时,ALU的输出线接入到ALU的输入线上,对于有这种反馈则是非线性。对于非线性流水线某些功能段可能会数次通过流水线。
- 举例:若是我们没有乘法电路而是只有加法电路,那么计算乘法则某个功能段就需要数次流过流水线,需要多次加法实现乘法。
6.2.4、流水线的多发技术(3种)
1、超标量技术(空分复用技术)
超标量技术(空分复用技术):在一个时钟周期中,可以并行的发射多条指令。
对于同时要运行三条指令则需要配置有三个ALU,因此要实现超标量技术那么就必须配置多个功能部件。
对于一次发出的多条指令,这几条顺序是无法更改的,例如下图中第二部分中的一条指令是无法移到第一部分中的某一条指令位置的。
- 针对于乱序发射的CPU是可以调换顺序的,可以与超标量技术作对比。
对于超标量技术对于编译优化的要求十分高,因为需要将可以并行的指令放到一起。
2、超流水技术(时分复用技术)
介绍:一个时钟周期内,一个功能部件可能会被使用到多次,下图中可以看到一个时钟周期分为了三段,是一种时分复用技术。
将原本一个完整的时间段再细分为了三个更细小的时间段。流水线的速度提高了3倍。
3、超长指令字
一条指令分为四个阶 段:取指、译码、执行以及写回。
通过编译程序发掘出多条指令中潜在的并行性,将多条可以并行的指令合并到一整条中在执行阶段进行处理。
对于这种同时进行的,同样也需要多个相互独立的处理部件。
6.3、五段式指令流水线
6.3.1、认识五段式流水线
五段式流水线分为:①IF(取指)->②ID(译码&取数)->③EX(执行)->④M(访存)->⑤WB(写回寄存器)
6.3.2、常见的五类指令(包含各个指令的执行过程)
常见的五类指令:运算类指令、LOAD指令、STORE指令、条件转移指令、无条件转移指令。
①运算类指令
- 对于ADD指令,可以看到原操作数是在左边,目的操作数是右边,Rs、Rd指的是寄存器中、#996指的是立即数。
运算类指令的五个执行阶段:
- 阶段1-取指:从Instruction Cache中取出指令后,放入到IF的锁存器中。
- 阶段2-译码:对指令操作码译码,将操作数存储到锁存器A或B中,若是有立即数则将立即数存储到imm锁存器中。
- 阶段3-执行:取出操作数使用ALU执行,将最终运算结果存放到EX锁存器段中(会放在第四个阶段的锁存器中)。
- 阶段4-访存(无需做任何事情):一般来说运算器进行运算的结果无需放回到主存中,而是直接存放到寄存器里。对于精简指令系统来说,第五阶段运算类指令无需做任何事情,不需要将结果接入到主存中,虽然说什么都不用做,但是这个时间是会消耗的。
- 阶段5-写回:会直接从阶段4的锁存器中(阶段3运算得到的结果)数据写回到一个通过寄存器中。
注意:对于运算类执行阶段4是无需做任何事情的,但是时间会同样占用。
②Load指令
注意:在精简指令系统中对于阶段4访存只有Load、Store指令才会生效!
LOAD指令:
Load Rd,996(Rs)
:(996+(RS))->Rd
,在Rs寄存器中的值基础上加上996,接着去写入到Rd主存中。【基址寻址】Load Rd,mem
:(mem)->Rd
举Load Rd,996(Rs)
例子指令执行过程:
- 阶段一-取指:从Cache中取(局部性原理)出指令放入到锁存器。
- 阶段二-译码:对操作数进行译码,接着将基址寄存器值放入到锁存器A,立即数996值放入到imm寄存器。
- 阶段三-执行:会将偏移量以及基址相加得到有效地址EA。
- 阶段四-访存:根据有效地址从data cache(局部性原理)取出数据放入到锁存器。
- 阶段五-写回:最终写回到寄存器(ID阶段中的Registers中)。
③Stroe指令
Store指令:
- 对应源是在左,目标是在右
举Store Rs,996(Rd)
例子指令执行过程:
- 阶段1-3与之前类似。
- 阶段4:先将存的数据写入到data cache中,接着再将该数据同步到主存中。
- 阶段5:空段,会占用时间。
注意:对于阶段五会为空段不执行但是会占用时间。
④条件转移指令
条件转移指令(相对寻址,相对PC偏移):
- bne(branch equal,分支相等)
- 对于(PC)+指令字长:是从下一条指令开始进行偏移。
执行过程:前1-3个阶段同样类似,第4阶段会将目标PC值写回到PC,第五个阶段可以为空段若是第4阶段就写回了。
- wrpc段:其中wr指的就是write,pc就是程序计数器。
⑤无条件转移指令
无条件转移指令:
指令流程:
- 阶段1-访存:从指令cache中取指令到IF段里的锁存器中。
- 阶段2-译码:将相应的偏移量放入到imm寄存器中。
- 阶段3-执行:可将目标PC值直接写回到PC(WrPC段耗时比EX段更短,可安排在EX段完成),越早完成可以避免控制冲突!
- 阶段4-M:空段。
- 阶段5-WB:空段。
注意:也有可能会将WrPC阶段放入到第五阶段,但是这种方式发现控制冲突的时间更晚一些。
实际大题
题目:
题解:
1、首先写出对应指令的表达式。
2、查看指令之间是否有数据相关、结构相关、控制相关。
3、接着根据题目进行分析:①由于指令1、指令2中最终运算结果数据都是指令3中所使用到的操作数,所以对应指令中的执行阶段需要进行阻塞。②由于指令三的IF与ID之间进行了阻塞,此时指令四的IF应该与指令三的ID同一时间发生,否则的话会直接覆写IF也就是指令3中寄存器的值,造成在执行指令三的ID阶段的时候取寄存器数值出现脏读的情况。
七、多处理器的基本概念
7.1、多处理器的基本概念
7.1.1、SISD(单指令流单数据流)
SISD(单指令流单数据流):单指令流指的是这个CPU同一时间段只能处理一个指令序列;单数据流指的是每一条指令只能够处理一到两个数据。
- 例如add指令有两个数据,load指令有一个数据,这也就是解释了单数据流。
- 单核处理器:一个时间段只能够处理一个进程或者一个线程的指令序列,只能并发的执行,不能够并行的执行。
提升效率:引入指令流水线,设置多个功能模块,主存储器采用的是多模块交叉存储器(可以提升读写存储器的效率)。
7.1.2、SIMD(单指令流多数据流)
SIMD(单指令流多数据流):每一时刻只能够执行一条指令,这一条指令一条条执行可以同时处理多个具有相同具有特征的数据。
特征:这类系统擅长处理对结构类似的大量数据进行相同的处理。
实际应用:
- 图像处理对一张图中的数据全部进行点数增加:此时可以将整个图拆分为多块,在给出单一控制信号时,直接将多块放入到多个局部存储器中来进行处理,实现了并行。
- 对数组进行批量操作:可以拆分数组中的多个部分然后同样分配多个存储器惊醒处理。
7.1.3、MISD(多指令流单数据流)
MISD(多指令流单数据流):多条指令并行运行来处理同一数据,这是没有必要的。
7.1.4、MIMD(多指令流多数据流,介绍多处理机系统)
MIMD(多指令流多数据流):多个核可以处理不同的指令流,也可以并行的处理数据流。
- 共享存储多处理器系统原因:共享同一个主存以及共同的一个最低级的cache。
应用:我们大多的手机、电脑、平板都属于这种MIMD系统。
上面描述的是多处理器系统,接下来介绍多处理机系统:
多处理机系统:相对于多处理器系统,有多台主机电脑,该计算机之间不能通过LOAD/STORE指令直接访问对方的存储器,只能通过消息传递来相互传送数据。
7.1.5、向量处理机(SIMD思想进阶应用)
向量处理机(SIMD思想进阶应用):处理对象是向量,在普通的标量处理器中,要完成两个n维向量的相加需要执行n次加法运算,而在向量处理器中,只需要执行一次加法指令就可以,这种处理器也可以实现数据级的并行,对于这种系统,主存需要支持多端口同时读取。
总结回顾
7.2、硬件多线程
7.2.1、介绍支持与不支持硬件多线程处理器
不支持硬件多线程处理器:
包含内容:只有一个指令寄存器,可能有一个或者多个功能部件,包含一个寄存器组,其中只有一个PC程序计数器和一系列的通用寄存器组。
特征:同一时间段内,在这个处理器当中,只可能去运行一段程序,只能处理一个线程,对于线程切换时则需要将当前线程中的通用寄存器值以及PC值全部存储到主存中,接着再切换线程,之后若是将线程切换回来后会恢复相关的临时值从主存读取,对于线程切换具有很大的代价。
支持硬件多线程处理器:
包含内容:两个指令寄存器,多个功能部件,对于寄存器组以及PC对应单独线程都有一组。
特征:对于这种处理器我们就没有上面线程切换的开销,无需在切换线程时将寄存器组中的值保存到主存中,因为本身一个线程就对应有自己单独的寄存器组。
7.2.2、三种硬件多线程实现方式(支持硬件多线程)
7.2.2.1、细粒度多线程
细粒度多线程:细粒度多线程会轮流发射不同线程的指令,在每一个时钟周期中可以发送一个线程的多条指令,可以理解为在一个时钟周期内会把线程A的一两条指令线取进来接着让两条指令并行的运行。
- 为什么一个线程中两条指令可以并行?可能使用到不同的功能部件,左边使用到了左边的功能部件,右边指令使用到了右边功能部件,此时就可以实现同时并行完成了。
切换频率:每一个时钟周期就会切换,这种切换频率十分高,所以称为细粒度多线程。
并行性:指令间并行,线程间不并行。
- 对于同一时刻只有两条指令是并行的,同一时刻是只有一个线程执行!
7.2.2.2、粗粒度多线程
粗粒度多线程:使用连续的几个时钟周期单独的只处理一个线程的多条指令,除非这个线程的指令序列碰到了流水线阻塞。
- 举例cache确实,此时出现阻塞即会发生线程切换,与细粒度的切换频率并不相同。
切换频率:只有流水线阻塞才会切换频率。
- 切换开销是比细粒度的更高的要付出更大代价,对于流水线阻塞情况,需要重载流水线,将流水线的各个部件重新填补。
并行性:指令间并行,线程不并行。
7.2.2.3、同时多线程
同时多线程(SMT):在一个时钟周期中可以发现多个线程的不同指令,例如i时钟周期里发送了线程A的两条指令,同时也发送了线程B的两条指令。
- 对于一个时钟周期可以发送多个线程指令,那么由于本身是支持硬件多线程的处理器,此时本身多条指令就会使用到了不同的功能部件就可以构成指令间并行;此时又有多个线程指令,此时也能够去构成并行!
切换频率:无。
并行性:指令间并行、线程间并行。
总结(三种硬件多线程)
7.3、共享内存多处理器(UMA与NUMA)
UMA(统一存储访问多处理器):多个处理器访问统一的内存空间,具有一些征用的问题。
- 扩展性差原因:速度依赖于总线的速度,多个处理器依赖于总线的速度,若是继续扩展的话,速度会特别慢。
- cache一致性问题:多个CPU会对同一个cache进行读写问题,此时会产生cache一致性问题。
NUMA(非统一存储访问多处理器):对于每一个处理器或者CPU ,会优先分配最接近的内存,此时分成很多块,征用问题比较小。
- 扩展性强:没有多个处理器征用总线的问题。
整理者:长路 时间:2023.6.24-28