计算机组成原理 第五章 中央处理器
🚥计算机组成原理 系列文章导航🚥
一、CPU 的功能和基本结构
CPU 的功能:
-
指令控制:完成取指令、分析指令和执行指令的操作,即程序的顺序控制。
-
操作控制:产生完成一条指令所需的操作信号,把各种操作信号送到相应的部件,从而控制这些部件按指令的要求正确执行。
-
时间控制:严格控制各种操作信号的出现时间、持续时间及出现的时间顺序。
-
数据加工:对数据进行算术和逻辑运算。
-
中断处理:对运行过程中出现的异常情况和终端请求进行处理。
CPU 的基本结构:包括运算器和控制器两大部分
运算器:对数据进行加工。
-
算术逻辑单元:主要功能是进行算术/逻辑运算。
-
通用寄存器组:如 AX、BX、CX、DX、SP 等,用于存放操作数和各种地址信息等。SP 是堆栈指针,用于指示栈顶的地址。
-
暂存器:用于暂存从主存读来的数据,这个数据不能存放在通用寄存器中,否则会破坏其原有内容。
-
累加寄存器:它是一个通用寄存器,用于暂时存放 ALU 运算的结果信息,用于实现加法运算。
-
程序状态字寄存器:PSW 中这些标志位参与并决定微操作的形成。
-
移位器:对运算结果进行移位运算。
-
计数器:控制乘除运算的操作步数。
控制器:协调并控制计算机各部件执行程序的指令序列,基本功能包括取指令、分析指令、执行指令。 每条指令的执行是由控制器发出的一组微操作实现的。
-
程序计数器:用于指出下一条指令在主存中的存放地址。CPU 根据 PC 的内容去主存中取指令。因为程序指令中指令通常是顺序执行的,所以 PC 有自增功能
-
指令寄存器:用于保存当前正在执行的那条指令。
-
指令译码器:仅对操作字段进行译码,向控制器提供特点的操作信号。
-
微操作信号发生器:根据 IR 的内容(指令)、PSW 的内容(状态信息)及时序信号,产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种。
-
时序系统:用于产生各种时序信号,它们都是由统一时钟(CLOCK)分频得到。
-
存储器地址寄存器:用与存放所要访问的主存单元的地址。
-
存储器数据寄存器:用于存放向主存写入的信息或从主存中读出的信息。
下图为 CPU 内部单总线方式下的结构,其中,橙色标注的为用户可见的寄存器,灰色标注的为用户不可见的寄存器。

二、指令执行过程
1.指令周期
指令周期:CPU 从主存中每取出并执行一条指令所需的全部时间。取值阶段完成取指令和分析指令的操作,也称取指周期;执行阶段完成执行指令的操作,也称执行周期。
指令周期常常用若干机器周期来表示,机器周期又叫 CPU 周期。
一个机器周期又包括若干时钟周期(也称为节拍、T 周期或 CPU 时钟周期,是 CPU 操作的最基本单位)。

每个指令周期内机器周期数可以不等,每个机器周期内的节拍数也可以不等。
四个工作周期都有 CPU 访存操作,只是访存的目的不同。取指周期是为了取指令,间址周期是为了取有效地址,执行周期是为了取操作数(当指令为访存指令时),中断周期是为了保存程序断点。
注意:早期计算机通常采用机器周期、节拍和脉冲三级时序系统,一个指令可分为取指令、取操作数、执行、中断响应等工作周期,称为机器周期。现在的计算机已不再采用上述三级时序系统,机器周期的概念已逐渐消失,CPU 内部的定时信号就是时钟,一个时钟周期就是一个节拍。
2.指令周期的数据流
为了区分 CPU 的四个周期,在 CPU 内部可设置 4 个标志触发器(一般集成在 CU 内部),如下图:

