重要提示:干!!!内容真多,视频真是反复暂停反复看啊😢,不想看视频的宝子结合图示多读几遍就OK
重点是理解指令、微指令的执行过程,理解各部件的数据传输和作用。理解这一章仅一篇就够😊😊😊
学习中央处理器CPU之前,需要多次温习这张图,以下是指令执行复述过程:
执行第一条取数指令的过程:CPU执行的过程就是在执行一条一条指令的过程,程序计数器PC会指向下一条应该执行的指令,因此每一次要执行一条指令之前,CPU会把PC程序计数器中存放的指令地址传向MAR地址寄存器当中,然后主存会根据MAR所指明的地址取出这次要执行的指令,这条指令会首先被放在MDR当中,接下来又从MDR传到指令寄存器IR当中,经过这四个步骤(1、2、3、4)就完成了取指令的过程。并且每取出一条指令之后,PC都会自动的+1,指向下一条应该执行的指令,而当前执行的这条指令已经被存到指令寄存器IR当中了。接下来,我们会把当前指令的操作码部分会送到CU控制单元当中,而CU可以根据操作码来判断当前这条指令该执行什么样的操作(第一条指令取数),因此接下来在控制单元的协调之下我们会从地址码所指向的地址当中取出相应的数据把它放入ACC累加寄存器当中,具体的做法是把当前这条指令的地址码部分送到MAR地址寄存器当中,接下来根据地址寄存器指明的地址去存储体当中去除相应的数据把它放到MDR当中,再把这个数通过一个数据通路送到ACC当中,经过(6、7、8、9)四个步骤就完成了一条指令的执行。后续指令在取指令(1-4),分析指令5都一样,执行乘法指令区分(MDR)→MQ,(ACC)→X,(MQ)*(X)→ACC,由ALU实现乘法运算,导致(ACC)=6,如果乘积太大,则需要MQ辅助存储,具体运算细则参考笔记
一、CPU的功能和结构
CPU由运算器和控制器两大部件组成,ALU+CU+寄存器+中断系统。
- 指令控制(控制器):完成取指令、分析指令和执行指令的操作,即程序的顺序控制。
- 操作控制(控制器):一条指令的功能往往是由若干操作信号的组合来实现的。CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。
- 时间控制(控制器):对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号。
- 数据加工(运算器):对数据进行算术和逻辑运算。
- 中断处理(CPU时刻检测):对计算机运行过程中出现的异常情况(除法除于0)和特殊请求(可能是鼠标的点击操作)进行处理。中断后执行完时间后继续往后执行。
运算器的基本结构
上图涉及知识点(了解)
通用寄存器和算数逻辑单元ALU之间的连接有两种方式:
- 使用多路选择器MUX,根据控制信号选择一路输出(多对一,eg:C1控制信号00,C2控制信号01)
- 使用三态门,在每个数据通路之间加一个三态门(多对多),正常情况下不导电,如R0为高电平1时数据会输出到A端,否则无法输出。
针对于2的专用数据通路方式:根据指令执行过程中的数据和地址的流动方向安排连接线路,优点是基本不存在数据冲突现象,适用于个别对性能要求较高的部件之间。
针对于CPU内部单总线方式:将所有寄存器的输入输出信号都传输到公共总线上,优点是结构简单,容易实现。
问题一:数据传输会存在冲突现象,性能较低。
解决办法:总线到A端引入了暂存寄存器(但一般情况下,数据是从主存中读取到占存寄存器当中,这样就不会在把数据存回R0时改变R0当中的内容)。
问题二:另一端B端通路没有在ALU之间的运算结果稳定过后才传输内容回数据总线,导致R0回内部总线和运算结果的两条数据发生冲突,结果受影响。
解决办法:在ALU和数据总线之间再加一个暂存寄存器和三态门,当R0输入到总线的运算内容稳定之后,ALU会把结果放入暂存寄存器当中,三态门在ALU输出结果稳定之后导通,也可以把暂存寄存器实现移位、累加功能(也可以单独设计一个累加寄存器存放ALU的运算结果)。
程序状态寄存器PSW:用来记录算数运算结果的各种状态信息,如溢出标志(OP)、符号标志(SF)、零标志(ZF)、进位标志(CF)等。PSW中的这些位参与并决定微操作的形成。
移位器:对运算结果进行移位运算。
计数器:控制乘除运算的操作步数。
控制器的基本结构
控制器主要是用来取指令、分析指令和分析指令,为了记录下一条指令的存放地址所以必须引入程序计数器PC(具有顺序执行,自动加一的功能),取出一条指令过后会放在指令寄存器中IR当中,一条指令分为操作码和地址码(可以很多),地址码指明了操作数的地址,所以地址码的信息需要输入到地址总线上,操作码部分会送到控制单元CU,首先操作码OP会送到指令译码器,根据信号通路传输到微操作信号发生器(输出转输入)决定微操作序列,因为序列有先后顺序所以引入了时序系统用于产生各种时序信号,微操作信号发生器每接收一个节拍信号则会执行下一个微操作所对应的微操作信号,之前还有提到的PSW对应的各种状态信息对应的标志位微操作。现代计算机在CPU中集成MAR,用于存储向主存写入的信息或从主存读取的信息,MDR从外部输入(出)的信号是否有效是MDRinE(MDRoutE),从CPU,输入(出)的信号是否有效是MDRin(MDRout)。注!CPU内部总线是CPU内部各个部件之间进行数据传送的公共通路,外部数据总线指CPU和主存、IO设备进行数据传送的公共通路。
用户是否可以通过汇编语言对CPU内部寄存器的值来区分(棕色:可见,灰色:不可见)
二、指令周期
指令周期:CPU从主存中每取出并执行一条指令所需的全部时间。取指令+分析指令(很短,通常和取指令近似在一个周期)+执行指令==取指阶段+执行阶段
指令周期常常用若干机器周期来表示,机器周期又叫CPU周期。
一个机器周期又包含若干时钟周期(也称为节拍、T周期或CPU时钟周期,它是CPU操作的最基本单位)。注:电脑的主频反映每秒钟可以发出多少个时钟节拍
上图所示,指令不同每个机器周期,时钟周期,执行过程也各不相同,具体看应用场景。
指令执行阶段:取指阶段、间址阶段、执行阶段(执行复杂,暂不研究)、中断阶段
- 当前指令地址送至存储器地址寄存器,记做:(PC) → MAR
- CU发出控制信号,经控制总线传到主存,这里是读信号,记做:1 → R
- 将MAR所指主存中的内容经数据总线送入MDR,记做:M(MAR) → MDR
- 将MDR中的内容(此时是指令)送入IR,记做:(MDR) → IR
- CU发出控制信号,形成下一条指令地址,记做:(PC)+1 → PC
将指令的地址码送入MAR,记做:Ad(IR) → MAR或Ad(MDR) → MAR
CU发出控制信号,启动主存做读操作,记做:1 → R
将MAR所指主存中的内容经数据总线送入MDR,记做:M(MAR) → MDR
将有效地址送至指令的地址码字段,记做:(MDR)→ Ad(IR)
中断:暂停当前任务去完成其他任务。为了能够恢复当前任务,需要保存断点。一般使用堆栈来保存断点,这里用SP表示栈顶地址,假设SP指向栈顶元素,进栈操作是先修改指针,后存入数据。
- CU控制将SP减1,修改后的地址送入MAR记做:(SP)-1→SP,(SP)→MAR本质上是将断点存入某个存储单元,假设其地址为a,故可记做:a→MAR
- CU发出控制信号,启动主存做写操作,记做:1→W
- 将断点(PC内容)送入MDR,记做:(PC) MDR
- CU控制将中断服务程序的入口地址(由向量地址形成部件产生)送入PC,记做:向量地址→PC
而针对于指令的指令周期不同,按照依次执行的步骤明确了以下指令执行方案:
- 单指令周期:所有指令执行时间相同(按最长的来)串行执行,缺点明显
- 多指令周期:选择性执行,更复杂的设计不同指令对应的不同数目的时钟周期
- 流水线方案:并行思路,每一个时钟周期尽量多的多条指令运行,步骤不同,指令并行
三、指令周期的数据流
数据流动大致上分为三类:寄存器与寄存器之间,寄存器与主存之间,寄存器与ALU之间的数据流动
CPU数据通路分为CPU内部总线(单总线和多总线结构)和专用数据通路(用多路选择器和三态门来进行控制)
基本思路:利用题目所给的数据通路进行数据传送,由CU发出控制信号实现通路建立
CU控制单元发出不同的信号控制每一步的微操作(注!每一个微操作的执行需要消耗一个时钟周期)一组一组的完成
1、寄存器之间数据传送比如把PC内容送至MAR,实现传送操作的流程及控制信号为:
(PC)→Bus PCout有效,PC内容送总线
Bus→MAR MARin有效,总线内容送MAR
2、主存与CPU之间的数据传送
比如CPU从主存读取指令,实现传送操作的流程及控制信号为:
(PC)→Bus→MAR PCout和MARin有效,现行指令地址→MAR
1→R CU发读命令(通过控制总线发出,图中未画出)
MEM(MAR)→MDR MDRin有效
MDR→Bus→IR MDRout和IRin有效,现行指令→IR3、执行算术或逻辑运算
比如一条加法指令,微操作序列及控制信号为:
Ad(IR)→Bus→MAR MDRout和MARin有效
1→R CU发读命令
MEM(MAR)→数据线→MDR MDRin有效
MDR→Bus→Y MDRout和Yin有效,操作数→Y
(ACC)+(Y)→Z ACCout和ALUin有效,CU向ALU发送加命令
Z→ACC Zout和ACCin有效,结果→ACC
以下为单总线例题附解题答案:
以下为专用通路例题附解题答案:
下图是一个简化了的CPU与主存连接结构示意图(图中省略了所有的多路选择器)。其中有一个累加寄存器(ACC)、一个状态数据寄存器和其他4个寄存器:主存地址寄存器(MAR)、主存数据寄存器(MDR)、程序寄存器(PC)和指令寄存器(IR),各部件及其之间的连线表示数据通路,箭头表示信息传递方向。
要求:
(1)请写出图中a、b、c、d 4个寄存器的名称。
(2)简述图中取指令的数据通路。
(3)简述数据在运算器和主存之间进行存/取访问
(4)简述完成指令LDAX的数据通路(X为主存地址
(5)简述完成指令ADDY的数据通路(Y为主存地址
(6)简述完成指令STAZ的数据通路(Z为主存地址
解答:
(1)→+1对应PC,多一d是PC;b和微操作信号发生器连接不经过主存所以是IR;PC地址内容送向c(MAR);另一个和主存连接的是a(MDR)
(2)取指令数据通路:(PC)→MDR;M(MAR)→MDR;(MDR)→IR
(3)存/取的数据放到ACC中,首先假设数据地址已经存放在MAR中,取:M(MAR)→MDR (MDR)→ALU→ACC ,存:(ACC)→MDR (MDR)→M(MAR)
(4)X首先作为数据地址送到MAR当中,MAR所指明的地址取出这次要执行的指令地址放入MDR当中,MDR取出的数据(MDR)再传入ALU再到ACC。LDAX数据通路表示:X→MAR M(MAR)→MDR (MDR)→ALU→ACC
(5)同4取出(MDR)→ALU (ACC)→ALU取数放入ALU中运算,结果重新放回ACC。ADDY的数据通路表示:Y→MAR M(MAR) → MDR
(MDR)→ALU, (ACC) → ALU ALU → ACC
(6)STAZ的数据通路表示:Z → MAR (ACC) → MDR (MDR) → M(MAR)
四、硬布线控制器
指令周期知识点回顾:
- FE-The Fetch Cycles 取指周期
- IND-The Indirect Cycles 间址周期
- EX-The Execute Cycles 执行周期
- INT-The Interrupt Cycles 中断周期
CU每发出的一个微指令都会完成一个与之对应的微操作。之前还说过的专用数据通路结构,在该结构下各个寄存器之间都有专用的数据通路连线,可以让多个寄存器之间的数据同时并行的流动,一个机器周期有若干个时钟节拍组成,一个节拍中可以完成一些互相不冲突的微操作。上图所示为定长的机器周期,若实际节拍数较少例如执行中断两个,可以将改微操作安排在机器周期末尾的节拍上进行。
控制单元CU需要根据以下信息确定当前节拍下应该发出哪些微指令
指令操作码:取自指令寄存器IR→送给操作码译码器2的n次方种二进制状态,其对应的0–2^n-1种对应的高电平输入信号有效判断是哪一条指令
目前的机器周期:需要接入FE、IND、EX、INT四个触发器,根据其二进制信息哪个触发器的值为1判断当前除于哪个机器周期,集成于CU内部
节拍信号:机器主频→节拍发生器,每个时钟周期发出一个节拍信号(循环发出)每个线路在T几输入一个高电平,根据这些线判断是除于第几个节拍(Tm后继续从T1开始)
机器状态条件:PSW、ACC正负性、IO设备等反馈给CU判断
AI问题解答:要让C1对应微操作(PC)→MAR,则将其接到PCout、MARin即可 其中C1这条线可以理解是多种输出情况下的某一条,某一个情况,且是固定的吗?
是的,您的理解基本正确。在计算机组成原理中,控制单元(Control Unit, CU)会根据指令操作码生成相应的控制信号。这里C1可以理解为CU输出的一系列微操作控制信号中的某一条。当我们要执行“取指”操作时,即把程序计数器PC的内容送入存储器地址寄存器MAR,这时就需要控制信号C1来实现这一功能。具体做法就是当C1有效(一般为高电平或脉冲)时,将PCout(即程序计数器的输出)连接到MARin(即存储器地址寄存器的输入),这样就能完成PC→MAR的数据传输。所以,C1这条线的确可以理解为在多种输出情况下的某一种特定的、固定的控制信号。
哇靠!如果要在T0节拍下完成取指指令(PC)→MAR,则需在CU内部设计指令为C1=FE·T0对应的电路是与门左边输入FE和T0的高电平信号,右侧输出对应的微操作C1(逻辑表达式就是一种电路的数学化描述)
硬布线控制器的设计步骤(以下了解,不做重点):
-
分析每个阶段的微操作序列(取指、间址、执行、中断四个阶段)确定哪些指令在什么阶段、在什么条件下会使用到的微操作
- 取指周期:PC→MAR 1→R M ( MAR ) → MDR MDR → IR OP(IR)→ID (PC)+1→PC
- 间址周期:Ad(IR) → MAR 1→R M ( MAR ) → MDR MDR→Ad(IR)
- 执行周期:【CLA=clear ACC指令 ACC清零 0→AC】【LDA X 取数指令,把X所指内容取到ACC Ad ( IR ) → MAR 1→R M ( MAR ) → MDR MDR → AC】【JMP X 无条件转移 Ad ( IR ) → PC】【BAN X Branch ACC Negative条件转移,当ACC为负时转移 Ao•Ad ( IR ) + Ao●(PC) → PC】
-
选择CPU的控制方式(采用定长还是不定长机器周期,每个机器周期安排几个节拍)设计定长3个节拍
-
安排微操作时序(如何用指定的如3个节拍完成所有微操作)
- 原则一:微操作的先后顺序不得随意更改
- 原则二:被控对象不同的微操作,尽量安排在一个节拍内完成
- 原则三:占用时间较短的微操作,尽量安排在一个节拍内完成,并允许有先后顺序
-
电路设计(确定微操作逻辑表达式,并用电路设计)复杂!复杂!复杂!
- 列出操作时间表
- 写出微操作命令的最简表达式
- 画出逻辑图
硬布线控制器(纯硬件思想==头秃)的特点:
缺点:指令越多,设计和实现就越复杂,因此一般用于RISC(精简指令集系统)
如果扩充一条新的指令,则控制器的设计就需要大改,因此扩充指令较困难。
优点:由于使用纯硬件实现控制,因此执行速度很快。微操作控制信号由组合逻辑电路即时产生。
五、微程序控制器
微命令:强调计算机为了完成这个微操作需要发出哪一个控制信号
微操作:强调计算机要做什么,和微命令一一对应
微指令:强调可能包含多个微命令,并行执行多个微操作,是对指令执行步骤的描述
微程序:对应多个微指令的序列组成
指令:和微程序一一对应,是对程序执行步骤的描述
微指令的基本格式=操作控制+顺序控制
微程序控制器设计思路:采用“存储程序”的思想,CPU出厂前将所有指令的“微程序”存入“控制器存储器”中
微程序控制器结构组成和部件设计如上图所示:
- CM:控制存储器,只读存储器ROM构成(读取速度更快,且断电非易失),存放各指令对应的微程序序列
- CMAR:别名:μPC,控存地址寄存器。接收微地址形成部件送来的微地址。外接地址译码器将地址码转化为存储单元控制信号去CM中取
- CMDR:别名:μIR,微指令寄存器。用于存放从CM中取出的微指令
- 微地址形成部件:产生初始微地址和后继微地址,以保证微指令的连续执行。需要根据当前指令的OP操作码来确定当前微指令序列的执行开始位置
- 顺序逻辑电路:用于控制微指令执行序列的顺序的,可以根据中断标志调整顺序
- 地址译码:将地址码转化为存储单元控制信号
上述结构对比CPU内部取指令分析
PC指令→MAR地址寄存器→指令译码器转为控制信号→主存中取→MDR数据寄存器→再把指令信息送给指令寄存器IR
⭐⭐取到一条指令后的执行过程⭐⭐:首先把指令的操作码送给微地址形成部件用来确定这条指令用来执行的微指令序列执行的起始地址,接下来再根据顺序逻辑的标志来确定接下来这条指令要执行的存放地址,把微指令地址放在CMAR当中,经过地址译码器的译码之后选中CMAR所指向CM当中的那条微指令,然后取出这条微指令放到CMDR当中,由于上面说明一条微指令包含两部分信息(微指令控制信号和接下来要执行的微指令的地址),执行完这条微指令之后,把下地址信息送给顺序逻辑,然后顺序逻辑再结合一些中断信息再来决定下一条执行的微指令信息的存放地址送给CMAR,同时CMDR的控制信号要送至CPU内部和系统总线的控制信号。
所有指令的取指周期、间址周期、中断周期所对应的微指令序列都一样,是否可以共享使用?
重点需要指令地址码的寻址特征结合微地址形成部件判断是否需要进行间址周期送给顺序逻辑,同理中断信号也要判断是否进入中断周期
六、微指令的设计
了解微指令的设计需要先了解一些概念性的东西,首先探讨微指令的第一部分操作控制信号
相容性微命令:可以并行完成的微命令。
互斥性微命令:不允许并行完成的微命令。
-
水平型微指条:微指令能定义多个可并行的微命令,
胖胖的
指令的条数会比较少,每一条微指令也比较短优点:微程序短,执行速度快
缺点:微指令长,编写微程序较麻烦 -
垂直型微指令:一条微指令只能定义一个微命令,由微操作码字段规定具体功能,
瘦高的
和水平型相反优点:微指令短、简单、规整,便于编写微程序;
缺点:微程序长,执行速度慢,工作效率低。 -
混合型微指令:在垂直型的基础上增加一些不太复杂的并行操作。微指令较短,仍便于编写;微程序也不长,执行速度加快。
⭐⭐⭐以下重点探讨水平型微指令如何用一些二进制的bit信息来表示一系列控制信号(微指令的编码方式)⭐⭐⭐
-
直接编码(直接控制)方式
在微指令的操作控制字段中,每一位代表一个微操作命令(例如让(PC)→ MAR为第一位,1→R为第二位,需要完成这两部微操作,则把这两位写为1其余为0,把这个放入CMDR中进行连线,对应的连线接受高电平信号),某位为"1"表示该控制信号有效
优点:简单、直观,执行速度快,操作并行性好。
缺点:微指令字长过长,n个微命令就要求微指令的操作字段有n位,造成控存容量极大(金钱成本提高,CPU体积也会越大)。 -
将微指令的控制字段分成若干"段",每段经译码后发出控制信号
微命令字段分段的原则:
- 互斥性微命令分在同一段内,相容性微命令分在不同段内
- 每个小段中包含的信息位不能太多,否则将增加译码线路的复杂性和译码时间
- 一般每个小段还要留出一个状态,表示本字段不发出任何微命令。因此,当某字段的长度为3位时,最多只能表示7个互斥的微命令,通常用000表示不操作
例题:某计算机的控制器采用微程序控制方式,微指令中的操作控制字段采用字段直接编码法,共有33个微命令,构成5个互斥类,分别包含7、3、12、5和6个微命令,则操作控制字段至少有多少位?
解答:第1个互斥类有7个微命令,要留出1个状态表示不操作所以需要表示8种不同的状态,故需要3个二进制位。以此类推,后面4个互斥类各需要表示4、13、6、7种不同的状态,分别对应2、4、3、3个二进制位。故操作控制字段的总位数为3+2+4+3+3 = 15 位,若采用直接编码方式,则控制字段需要33位 -
字段间接编码方式
在第二种方式上再加上几层译码进行寻址解释,并不直接输出控制信号,优点是缩短了微指令字长,相应的并行控制能力也降低了。
接下来探讨微指令的第二部分下地址
- 微指令的下地址字段直接指出,断定方式
- 根据机器指令的操作码形成,由操作码经微地址形成部件指出下一步操作的地址
- 增量计数器法(CMAR)+1–CMAR
- 分支转移 转移方式:指明判别条件;转移地址:指明转移成功后后的去向。例如JMP
- 通过测试网络,内部测试电路决定(了解即可)
- 由硬件产生微程序入口地址
例题:某计算机采用微程序控制器,共有32条指令,公共的取指令微程序包含2条微指令,各指令对应的微程序平均由4条微指令组成,采用断定法(下地址字段法)确定下条微指令地址,则微指令中下地址字段的位数至少是多少位?
解答:总共需要存储多少条微指令? 32X4+2=130条
标注出130个不同的位置至少需要多少个二进制位? 2^7 = 128,2^8 = 256 则下地址字段的位数至少是8位
七、微程序控制单元的设计
设计步骤:
- 分析每个阶段的微操作序列
- 写出对应机器指令的微操作命令及节拍安排
(1) 写出每个周期所需要的微操作(参照硬布线)
(2)补充微程序控制器特有的微操作:
a. 取指周期:
Ad ( CMDR ) →CMAR
OP ( IR ) →CMAR
b. 执行周期:
Ad(CMDR)→CMAR - 确定微指令格式
根据微操作个数决定采用何种编码方式,以确定微指令的操作控制字段的位数。
根据CM中存储的微指令总数,确定微指令的顺序控制字段的位数。
最后按操作控制字段位数和顺序控制字段位数就可确定微指令字长。 - 编写微指令码点
根据操作控制字段每一位代表的微操作命令,编写每一条微指令的码点。
静态微程序设计和动态微程序设计(了解即可)
静态:微程序无需改变,采用ROM
动态:通过改变微指令和微程序改变机器指令有利于仿真,采用EPROM
类别/对比项目 | 微程序控制器 | 硬布线控制器 |
---|---|---|
工作原理 | 微操作控制信号以微程序的形式存放在控制存储器中,执行指令时读出即可 | 微操作控制信号由组合逻辑电路根据当前的指令码、状态和时序,即时产生 |
执行速度 | 慢 | 快 |
规整性 | 较规整 | 烦琐、不规整 |
应用场合 | CISC CPU | RISC CPU |
易扩充性 | 易扩充修改 | 困难 |
八、指令流水线
因为多条指令在执行的不同阶段所使用到的硬件资源不一样所以引入指令流水线。
通常使用指令流程图和时空图来显示执行过程
设取指、分析、执行3个阶段的时间都相等,用t表示,按以下几种执行方式分析n条指令的执行时间(理想情况:各阶段花费时间相同,
每个阶段结束后能立即进入下一阶段):
认识几个概念:
-
吞吐率:单位时间内可以完成多少条指令。
设任务数为n;处理完成n个任务所用的时间为Tk;流水线吞吐率(TP)= n/(Tk) = n/(k+n-1) Dt
-
加速比:完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比,也可以理解为速度增加了几倍。
设To表示不使用流水线时的执行时间,即顺序执行所用的时间1:7表示使用流水线时的执行时间流水线加速比(S)= T0/Tk = knΔt/(k+n-1)Δt = kn/k+n-1
-
效率:流水线的设备利用率称为流水线的效率。在时空图上(时空区面积之比),流水线的效率定义为完成n个任务占用的时空区有效放面积与n个任务所用的时间与k个流水段所围成的时空区总面积之比
流水线效率(E)= n个任务占用时空区有效面积/n个任务所用的时间与个流水段所围成的时空区总面积 = T0/kTk
指令流水线影响因素:以下采用经典RISC五段式架构
- 结构相关(资源冲突)问题
原因:由于多条指令在同一时刻争用同一资源而形成的冲突称为结构相关。同操作系统互斥问题
解决办法:1.后一相关指令暂停一周期,后一个人等前一个人用完;2.资源重复配置,资源不够再增加一个资源
- 数据相关(数据冲突)问题
AI问答:在计算机CPU中编译器如何发现两条指令会有数据冲突?
在计算机CPU中,编译器并不直接处理指令级别的数据冲突,这是处理器硬件流水线设计和指令调度机制需要解决的问题。然而,现代编译器可以通过静态分析和指令调度技术来预测和避免潜在的数据冲突。
数据冲突通常包括以下几种类型:
- 读-写(RAW)冲突:一条指令(Reader)依赖于另一条指令(Writer)的结果,而这两条指令在顺序执行时可能会导致Reader尝试访问尚未写入的数据。
- 写-读(WAR)冲突:一条指令试图读取的数据正在被另一条指令修改。
- 写-写(WAW)冲突:两条或多条指令同时写入同一内存位置。
原因:数据相关指在一个程序中,存在必须等前一条指令执行完才能执行后一条指令的情况。同操作系统同步问题
解决办法:1.对无硬件流水线支持的处理器,编译器可以在生成代码时插入必要的“气泡bubble”或“空操作NOP”来延迟某些指令的执行,直到相关数据可用;2.数据旁路技术,硬件支持,单独开出一条数据通路传输冲突的数据;3.指令调度,编译器对指令重排
- 控制相关(控制冲突)问题
AI问答:在计算机CPU中编译器在指令流水线如何发现和解决控制相关(控制冲突)问题?
对于控制相关的完全解决,特别是转移指令所引起的程序计数器PC值的变化导致的流水线冲刷问题,主要依靠的是CPU硬件的设计,包括高效的分支预测器、分支目标缓冲区等机制。编译器只能从源头上提供辅助,而无法从根本上消除控制相关性。
原因:程序执行流的改变,如转移指令JMP和其他改变PC值的指令而造成断流时,会引起控制相关。
解决办法:1.尽早判别转移是否发生,尽早生成转移目标地址;2.预取转移成功和不成功两个控制流方向上的目标指令;3.加快和提前形成条件码;4.提高转移方向的猜准率
以下是一些指令流水线分类和多发技术(了解并在题目中识别)
按使用级别分类:
- 部件功能级流水线:内部复杂处理单元中,如浮点运算,细分为多个独立部件控制的子阶段,并行处理
- 处理机级流水线:单个CPU中,将一条指令的执行过程划分为多个子过程
- 处理机间流水线:宏流水,其中每一个处理机完成某一专门任务,各个处理机所得结果存放在与下一个处理机所共享的存储器中
按完成功能分类:
- 单功能流水线:实现一种固定的专门功能的流水线
- 多功能流水线:通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线
按连接方式分类:
- 静态流水线:同一时间内,流水线的各段只能按同一种功能的连接方式工作
- 动态流水线:同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算
按有无反馈信号分类:
- 线性流水线:从输入到输出,每个功能段只允许经过一次,不存在反馈回路
- 非线性流水线:从输入到输出过程中,某些功能段将数次通过流水线,存在反馈回路
指令流水线多发技术:
- 超标量流水线技术:每个时钟周期内可并发多条独立指令
- 超流水线技术:在一个时钟周期内再分段(3 段)
- 超长指令字技术:由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条
在经典的五段式指令流水线当中,为了方便流水线的设计,以最长耗时为准,各个阶段取值一样。流水线的每一步功能部件后面都要有一个缓冲寄存器(锁存器),作用是保存本流水段的执行结果,提供给下一流水段使用。
五段:①IF取指→②ID译码&取数→③EX执行→④M访存→⑤WB写回寄存器
参考博客:啦啦右一
参考课件:王道考研-408计算机组成原理