图中的 FE(Fetch Execution)、IND(Indirect Addressing)、EX(Execute)、INT(Interrupt) 分别对应取指、间址、执行、中断四个周期,并用 1 表示有效。
(1)取指周期
取指周期的任务是根据 PC 的内容从主存储器中取出指令代码并存放在 IR 中:
(2)间址周期
间址周期的任务是取操作数的有效地址,需要先判断有没有间址周期,下面以一次间址为例:
间址周期的第一步中,IR 和 MDR 两者的内容是一样的,都可以提供指令字的地址字段。
间址周期的最后,将有效地址存放到 MDR 中,但也有的 CPU 会再将有效地址送到指令的地址码字段,记作:(MDR)->Ad(IR)。
(3)执行周期
执行周期的任务是取操作数,并根据 IR 中的指令字的操作码通过 ALU 操作产生执行结构。但不同指令的执行周期操作不同,没有统一数据流向。
(4)中断周期
中断周期的任务是处理中断请求,假设程序断点存入堆栈中,并用 SP 指示栈顶地址,而且进栈操作是先修改栈顶指针,后存入数据:
3.指令执行方案
(1)单周期处理器
单周期处理器对所有指令都选用相同的执行时间来完成。每条指令都在一个时钟周期内完成(CPI = 1),指令之间串行执行;指令周期取决于执行时间最长的指令的执行时间。
对于那些本来可以在更短时间内完成的指令,仍要在这个较长的周期内完成,会降低整个系统的运行速度。
(2)多周期处理器
多周期处理器对不同类型的指令选用不同的执行步骤,指令需要几个周期就为其分配几个周期,因此可选用不同个数的时钟周期来完成不同指令的执行过程(CPI > 1),不再要求所有指令占用相同的执行时间。多指令周期方案中指令之间仍是串行执行的。
(3)流水线处理器
流水线处理器采用指令直接并行执行的方案,力争在每个时钟周期完成一条指令的执行过程(只能在理想情况下才能达到,此时 CPI = 1)。这种方案通过在每个时钟周期内启动一条指令,尽量让多条指令同时运行,但各自出在不同的执行步骤中(因为指令在不同步骤中要用到的硬件会有所不同)。
三、数据通路的功能和基本结构
1.数据通路的功能和组成
CPU 可以视为由数据通路和控制部件两大部分组成。数据在指令执行过程中所经过的路径,包括路径上的部件,称为数据通路。数据通路由控制部件控制,控制部件根据每条指令功能的不同,生成对数据通路的控制信号。
组成数据通路的原件主要分为组合逻辑元件和时序逻辑元件两类:
-
组合逻辑元件(操作元件):任何适合产生的输出仅取决于当前的输入。不含存储信号的记忆单元,也不受时钟信号的控制,输入输出之间无反馈通路,数据是单向传输的。常用的有加法器、算术逻辑单元(ALU)、译码器、多路选择器、三态门等。
-
时序逻辑元件(状态元件):任何时候的输出不仅与该时刻的输入有关,还与该时刻以前的输入有关,因此时序电路必然包含存储信号的记忆单元。此外还必须在时钟节拍下工作。各类寄存器和存储器都属于时序逻辑单元。
2.数据通路的基本结构
(1)CPU 内部单总线方式
将 ALU 及所有寄存器都连接到一条内部总线上,称为单总线结构的数据通路。这种结构比较简单,但数据传输存在较多的冲突现象,性能较低。
区分内部总线与系统总线:
-
内部总线:是指同一台计算机系统的各部件,如 CPU、内存、寄存器及运算部件之间的总线。
-
系统总线:是指同一台计算机系统的各部件,如 CPU、内存、通道和各类 I/O 接口间互相连接的总线。
注意:单周期处理器(CPI = 1)不能采用单总线方式,因为单总线将所有寄存器都连接到一条公共总线上,一个时钟周期内只允许一次操作,无法完成一条指令的全部操作。
(2)CPU 内部多总线方式
CPU 内部有两条或更多的总线时,构成双总线结构或多总线结构。采用多总线结构可以同时在多个总线上传送不同的数据,提升效率。
(3)专用数据通路方式
根据指令执行过程中的数据和地址的流动方向安排连接线路(只要两个寄存器之间需要有数据流动,就专门建立一个连线)。性能高,基本不存在数据冲突,但结构复杂、硬件量大,不易实现。
此外,如果直接用导线连接,会导致多个寄存器同时并且一直传输数据。
-
解决方式 1:使用多路选择器根据控制信号选择一路输出。
-
解决方法 2:使用三态门控制每一路是否输出。
3.数据通路的操作举例
总线是一组共享的传输信号线,它不能存储信息,在任一时刻也只能有一个部件把信息送到总线上。下面以单总线数据通路为例介绍常见操作的流程及控制信号:

单总线结构下 ALU 中设置暂存器的原因:
单总线数据通路中,每一时刻总线上只有一个数据有效。因为 ALU 是一个没有存储功能的组合逻辑元件,在其执行运算时必须保持两个输入端同时有效,所以先将一个操作数经内部总线送入暂存器 Y 保存。Y 的内容在 ALU 的左输入端始终有效,再将另一个操作数经内部总线直接送到 ALU 的右端。ALU 输出端也不能直接与总线相连,否则其输出会通过总线反馈到输入端,影响运算结果,因此将运算结果暂存在寄存器 Z 中。
(1)通用寄存器之间传送数据
以 PC 为例,将 PC 的内容送至 MAR:
微操作 | 控制信号 |
---|---|
(PC) -> MAR | PCout 和 MARin 有效,PC 内容 -> MAR |
(2)从主存读取数据
以 CPU 从主存中取指令为例:
微操作 | 控制信号 |
---|---|
(PC) -> MAR | PCout 和 MARin 有效,现行指令地址 -> MAR |
MEM(MAR) ->MDR, (PC) + 1 -> PC | MDRinE 有效,CU 发出读命令,取出指令后 PC + 1 |
(MDR) -> IR | MDRout 和 IRin 有效,现行指令 -> IR |
(3)将数据写入主存
以将寄存器 R1 的内容写入寄存器 R2 所指的主存单元为例:
微操作 | 控制信号 |
---|---|
(R1) -> MDR | R1out 和 MDRin 有效 |
(R2) -> MAR | R2out 和 MARin有效 |
MDR -> MEM(MAR) | MDRoutE 有效,CU 发出写命令 |
(4)执行算术或逻辑运算
以加法指令 ADD ACC,R 为例:
微操作 | 控制信号 |
---|---|
(R1) -> Y | R1out 和 Yin 有效,操作数 -> Y |
(ACC) + (Y) -> Z | ACCout 和 ALUin 有效,CU 向 ALU 发出加命令,结果 -> Z |
(Z) -> ACC | Zout 和 ACCin 有效,结果 -> ACC |
以上三步不能同时执行,否则会引起总线冲突,因此该操作需要三个时钟周期。
(5)修改程序计数器的值
以 JMP addr(addr 为目标转移地址)实现将 IR 中的地址字段写入 PC,完成该操作的流程及控制信号为例:
微操作 | 控制信号 |
---|---|
Ad(IR) -> PC | IRout 和 PCin 有效 |
四、控制器的功能和工作原理
根据控制器产生微操作控制信号的方式的不同,控制器可分为硬布线控制器和微程序控制器。
1.硬布线控制器
硬布线控制器:由复杂的组合逻辑门电路和触发器构成,也称组合逻辑控制器。
根据指令操作码、目前的机器周期、节拍信号、机器状态条件,即可确定现在这个节拍下应该发出哪些微命令。
设计步骤:
-
分析每个阶段的微操作序列(取指、间址、执行、中断四个阶段)。
-
选择 CPU 的控制方式(采用定长机器周期还是不定长机器周期,每个机器周期安排几个节拍)。
-
安排微操作时序(如何在有限的节拍内完成整个机器周期内的所有微操作)。
-
电路设计(确定每个微操作命令的逻辑表达式并用电路实现)。
安排微操作时序的原则:
-
原则一:微操作的先和顺序不得随意更改。
-
原则二:被控对象不同的微操作尽量安排在一个节拍内完成。
-
原则三:占用时间较短的微操作尽量安排在一个节拍内完成,并允许有先后顺序。
注意:从主存取数据,用时较长,因此必须一个时钟周期才能保证微操作的完成;CPU 内部寄存器之间的数据传送,速度很快,因此在一个时钟周期内可以紧接着完成。
硬布线控制器的特点:指令越多,设计和实现就越复杂,因此一般用于 RISC,如果扩充一条新的指令,则控制器的设计就需要大改,因此扩充指令较困难。由于使用纯硬件实现控制,因此执行速度很快。微操作控制信号由组合逻辑电路即时产生。
2.微程序控制器
(1)微程序控制的基本概念
微程序控制器:采用存储逻辑实现,将微操作信号代码化,使每条机器指令转化成为一段微程序并存入一个专门的存储器(控制存储器)中,微操作控制信号由微指令产生。
微程序控制器的设计采用存储程序的思想,CPU 出厂前将所有指令的微程序存入控制器存储器中。
-
程序:由指令序列组成。
-
微程序:由微指令序列组成,每一种指令对应一个微程序。
-
指令:对程序执行步骤的描述。
-
微指令:对指令执行步骤的描述。
-
微命令:在微程序控制的计算机中,控制部件向执行部件发出的各种控制命令称为微命令,是构成控制序列的最小单元。
-
微操作:执行部件收到微命令后所进行的操作称为微操作。
微程序和指令是一一对应的,微命令和微操作是一一对应的。
注意:硬布线控制器中也有微命令与微操作的概念,并非微程序控制器的专有概念。
(2)微程序控制器的组成与结构
微周期:从控制存储器中取出并执行一条微指令所需的全部时间,通常为一个时钟周期。
微指令是若干微命令的集合,一条微指令通常包含两大部分信息:
-
操作控制字段:也称微操作码字段,用于产生某一步操作所需的各种操作控制信号。
-
顺序控制字段:也称微地址码字段,用于控制产生下一条要执行的微指令地址。
寄存器的区分:
-
地址寄存器(MAR):存放主存的读/写地址。
-
微指令地址寄存器(uPC 或 CMAR):存放待执行的微指令在控制存储器中的微地址。
-
指令寄存器(IR):存放从主存中读出的指令。
-
微指令寄存器(uIR 或 CMDR):存放从控制存储器中读出的微指令。
(3)微程序控制器的工作原理
取指周期的微指令序列固定从 #0 开始存放,执行周期的微指令序列的存放根据指令操作码确定。
每执行完一条微指令,会根据微指令上的微地址码字段去执行下一条微指令。但还会结合指令地址码的寻址特征判断是否跳过间址周期、结合中断信号判断是否进入中断周期。
注意 1:所有指令的取指周期、间址周期、中断周期所对应的微指令序列通常是公用的,执行周期的微指令序列各不相同。故如果某指令系统中有 n 条机器指令,则 CM 中微程序(段)的个数至少是 n + 1 个。
注意 2:物理上,取指周期、执行周期看起来像是两个微程序,但逻辑上应该把它们看作一个整体。因此,一条指令对应一个微程序的说法是正确的(出题老头左右脑互搏魅力时刻)。
3.微指令的设计
微命令与微操作一一对应,一个微命令对应一根输出线。有的微命令可以并行执行,因此一条微指令可以包含多个微命令。
微命令有相容性和互斥性之分,相容性微命令是指可以同时出现、共同完成某一些微操作的命令,互斥性微命令是指在机器中不允许同时出现的微命令。
(1)微指令的格式
水平型微指令:一条微指令能够定义多个可并行的微程序。
优点:微程序短,执行速度快。
缺点:微指令长,编写微程序比较麻烦。
垂直型微指令:一条微指令只能定义一个微命令,由微操作码字段规定具体功能。
优点:微指令短、简单、规整,便于编写微程序。
缺点:微程序长,执行速度慢,工作效率低。
混合型微指令:在垂直型的基础上增加一些不太复杂的并行操作。微指令较短,仍便于编写;微程序也不长,执行速度加快。
(2)微指令的编码方式
从编码方式看,直接编码、字段直接编码和字段间接编码都属于水平型微指令。
直接编码(直接控制)方式
在微指令的操作控制字段中,每一位代表一个微操作命令,某位为 1,表示该控制信号有效。

优点:简单、直观,执行速度快,操作并行性好。
缺点:微指令字长过长,n 个微命令就要求微指令的操作字段有 n 位,造成控存容量极大。
字段直接编码方式
将微指令的控制字段分成若干段,每段经译码后发出控制信号。

微命令字段分段的原则:
-
互斥性微命令分在同一段内,相容性微命令分在不同段内。
-
每个小段中包含的信息位不能太多,否则将增加译码线路的复杂性和译码时间。
-
一般每个小段还要留出一个状态,表示本字段不发出任何微命令。因此,当某字段的长度为 3 位时,最多只能表示 7 个互斥的微命令,通常用全 0 表示不操作。
优点:可以缩短微指令字长。
缺点:要通过译码电路后再发出微命令,因此比直接编码方式慢。
字段间接编码方式
一个字段的某些微命令需由另一个字段中的某些微命令来解释(经过两次译码),由于不是靠字段直接译码发出的微命令,故称为字段间接编码,又称隐式编码。

优点:可以进一步缩短微指令字长。
缺点:削弱了微指令的并行控制能力,故通常作为字段直接编码方式的一种辅助手段。
(3)微指令的地址形成方式
-
由微指令的后继地址字段(也称下地址字段)指出。在微指令格式中设置一个后继地址字段,由微指令的后继地址字段直接指出后继微指令的地址,这种方式也称断定方式。
-
根据机器指令的操作码形成。当机器指令取自指令寄存器后,微指令的地址由操作码经微地址形成部件形成,该部件输出的是对应机器指令微程序的首地址。
-
增量计数法。即 (uPC) + 1 -> uPC,适用于后继微指令地址是连续的情况。
-
根据各种标志决定下一条微指令分支转移的地址。
-
由硬件直接产生微程序入口地址。电源加电后,第一条微指令的地址可由专门的硬件电路产生,并送至 uPC,这个地址即为取指周期微程序的入口地址。
4.微程序控制单元的设计
设计步骤:

微程序设计分类:
-
静态:微程序无需改变,采用 ROM。
-
动态:通过改变微指令和微程序改变机器指令,有利于仿真,采用 EPROM。
毫微程序设计:用毫微程序解释微程序(计算机套娃原理)。
5.两种控制器对比
硬布线控制器:
优点:控制器的速度取决于电路延迟,所以速度快。
缺点:将控制部件视为专门产生固定时序控制信号的逻辑电路,所以把用最少元件和取得最高速度作为设计目标,一旦设计完成,就不可能通过其他额外修改来添加最新功能。
微程序控制器:
优点:具有规整性、灵活性和可维护性。
缺点:因为微程序控制器采用了存储程序原理,所以每条指令都要从控制存储器中取一次,影响速度。
对比项 | 硬布线控制器 | 微程序控制器 |
---|---|---|
工作原理 | 微操作控制信号由组合逻辑电路根据当前的指令码、状态和时序及时产生 | 微操作控制信号以微程序的形式存放在控制存储器中,执行指令时读出即可 |
执行速度 | 快 | 慢 |
规整性 | 繁琐、不规整 | 较规整 |
应用场合 | RISC CPU | CISC CPU |
易扩充性 | 扩充修改困难 | 易扩充修改 |
五、指令流水线
感觉这块很深,还是需要去啃《袁》书。
1.基本概念
假设取指、分析、执行 3 个阶段的时间都相等:
(1)顺序执行方式:总耗时 T = n × 3t = 3nt
传统冯诺依曼机采用顺序执行方式,又称串行执行方式。
优点:控制简单,硬件代价小。
缺点:执行指令的速度较慢,在任何时刻,处理机中只有一条指令在执行,各功能部件的利用率很低。
(2)一次重叠执行方式:总耗时 T = 3t + (n - 1) × 2t = (1 + 2n)t
优点:程序的执行时间缩短了 1/3,各功能部件的利用率明显提高。
缺点:需要付出硬件上较大开销的代价,控制过程也比顺序执行复杂了。
(3)二次重叠执行方式:总耗时 T = 3t + (n - 1) × t = (2 + n)t
与顺序执行方式相比,指令的执行时间缩短近 2/3。这是一种理想的指令执行方式,在正常情况下,处理机中同时有 3 条指令在执行。
指令执行过程图:主要用于分析指令执行过程以及影响流水线的因素。
时空图: 用于分析流水线的性能。
2.性能指标
(1)吞吐率:在单位时间内流水线所完成的任务数量,或是输出结果的数量。
理想情况下,流水线的时空图:
设任务数为 n:处理完成 n 个任务所用的时间为 T_k,则计算流水线吞吐率(TP)的最基本的公式为 TP = n/T_k。
当 n 趋向于无穷大时,最大吞吐率为 TP_max = 1/△t。
(2)加速比:完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。
单独完成一个任务耗时为 k△t,则顺序完成 n 个任务耗时 T0 = nk△t
当 n 趋向于无穷大时,最大加速比为 S_max = k。
(3)效率:流水线的设备利用率
在时空图上,流水线的效率定义为完成 n 个任务占用的时空区有效面积与 n 个任务所用的时间与 k 个流水段所围成的时空区总面积之比。

将右部分阶梯状部分拼凑到左边,得
当 n 趋向于无穷大时,最高效率为 E_max = 1。
3.指令流水线影响因素分类
(1)结构冒险
结构冒险(资源冲突):由于多条指令在同一时刻争用同一资源而形成的冲突称为结构冒险。

例如指令和数据都放在同一个存储器中,这么第 i 条指令的 MEM 阶段和第 i + 1 条指令的 IF 阶段同时访问存储器,会造成冲突。另外,如果在访问寄存器时(图中的蓝色块),如果访问的是相同的寄存器,也会造成冲突。
解决办法:
-
后一相关指令暂停一周期。
-
资源重复配置:数据存储器 + 指令存储器(两者独立存储)

(2)数据冒险
数据冒险(数据相关):数据相关指在一个程序中,存在必须等前一条指令执行完才能执行后一条指令的情况,则这两条指令即为数据冒险。

第 2、3、4 条指令中的 r1 与第一条指令中的 r1 存在冲突。需要等待第一条指令中的 r1 完成回写后才能对其使用。
在以非乱序执行的流水线中,所有数据冒险都是因为前面指令写结果之前,后面指令就要读取而造成的,这种数据冒险称为写后读(Read After Write,RAW)冲突。
注意:在按序执行的流水线中,只可能出现 RAW 冲突。
解决办法:
方法一:把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行。可分为硬件阻塞(stall) 和软件插入空操作 “nop” 两种方法。


方法二:数据旁路(转发)技术。设置相关转发通路,不等前一条指令把计算结构写回寄存器,下一条指令也不再从寄存器读,而将数据通路中生成的中间数据直接转发到 ALU 的输入端,如下图所示。

方法三:编译优化。通过编译器调整指令顺序来解决数据相关。
(3)控制冒险
控制冒险(控制相关):当流水线遇到转移指令和其他改变 PC 的值的指令而造成断流时,会引起控制相关。
下图中,12 字节位置的指令跳转到 1000 字节位置的:

解决方法:
-
转移指令分支预测。简单预测(永远猜 ture 或 false)、动态预测(根据历史情况动态调整)。
-
预取转移成功和不成功两个控制流方向上的目标指令。
-
加快和提前形成条件码。
-
提高转移方向的猜准率(在方法一的基础上优化)。
4.流水线的分类
(1)部件功能级、处理机级和处理机间级流水线
根据流水线使用的级别的不同,流水线可分为如下三种:
-
部件功能级流水:将复杂的算术逻辑运算组成流水线工作方式。例如,可将浮点加法操作分成求阶差、对阶、尾数相加以及结果规格化等 4 个子过程。
-
处理机级流水线:把一条指令解释过程分成多个子过程,如前面提到的取指、译码、执行、访存及写回 5 个子过程。
-
处理机间流水:是一种宏流水,其中每一个处理机完成某一专门任务,各个处理机所得到的结果需存放在与下一个处理机所共享的存储器中。
(2)单功能流水线和多功能流水线
按流水线可以完成的功能,流水线可分为如下两种:
-
单功能流水线:指只能实现一种固定的专门功能的流水线。
-
多功能流水线:指通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线。
(3)动态流水线和静态流水线
按同一时间内各段之间的连接方式,流水线可分为如下两种:
-
静态流水线:指在同一时间内,流水线的各段只能按同一种功能的连接方式工作。
-
动态流水线:指在同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算。这样对提高流水线的效率很有好处,但会使流水线控制变得很复杂。
(4)线性流水线和非线性流水线
按流水线的各个功能段之间是否有反馈信号,流水线可分为如下两种:
-
线性流水线:从输入到输出,每个功能段只允许经过一次,不存在反馈回路。
-
非线性流水线:存在反馈回路,从输入到输出过程中,某些功能段将数次通过流水线,这种流水线适合进行线性递归的运算(例如通过多次加法来实现乘法的流程)。
5.流水线的多发技术
(1)超标量技术(空分复用)

每个时钟周期内可并发多条独立指令,要配置多个功能部件。
不能调整指令的执行顺序,通过编译优化技术,把可并行执行的指令搭配起来。
(2)超流水线技术(时分复用)

将流水线在一个时钟周期内再分段(3 段),在一个时钟周期内,一个功能部件使用多次(3 段),流水线速度是原来的 3 倍。
不能调整指令的执行顺序,靠编译程序解决优化问题。
注意:超流水线 CPU 在流水线充满后,每个时钟周期还是执行一条指令,CPI = 1,但其主频更高(时钟周期更短);超标量技术 CPU 的 CPI 能达到小于 1。因此有时用 CPI 的倒数 ICP(Instructions Per Cycle)来衡量其性能。例如上图中超标量流水线的理想 IPC 为 3。
(3)超长指令字

由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令合成一条具有多个操作码字段的超长指令字(可达几百位)。
需要采用多个处理部件 。
6.五段式指令流水线
一条指令的执行过程可以分为如下五个阶段:
-
取指(IF):从指令存储器或 Cache 中取指令。
-
译码/读寄存器(ID):操作控制器对指令进行译码,同时从寄存器堆中取操作数。
-
执行/计算地址(EX):执行运算操作或计算地址。
-
访存(MEM):对存储器进行读/写操作。
-
写回(WB):将指令执行结结果写回寄存器堆。

为了方便流水线的设计,将每个阶段的耗时取成一样的,以最长耗时为准,即此处应将机器周期设置为 100 ns。
流水线每个功能段后面都要有一个缓冲寄存器,或称为锁存器(图中蓝框部分)。其作用是保存本流水段的执行结果,提供给下一流水段使用(更方便地统一每一个阶段的实际的时间开销)。
指令 Cache 和数据 Cache 分离,对两个模块的访问是可以并行进行的。Cache 如果未命中,指令流水线会出现断流(流水线阻塞)的情况,因为必须去访问主存。
为了实现指令流水线,指令集应具有如下特征:
-
指令长度应尽量一致,有利于简化取指令和译码操作。否则,取指令所花的时间长短不一,使得取指部件极其复杂,并且也不利于指令译码。
-
指令格式应尽量规整,尽量保证源寄存器的位置相同,有利于在指令未知时就可取寄存器操作数,否则须译码后才能确定指令中各寄存器编号的位置。
-
采用 LOAD/STORE 型指令,其他指令都不能访问存储器,这样可把 LOAD/STORE 指令的地址计算和运算指令的执行步骤规整在同一个周期中,有利于减少操作步骤。
-
数据和指令在存储器中 “按边界对齐” 存放。这样,有利于减少访存次数,使所需数据在一个流水段内就能从存储器中得到。
常见的五种指令的执行过程:
(1)运算类指令
-
IF:根据 PC 从指令 Cache 取指令至 IF 段的锁存器
-
ID:取出操作数至 ID 段锁存器
-
EX:运算,将结果存入 EX 段锁存器
-
M:空段
-
WB:将运算结果写回指定寄存器
(2)LOAD 指令
-
IF:根据 PC 从指令 Cache 取指令至 IF 段的锁存器
-
ID:将基址寄存器的值放到锁存器 A,将偏移量的值放到 Imm
-
EX:运算,得到有效地址
-
M:从数据 Cache 中取数并放入锁存器
-
WB:将取出的数写回寄存器
(3)STORE 指令
-
IF:根据 PC 从指令 Cache 取指令至 IF 段的锁存器
-
ID:将基址寄存器的值放到寄存器 A,将偏移量的值放到 Imm,将要存的数放到 B
-
EX:运算,得到有效地址,并将锁存器 B 的内容放到锁存器 Store
-
M:写入数据 Cache
-
WB:空段
(4)条件转移指令
-
IF:根据 PC 从指令 Cache 取指令至 IF 段的锁存器
-
ID:进行比较的两个数放入锁存器 A、B,偏移量放入 Imm
-
EX:运算,比较两个数
-
M:将目标 PC 值写回 PC
-
WB:空段
(5)无条件转移指令
-
IF:根据 PC 从指令 Cache 取指令至 IF 段的锁存器
-
ID:偏移量放入 Imm
-
EX:将目标 PC 值写回 PC
-
M:空段
-
WB:空段
注意:条件跳转指令对 PC 值的修改在 MEM 阶段执行,不在 WB 阶段,因为 PC 不属于通用寄存器,比较特殊。而无条件跳转指令对 PC 值的修改安排在 EX 阶段执行。尽早地修改 PC 的值是因为越早完成修改,就越能避免控制冲突。
六、多处理器的基本概念
1.SISD、SIMD、MIMD 的基本概念
(1)单指令流单数据流(SISD)结构
特性:各指令序列只能并发、不能并行,每条指令处理一两个技术。
不是数据级并行技术。
硬件组成:一个处理器 + 一个主存储器
若采用指令流水线,需设置多个功能部件,采用多模块交叉存储器。
(2)单指令流多数据流(SIMD)结构
特性:各指令序列只能并发、不能并行、但每条指令可同时处理很多个具有相同特征的数据。
是一种数据级并行技术。
硬件组成:一个指令控制部件(CU)+ 多个处理单元/执行单元(如 ALU)+ 多个局部存储器 + 一个主存储器
每个执行单元有各自的寄存器组、局部存储器、地址寄存器,不同执行单元执行同一条指令,处理不同的数据。
SIMD 在使用 for 循环处理数组时最有效;在使用 case 或 switch 语句时效率最低。
(3)多指令流单数据流(MISD)结构
多条指令并行执行,处理同一个数据,现实中不存在这种计算机(乐了)。
(4)多指令流多数据流(MIMD)结构
特性:各指令序列并行执行,分别处理多个不同的数据。
是一种线程级并行、甚至是线程级以上并行技术(线程级并行指每个核运行各自的线程,多个线程可以并行地执行;线程级以上的并行就是进程级的并行,每个核处理一个进程)。
MIMD 又可以进一步分为多处理器系统(共享存储多处理器 SMP 的缩写) 和多计算机系统
1.多处理器系统
特性:各处理器之间,可以通过 LOAD/STORE 指令,访问同一个主存储器,可以通过主存相互传递数据,也称共享存储 MIMD。
硬件组成:一台计算机内,包含多个处理器 + 一个主存储器
多个处理器共享单一的物理地址空间。
单一地址空间的多处理器可以分为两个类型:
-
统一存储访问(UMA)多处理器:每个处理器对所有存储单元的访问时间是大致相同的,即访问时间与哪个处理器提出访存请求及访问哪个字无关。
-
非统一存储访问(NUMA)多处理器:某些存储器的访存速度要比其他的快,具体取决于哪个处理器提出访问请求及访问哪个字,这是由于主存被分割给了不同处理器。
多核处理器:一个 CPU 芯片中包含多个处理器,即多个核(core),因此通常也称为片级多处理器(Chip-Level MultiProcessing,CMP)。意思是一块芯片上集成了多个处理器。所以核都共享一个 LLC(Last-Level Cache,最低一级 Cache),并共享主存储器。本质上和 SMP 是一个东西,只是命名角度不同。
![]()
2.多计算机系统
特性:各计算机之间,不能通过 LOAD/STORE 指令直接访问对方的存储器,只能通过 “消息传递” 相互传送数据。
硬件组成:由多台计算机组成,因此拥有多个处理器 + 多个主存储器
每台计算机拥有各自的私有存储器,物理地址空间相互独立。
(5)向量处理机(SIMD 的变体)
特性:一条指令的处理对象是向量,擅长对向量型数据并行计算、浮点数运算,常被用于超级计算机中,处理科学研究中巨大运算量。
硬件组成:多个处理单元 + 多组 “向量寄存器”
主存储器应采用 “多个端口同时读取” 的交叉多模块存储器。
主存储器大小限定了机器的解题规模,因此要有大容量的、集中式的主存储器。
2.硬件多线程
在支持硬件多线程的 CPU 中,必须为每个线程提供单独的通用寄存器组、单独的程序技术器等,线程的切换只需激活选中的寄存器,从而省略了与存储器数据交换的环节,大大减少了线程切换的开销。
硬件多线程有三种方式:
细粒度多线程 | 粗粒度多线程 | 同时多线程(SMT) | |
---|---|---|---|
指令发射 | 轮流发射各线程的指令(每个时钟周期发射一个线程) | 连续几个时钟周期,都发射同一线程的指令序列,流水线阻塞时,切换另一个线程 | 一个时钟周期内,同时发射多个线程的指令 |
线程切换频率 | 每个时钟周期切换一次线程 | 只有流水线阻塞时才切换一次线程 | NULL |
线程切换代价 | 低 | 高,需要重载流水线 | NULL |
并行性 | 指令级并行,线程间不并行 | 指令级并行,线程间不并行 | 指令级并行,线程级并行 |
三种硬件多线程实现方式的调度示例如下图所示:
