【考纲内容】
【复习提示】
中央处理器是计算机的中心,也是课程最大的难点。其中,数据通路的分析、指令执行阶段的节拍与控制信号的安排、流水线技术与性能分析容易出综合题。而关于各种寄存器的特点、指令执行的各种周期与特点、控制器的相关概念、流水线的相关概念也极易出选择题。
应当考虑以下问题:
中央处理器(CPU)由运算器和控制器组成。其中,控制器的功能是负责协调并控制计算机各部件执行程序的指令序列,包括取指令、分析指令和执行指令;运算器的功能是对数据进行加工。CPU 的具体功能包括:
在计算机系统中,中央处理器主要由运算器和控制器两大部分组成,如图 5.1 所示。
运算器接收从控制器送来的命令并执行相应的动作,对数据进行加工和处理。运算器是计算机对数据进行加工处理的中心,它主要由以下部分组成:
控制器是整个系统的指挥中枢,在控制器的控制下,运算器、存储器和输入/输出设备等功能部件构成一个有机的整体,根据指令的要求指挥全机协调工作。控制器的基本功能是执行指令,每条指令的执行是由控制器发出的一组微操作实现的。控制器由以下部分组成:
注意:CPU 内部寄存器大致可分为两类: 一类是用户可见的寄存器,可对这类寄存器编程,如通用寄存器组、程序状态字寄存器 另一类是用户不可见的寄存器,对用户透明,不可对这类寄存器编程,如存储器地址寄存器、存储器数据寄存器、指令寄存器。
CPU 从主存中取出并执行一条指令的时间称为指令周期,不同指令的指令周期可能不同。指令周期常用若干机器周期来表示,一个机器周期又包含若干时钟周期(也称节拍或 T 周期,它是 CPU 操作的最基本单位)。每个指令周期内的机器周期数可以不等,每个机器周期内的节拍数也可以不等。图 5.2 反映了上述关系。
对于无条件转移指令 JUMP X,在执行时不需要访问主存,只包含取指阶段(包括取指和分析)和执行阶段,所以其指令周期仅包含取指周期和执行周期。对于间接寻址的指令,为了取操作数,需要先访问一次主存,取出有效地址,然后访问主存,取出操作数,所以还需包括间址周期。间址周期介于取指周期和执行周期之间。当 CPU 采用中断方式实现主机和 I/O 设备的信息交换时,CPU 在每条指令执行结束前,都要发出中断查询信号,若有中断请求,则 CPU 进入中断响应阶段,又称中断周期。这样,一个完整的指令周期应包括取指、间址、执行和中断 4 个周期,如图 5.3 所示。
e
上述 4 个工作周期都有 CPU 访存操作,只是访存的目的不同。取指周期是为了取指令,间址周期是为了取有效地址,执行周期是为了取操作数,中断周期是为了保存程序断点。
为了区别不同的工作周期,在 CPU 内设置 4 个标志触发器 FE、IND、EX 和 INT,它们分别对应取指、间址、执行和中断周期,并以“1”状态表示有效,分别由 1 → FE、1 → IND、1 → EX 和 1 → INT 这 4 个信号控制。注意:中断周期中的进栈操作是将 SP 减 1,这和传统意义上的进栈操作相反,原因是计算机的堆栈中都是向低地址增加,所以进栈操作是减 1 而不是加 1。
数据流是根据指令要求依次访问的数据序列。在指令执行的不同阶段,要求依次访问的数据序列是不同的。而且对于不同的指令,它们的数据流往往也是不同的。
取指周期的任务是根据 PC 中的内容从主存中取出指令代码并存放在 IR 中。取指周期的数据流如图 5.4 所示。PC 中存放的是指令的地址,根据此地址从内存单元中取出指令,并放在指令寄存器 IR 中,取指令的同时,PC 加 1。取指周期的数据流向如下:
间址周期的任务是取操作数有效地址。以一次间址为例(见图 5.5),将指令中的地址码送到 MAR 并送至地址总线,此后 CU 向存储器发读命令,以获取有效地址并存至 MDR。间址周期的数据流向如下:
执行周期的任务是取操作数,并根据 IR 中的指令字的操作码通过 ALU 操作产生执行结果。不同指令的执行周期操作不同,因此没有统一的数据流向。
中断周期的任务是处理中断请求。假设程序断点存入堆栈中,并用 SP 指示栈顶地址,而且进栈操作是先修改栈顶指针,后存入数据,数据流如图 5.6 所示。中断周期的数据流向如下:
一个指令周期通常包括几个时间段(执行步骤),每个步骤完成指令的一部分功能,几个依次执行的步骤完成这条指令的全部功能。出于性能和硬件成本等考虑,可以选用 3 种不同的方案来安排指令的执行步骤。
数据在功能部件之间传送的路径称为数据通路,包括数据通路上流经的部件,如 ALU、通用寄存器、状态寄存器、异常和中断处理逻辑等。数据通路描述了信息从什么地方开始,中间经过哪个寄存器或多路开关,最后传送到哪个寄存器,这些都需要加以控制。
数据通路由控制部件控制,控制部件根据每条指令功能的不同生成对数据通路的控制信号。数据通路的功能是实现 CPU 内部的运算器与寄存器及寄存器之间的数据交换。
数据通路的基本结构主要有以下几种:
在图 5.7 中,各部件用大写字母表示,字母加“in”表示该部件的允许输入控制信号;字母加“out”表示该部件的允许输出控制信号。
注意:内部总线是指同一部件,如 CPU 内部连接各寄存器及运算部件之间的总线;系统总线是指同一台计算机系统的各部件,如 CPU、内存和各类 I/O 接口间互相连接的总线。
寄存器之间的数据传送可通过 CPU 内部总线完成。在图 5.7 中,某寄存器 AX 的输出和输入分别由 AXout 和 AXin 控制。现以 PC 寄存器为例,把 PC 内容送至 MAR,实现传送操作的流程及控制信号为:
xxxxxxxxxx
(PC) → MAR PCout 和 MARin 有效,PC 内容 → MAR
主存与 CPU 之间的数据传送也要借助 CPU 内部总线完成。现以 CPU 从主存读取指令为例说明数据在数据通路中的传送过程。实现传送操作的流程及控制信号为:
xxxxxxxxxx
(PC) → MAR PCout 和 MARin 有效,现行指令地址 → MAR
1 → R CU 发读命令
MEM(MAR)→MDR MDRin 有效
(MDR) → IR MDRout 和 IRin 有效,现行指令 → IR
执行算术或逻辑操作时,由于 ALU 本身是没有内部存储功能的组合电路,因此如要执行加法运算,相加的两个数必须在 ALU 的两个输入端同时有效。图 5.7 中的暂存器 Y 即用于该目的。先将一个操作数经 CPU 内部总线送入暂存器 Y 保存,Y 的内容在 ALU 的左输入端始终有效,再将另一个操作数经总线直接送到 ALU 的右输入端。这样两个操作数都送入了 ALU,运算结果暂存在暂存器 Z 中。
数据通路结构直接影响 CPU 内各种信息的传送路径,数据通路不同,指令执行过程的微操作序列的安排也不同,它关系着微操作信号形成部件的设计。
从图 5.8 可以看到计算机硬件系统的五大功能部件及其连接关系。它们通过数据总线、地址总线和控制总线连接在一起,其中点画线框内的是控制器部件。
其主要连接关系如下:
控制器是计算机系统的指挥中心,其主要功能有:
根据控制器产生微操作控制信号的方式不同,控制器可分为硬布线控制器和微程序控制器。这两类控制器中的程序计数器(PC)和指令寄存器(IR)是相同的,但确定和表示指令执行步骤的方法以及给出控制各部件运行所需要的控制信号的方案是不同的。
硬布线控制器的基本原理是根据指令的要求、当前的时序及外部和内部的状态,按时间的顺序发送一系列微操作控制信号。它由复杂的组合逻辑门电路和一些触发器构成,因此又称组合逻辑控制器。
指令的操作码是决定控制单元发出不同操作命令(控制信号)的关键。为了简化控制单元(CU)的逻辑,将指令的操作码译码和节拍发生器从CU分离出来,便可得到简化的控制单元图,如图 5.9 所示。
CU的输入信号来源如下:
在图 5.9 中,节拍发生器产生各机器周期中的节拍信号,使不同的微操作命令按时间的先后发出。个别指令的操作不仅受操作码控制,还受状态标志控制,因此CU的输入来自操作码译码电路、节拍发生器及状态标志,其输出到CPU内部或外部控制总线上。注意:控制单元还接收来自系统总线(控制总线)的控制信号,如中断请求、DMA请求。
时钟周期:用时钟信号控制节拍发生器,可以产生节拍,每个节拍的宽度正好对应一个时钟周期。在每个节拍内机器可完成一个或几个需同时执行的操作。
机器周期:机器周期可视为所有指令执行过程中的一个基准时间。不同指令的操作不同,指令周期也不同。访问一次存储器的时间是固定的,因此通常以存取周期作为基准时间,即内存中读取一个指令字的最短时间作为机器周期。在存储字长等于指令字长的前提下,取指周期也可视为机器周期。在一个机器周期里可完成若干微操作,每个微操作都需一定的时间,可用时钟信号来控制产生每个微操作命令。
指令周期:指令周期详见 5.2.1 节。
微操作命令分析:控制单元具有发出各种操作命令(控制信号)序列的功能。这些命令与指令有关,而且必须按一定次序发出,才能使机器有序地工作。执行程序的过程中,对于不同的指令,控制单元需发出各种不同的微操作命令。一条指令分为三个工作周期:取指周期、间址周期和执行周期。下面分析各个子周期的微操作命令。
xxxxxxxxxx
(PC) → MAR # 现行指令地址 → MAR
1 → R # 命令存储器读
M(MAR) → MDR # 现行指令从存储器中读至 MDR
(MDR) → IR # 现行指令 → IR
OP(IR) → CU # 指令的操作码 → CU 译码
(PC) + 1 → PC # 形成下一条指令的地址
xxxxxxxxxx
Ad(IR) → MAR # 将指令字中的地址码(形式地址)→ MAR
1 → R # 命令存储器读
M(MAR) → MDR # 将有效地址从存储器读至 MDR
执行周期的微操作命令:执行周期的微操作命令视不同指令而定。
xxxxxxxxxx
CLA # 清 ACC → ACC
COM # 取反 ĀCC → ACC
SHR # 算术右移 L(ACC) → R(ACC), ACC0 → ACC0
CSL # 循环左移 R(ACC) → L(ACC), ACC0 → ACC0
STP # 停机指令 0 → G
xxxxxxxxxx
ADD X # 加法指令
Ad(IR) → MAR, 1 → R
M(MAR) → MDR
(ACC) + (MDR) → ACC
STA X # 存数指令
Ad(IR) → MAR, 1 → W
(ACC) → MDR,
(MDR) → M(MAR)
LDA X # 取数指令
Ad(IR) → MAR, 1 → R
M(MAR) → MDR,
(MDR) → ACC
xxxxxxxxxx
JMP # 无条件转移 Ad(IR) → PC
BANX # 条件转移(负则转) A0·Ad(IR) + A1·(PC) → PC
控制单元控制一条指令执行的过程,实质上是依次执行一个确定的微操作序列的过程。由于不同指令所对应的微操作数及复杂程度不同,因此每条指令和每个微操作所需的执行时间也不同。主要有以下 3 种控制方式:
硬布线控制单元设计步骤包括:
列出微操作命令的操作时间表:先根据微操作节拍安排,列出微操作命令的操作时间表。操作时间表中包括各个机器周期、节拍下的每条指令完成的微操作控制信号。 表 5.1 列出了 CLA、COM、SHR 等 10 条机器指令微操作命令的操作时间表。
表中 FE、IND 和 EX 为 CPU 工作周期标志,
同理,在间址周期的 T2 时刻,
在执行周期的 T2 时刻,CPU 要向所有中断源发中断查询信号,若检测到有中断请求并满足响应条件,则 INT 触发器置“1”,标志进入中断周期。表中未列出 INT 触发器置“1”的操作和中断周期的微操作。
表中第一行对应 10 条指令的操作码,代表不同的指令。若某指令有表中所列出的微操作命令,其对应的单元格内为 1。
进行微操作信号综合:在列出微操作时间表后,即可对它们进行综合分析、归类,根据微操作时间表可写出各微操作控制信号的逻辑表达式并进行适当的简化。表达式一般包括下列因素:
根据表 5.1 便可列出每个微操作命令的初始逻辑表达式,经化简、整理可获得能用现有门电路实现的微操作命令逻辑表达式。
例如,根据表 5.1 可写出 M(MAR)→MDR 微操作命令的逻辑表达式:
式中,ADD、STA、LDA、JMP、BAN 均来自操作码译码器的输出。
微程序控制器采用存储逻辑实现,也就是把微操作信号代码化,使每条机器指令转化为一段微程序并存入一个专门的存储器(控制存储器)中,微操作控制信号由微指令产生。
指令对应一个或几个微操作命令。这些微程序可以存到一个控制存储器中,用寻址用户程序机器指令的办法来寻址每个微程序中的微指令。目前,大多数计算机都采用微程序设计技术。微程序设计技术涉及的基本术语如下:
微命令与微操作:一条机器指令可以分解成一个微操作序列,这些微操作是计算机中最基本的、不可再分解的操作。在微程序控制的计算机中,将控制部件向执行部件发出的各种控制命令称为微命令,它是构成控制序列的最小单位。例如,打开或关闭某个控制门的电位信号、某个寄存器的打入脉冲等。微命令和微操作是一一对应的。微命令是微操作的控制信号,微操作是微命令的执行过程。微命令有相容性和互斥性之分。相容性微命令是指那些可以同时产生、共同完成某一些微操作的微命令;而互斥性微命令是指在机器中不允许同时出现的微命令。相容和互斥都是相对的,一个微命令可以和一些微命令相容,和另一些微命令互斥。
微指令与微周期:微指令是若干微命令的集合。存放微指令的控制存储器的单元地址称为微地址。一条微指令通常至少包含两大部分信息:
主存储器与控制存储器:主存储器用于存放程序和数据,在 CPU 外部,用 RAM 实现;控制存储器(CM)用于存放微程序,在 CPU 内部,用 ROM 实现。
程序与微程序:程序是指令的有序集合,用于完成特定的功能;微程序是微指令的有序集合,一条指令的功能由一段微程序来实现。
微程序和程序是两个不同的概念。微程序是由微指令组成的,用于描述机器指令。微程序实际上是机器指令的实时解释器,是由计算机设计者事先编制好并存放在控制存储器中的,一般不提供给用户。对程序员来说,计算机系统中的微程序的结构和功能是透明的,无需知道。而程序最终由机器指令组成,是由软件设计人员事先编制好并存放在主存或辅存中的。
应注意区分以下寄存器:
微程序控制器的基本组成包括:
微程序控制器的工作过程实际上就是在微程序控制器的控制下计算机执行机器指令的过程,这个过程可以描述如下:
通常,一条机器指令对应一个微程序。由于任何机器指令的取指令操作都是相同的,因此可将取指令操作的微命令统一编成一个微程序,这个微程序只负责将指令从主存单元中取出并送至指令寄存器。此外,也可编出对应间址周期的微程序和中断周期的微程序。这样,控制存储器中的微程序个数应为机器指令数再加上对应取指、间址和中断周期等公共的微程序数。
微指令的编码方式又称微指令的控制方式,是指如何对微指令的控制字段进行编码,以形成控制信号。编码的目标是在保证速度的情况下,尽量缩短微指令字长。
微指令的直接编码方式如图 5.12 所示。直接编码法无须进行译码,微指令的微命令字段中每位都代表一个微命令。设计微指令时,选用或不选用某个微命令,只要将表示该微命令的对应位设置成 1 或 0 即可。每个微命令对应并控制数据通路中的一个微操作。
这种编码的优点是简单、直观,执行速度快,操作并行性好;缺点是微指令字长过长,n 个微命令就要求微指令的操作字段有 n 位,造成控制存储器容量极大。
将微指令的微命令字段分成若干小字段,把互斥性微命令组合在同一字段中,把相容性微命令组合在不同字段中,每个字段独立编码,每种编码代表一个微命令且各字段编码含义单独定义,与其他字段无关。
这种方式可以缩短微指令字长,但因为要通过译码电路后再发出微命令,因此比直接编码方式慢。
微命令字段分段的原则:
一个字段的某些微命令需由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,因此称为字段间接编码,又称隐式编码。这种方式可进一步缩短微指令字长,但因削弱了微指令的并行控制能力,因此通常作为字段直接编码方式的一种辅助手段。
后继微地址的形成主要有以下两大基本类型:
实际上,微指令序列地址的形成方式还有以下几种:
电源加电后,第一条微指令的地址可由专门的硬件电路产生,也可由外部直接向 CMAR 输入微指令的地址,这个地址即为取指周期微程序的入口地址。
微指令格式与微指令的编码方式有关,通常分水平型微指令和垂直型微指令两种。
优点是微程序短,执行速度快;缺点是微指令长,编写微程序较麻烦。
垂直型微指令格式的优点是微指令短、简单、规整,便于编写微程序;缺点是微程序长,执行速度慢,工作效率低。
混合型微指令:在垂直型的基础上增加一些不太复杂的并行操作。微指令较短,仍便于编写;微程序也不长,执行速度加快。
水平型和垂直型微指令的比较:
微程序控制单元设计的主要任务是编写各条机器指令所对应的微程序。具体的设计步骤如下:
写出对应机器指令的微操作命令及节拍安排:无论是组合逻辑设计还是微程序设计,对应相同的 CPU 结构,两种控制单元的微操作命令和节拍安排都是极相似的。如微程序控制单元在取指阶段发出的微操作命令及节拍安排如下:
(PC) → MAR, 1 → R | |
---|---|
M(MAR) → MDR, (PC) + 1 → PC | |
(MDR) → IR, OP(IR) → 微地址形成部件 |
与硬布线控制单元相比,只在 OP(IR) → 微地址形成部件
,以形成该条机器指令的微程序首地址。而硬布线控制单元在 OP(IR) → ID
若把一个节拍 Ad(CMDR) → CMAR
。
取指微程序的最后一条微指令,其后继微指令的地址是由微地址形成部件形成的,即 微地址形成部件 → CMAR
。为了反映该地址与操作码有关,因此记为 OP(IR) → 微地址形成部件 → CMAR
。
综上所述,考虑到需要形成后继微指令地址,上述分析的取指操作共需 6 条微指令完成:
(PC) → MAR, 1 → R | |
---|---|
Ad(CMDR) → CMAR | |
M(MAR) → MDR, (PC) + 1 → PC | |
Ad(CMDR) → CMAR | |
(MDR) → IR | |
OP(IR) → 微地址形成部件 → CMAR |
执行阶段的微操作命令及节拍安排,分配原则类似。与硬布线控制单元微操作命令的节拍安排相比,多了将下一条微指令地址送至 CMAR 的微操作命令,即 Ad(CMDR) → CMAR。其余的微操作命令与硬布线控制单元相同。
注意:这里为了理解,应将微指令和机器指令相联系,因为每执行完一条微指令后要得到下一条微指令的地址。
确定微指令格式:微指令格式包括微指令的编码方式、后继微指令地址的形成方式和微指令字长等。根据微操作个数决定采用何种编码方式,以确定微指令的操作控制字段的位数。由微指令数确定微指令的顺序控制字段的位数。最后按操作控制字段位数和顺序控制字段位数就可确定微指令字长。
编写微指令码点:根据操作控制字段每位代表的微操作命令,编写每条微指令的码点。
为便于比较,下面以表格的形式对比二者的不同:
类别 | 微程序控制器 | 硬布线控制器 |
---|---|---|
工作原理 | 微操作控制信号以微程序的形式存放在控制存储器中;执行指令时读出即可 | 微操作控制信号由组合逻辑电路根据当前的指令码、状态和时序,即时产生 |
执行速度 | 慢 | 快 |
规整性 | 较规整 | 繁琐、不规整 |
应用场合 | CISC CPU | RISC CPU |
易扩充性 | 易扩充 | 修改困难 |
异常和中断机制由硬件和操作系统共同完成。硬件部分包括 CPU 的异常/中断逻辑和外设接口中的中断请求和控制逻辑。操作系统中有相应的中断服务程序。中断硬件线路和中断服务程序结合,共同完成异常和中断的处理过程。
异常是 CPU 执行指令时检测到的同步事件;中断是由外部设备触发的异步事件。
处理过程:当 CPU 在执行指令时检测到异常或中断请求时,CPU 会打断当前程序,转到相应的异常或中断处理程序去执行。处理完毕后,CPU 执行返回指令,回到被打断的程序继续执行。如果是致命错误,则终止用户程序。具体处理过程由操作系统和驱动程序完成。
异常分为硬故障中断和程序性异常。
按异常发生原因和返回方式的不同,异常可分为故障、自陷和终止:
中断包括来自 CPU 外部的事件,如 I/O 中断(如键盘输入、打印机缺纸等)或特殊事件(如用户按 Esc 键、定时器计数时间到等)。中断可分为可屏蔽中断和不可屏蔽中断:
中断和异常在本质上相同,但有以下不同点:
当 CPU 执行指令时发生异常或中断请求,需要进行处理。响应过程包括关中断、保存断点和程序状态、识别异常和中断并转到相应的处理程序:
关中断:保存断点和程序状态期间不能被新中断打断,通过设置“中断允许”(IF)触发器实现。IF 置为 1 表示开中断,置为 0 表示关中断。
保存断点和程序状态:保存断点(返回地址)和程序状态字寄存器 PSWR 的内容到栈中,以便异常或中断返回时恢复。
识别异常和中断并转到相应的处理程序:异常和中断源的识别有软件和硬件两种方式。
响应过程结束后,CPU 从 PC 中取出中断服务程序的第一条指令开始执行,直至中断返回。整个中断处理过程由软/硬件协同实现。
传统单周期处理机采用串行方法执行指令,同一时刻 CPU 中只有一条指令在执行,因此功能部件的使用率较低。现代计算机普遍采用指令流水线技术,使得同一时刻多条指令在 CPU 的不同功能部件中并发执行,从而大幅提高了功能部件的并行性和程序的执行效率。
提高处理机并行性的方法有两种:
一条指令的执行过程可分解为若干阶段,每个阶段由相应的功能部件完成。这些阶段可视为流水线的不同段,每个时钟周期都有一条指令进入流水线并完成,理想情况下,每条指令的时钟周期数(CPI)为 1。
如图 5.16 所示,将第
在理想情况下,每个时钟周期都有一条指令进入流水线,并且每个时钟周期都有一条指令完成。每条指令的时钟周期数(CPI)为 1。
流水线设计的原则是根据最复杂指令的功能段个数和操作时间来确定流水段个数和长度。例如,假设某条指令的 5 个阶段所花的时间分别为:
总执行时间为 750 ps。根据流水线设计原则,每个流水段的长度为 200 ps,因此每条指令的执行时间为 1 ns,比串行执行时增加了 250 ps。假设某程序有
为了实现指令流水线,指令集应具备以下特征:
通常用时空图描述流水线的执行情况,如图 5.17 所示。
时空图中,横坐标表示时间,纵坐标表示当前指令所处的功能部件。第一条指令在时刻 0 进入流水线,在时刻 5T 流出流水线。第二条指令在时刻 T 进入,在时刻 6T 流出。以此类推,每隔一个时间 T 就有一条指令进入流水线。从时刻 5T 开始,每隔一个时间 T 就有一条指令流出流水线。
在时刻 10T 时,流水线有 6 条指令流出,而串行执行方式在时刻 10T 时只能执行 2 条指令。使用流水线方式大幅提高了计算机速度。流水线技术适用于大量连续任务的处理,指令执行连续不断,适合使用流水线技术。对于其他部件级流水线(如浮点运算流水线),同样只适合于提升浮点运算密集型应用的性能,对于单个运算无效。
传统单周期处理机采用串行方法执行指令,同一时刻 CPU 中只有一条指令在执行,因此功能部件的使用率较低。现代计算机普遍采用指令流水线技术,使得同一时刻多条指令在 CPU 的不同功能部件中并发执行,从而大幅提高了功能部件的并行性和程序的执行效率。
提高处理机并行性的方法有两种:
一条指令的执行过程可分解为若干阶段,每个阶段由相应的功能部件完成。这些阶段可视为流水线的不同段,每个时钟周期都有一条指令进入流水线并完成,理想情况下,每条指令的时钟周期数(CPI)为 1。
如图 5.16 所示,将第
在理想情况下,每个时钟周期都有一条指令进入流水线,并且每个时钟周期都有一条指令完成。每条指令的时钟周期数(CPI)为 1。
流水线设计的原则是根据最复杂指令的功能段个数和操作时间来确定流水段个数和长度。例如,假设某条指令的 5 个阶段所花的时间分别为:
总执行时间为 750 ps。根据流水线设计原则,每个流水段的长度为 200 ps,因此每条指令的执行时间为 1 ns,比串行执行时增加了 250 ps。假设某程序有
为了实现指令流水线,指令集应具备以下特征:
通常用时空图描述流水线的执行情况,如图 5.17 所示。
时空图中,横坐标表示时间,纵坐标表示当前指令所处的功能部件。第一条指令在时刻 0 进入流水线,在时刻 5T 流出流水线。第二条指令在时刻 T 进入,在时刻 6T 流出。以此类推,每隔一个时间 T 就有一条指令进入流水线。从时刻 5T 开始,每隔一个时间 T 就有一条指令流出流水线。
在时刻 10T 时,流水线有 6 条指令流出,而串行执行方式在时刻 10T 时只能执行 2 条指令。使用流水线方式大幅提高了计算机速度。流水线技术适用于大量连续任务的处理,指令执行连续不断,适合使用流水线技术。对于其他部件级流水线(如浮点运算流水线),同样只适合于提升浮点运算密集型应用的性能,对于单个运算无效。
在单周期实现中,这 5 个功能段是串连在一起的,如图 5.18 所示。将程序计数器(PC)的值送入 IF 段取指令,然后依次进入 ID、EX、MEM、WB 段。虽然不是所有指令都必须经历完整的 5 个阶段,但只能以执行速度最慢的指令作为设计其时钟周期的依据,单周期 CPU 的时钟频率取决于数据通路中的关键路径(最长路径),因此单周期 CPU 指令执行效率不佳。
一个 5 段流水线数据通路如图 5.19 所示。其中,IF 段包括程序计数器(PC)、指令存储器、下条指令地址的计算逻辑;ID 段包括操作控制器、取操作数逻辑、立即数符号扩展模块;EX 段主要包括算术逻辑单元(ALU)、分支地址计算模块:MEM 段主要包括数据存储器读写模块;WB 段主要包括寄存器写入控制模块。每个流水段后面都需要增加一个流水寄存器,用于锁存本段处理完成的数据和控制信号,以保证本段的执行结果能在下个时钟周期给下一流水段使用,图中增加了 4 个流水寄存器,并根据其所连接的功能段来命名。各种寄存器和数据存储器均采用统一时钟 CLK 进行同步,每来一个时钟,就会有一条新的指令进入流水线 IF 段;同时流水寄存器会锁存前段加工处理完成的数据和控制信号,为下一段的功能部件提供数据输入。
不同流水寄存器锁存的数据不相同,如图 5.19 中的实线表示。IF/ID 流水寄存器需要锁存从指令存储器取出的指令字,以及 PC+4 的值:ID/EX 流水寄存器需要锁存从寄存器堆中取出的两个操作数 RS 和 RT(指令中两个操作数字段对应的寄存器值)与写寄存器编号 WriteReg#,以及立即数符号扩展的值、PC+4 等后段可能用到的操作数;EX/MEM 流水寄存器需要锁存 ALU 运算结果、数据存储器待写入数据 WriteData、写寄存器编号 WriteReg#等数据:MEM/WB 流水寄存器需要锁存 ALU 运算结果、数据存储器读出数据、写寄存器编号 WriteReg#等数据。
上节描述了数据通过流水寄存器进行传递的情况。但是在某一时刻,每个流水段执行不同指令的某个阶段,每个流水段还需要正在执行指令的对应功能段的控制信号。图 5.19 中的控制信号(虚线表示)如表 5.3 所示。控制信号的来源并不一致,如 IF 段的分支转跳信号 BranchTaken 来源于 EX 段,ID 段的 RegWrite 信号来源于 WB 段。其他控制信号通过控制器产生,由 ID 段负责译码生成控制信号,并分别在随后的各个时钟周期内使用。
控制信号 | 位置 | 来源 | 功能说明 |
---|---|---|---|
BranchTaken | IF | EX | 分支跳转信号,为 1 表示跳转,由 EX 段的 Branch 信号与 equal 标志进行逻辑与生成 |
RegDst | ID | ID | 写入目的寄存器选择,为 1 时目的寄存器为 rd 寄存器,为 0 时为 rt 寄存器 |
RegWrite | ID | WB | 控制寄存器堆写操作,为 1 时数据需要写回寄存器堆中的指定寄存器 |
AluSrc | EX | EX | ALU 的第二输入选择控制,为 0 时输入寄存器 rt,为 1 时输入扩展后的立即数 |
AluOp | EX | EX | 控制 ALU 进行不同运算,具体取值和位宽与 ALU 的设计有关 |
MemWrite | MEM | MEM | 控制数据存储器写操作,为 0 时进行读操作,为 1 时进行写操作 |
MemToReg | WB | WB | 为 1 时将数据存储器读出数据写回寄存器堆,否则将 ALU 运算结果写回 |
控制器的输入主要是 IF/ID 流水寄存器锁存的指令字中的 OP 字段,输出为 7 个控制信号,其中 RegDst 信号在 ID 段使用,其他 6 个后段使用的控制信号输出到 ID/EX 流水寄存器中并依次向后传递,以供后续各流水段使用。RegWrite 信号必须传递至 WB 段后才能反馈到 ID 段的寄存器堆的写入控制段 WE;条件分支译码信号 Branch 也需要传递到 EX 段,与 ALU 运算的标志 equal 信号进行逻辑与操作后,反馈到 IF 段控制多路选择器进行分支处理。
综上所述,每个流水寄存器中保存的信息包括:
由于流水线的特殊结构,所有指令都需要完整经过流水线的各功能段,只不过某些指令在某些功能段内没有任何实质性的操作,只是等待一个时钟周期,这也就意味着单条指令的执行时间还是 5 个功能段时间延迟的总和。下面简单描述图 5.19 中各流水段的执行过程。
在指令流水线中,可能会遇到一些情况使得流水线无法正确执行后续指令而引起流水线阻塞或停顿,这种现象称为流水线冒险。根据导致冒险的原因不同主要有 3 种:结构冒险(资源冲突)、数据冒险(数据冲突)和控制冒险(控制冲突)。
由于多条指令在同一时刻争用同一资源而形成的冲突,也称为资源冲突,即由硬件资源竞争造成的冲突,有以下两种解决办法:
当多条指令重叠处理时就会发生冲突,数据冒险可分为三类(结合综合题 3 理解):
解决的办法有以下几种:
stall)和软件插入“NOP”指令两种方法。
指令通常是顺序执行的,但在遇到改变指令执行顺序的情况(如执行转移、调用或返回等指令)时,会改变 PC 值,从而引起控制冒险。解决的办法有以下几种:
流水线的吞吐率是指在单位时间内流水线所完成的任务数量,或输出结果的数量。流水线吞吐率(
其中,
设
当连续输入的任务数
完成同样一批任务,不使用流水线与使用流水线所用的时间之比。
流水线加速比(S)的基本公式为:
其中,
将
当连续输入的任务数
有两种增加指令级并行的策略:
超标量流水线技术(动态多发射技术)通过配置多个功能部件,每个时钟周期内可并发多条独立指令,以并行操作方式将两条或多条指令编译并执行,如图 5.20 所示。
在简单的超标量 CPU 中,指令按顺序发射执行。为了提高并行性能,多数超标量 CPU 结合动态流水线调度技术,通过动态分支预测等手段实现指令乱序执行。
超长指令字技术(静态多发射技术)通过编译程序挖掘指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字(可达几百位),并采用多个处理部件执行。
如图 5.21 所示,流水线功能段划分得越多,时钟周期就越短,指令吞吐率也就越高。超流水线技术通过提高流水线主频来提升流水线性能。
然而,流水线级数越多,用于流水寄存器的开销也越大,因此流水线级数有一定限制,并不是越多越好。
超流水线 CPU 在流水线充满后,每个时钟周期还是执行一条指令(CPI=1),但其主频更高;多发射流水线 CPU 每个时钟周期可以处理多条指令(CPI<1)。相对而言,多发射流水线成本更高,控制更复杂。
计算机体系结构基于指令流和数据流的数量,分为 SISD、SIMD、MISD 和 MIMD 四类。常规的单处理器属于 SISD,多处理器则属于 MIMD。
SISD 是传统的串行计算机结构,通常包含一个处理器和一个存储器。处理器在一段时间内仅执行一条指令,按指令流顺序串行执行。为了提高速度,有些 SISD 计算机采用流水线方式,因此,SISD 处理器有时会设置多个功能部件,并采用多模块交叉方式组织存储器。前面介绍的内容多属于 SISD 结构。
SIMD 是指一个指令流同时对多个数据流进行处理,即数据级并行技术。SIMD 计算机通常由一个指令控制部件和多个处理单元组成。每个处理单元执行相同的指令,但每个单元都有自己的地址寄存器,这样每个单元就有不同的数据地址,因此,不同处理单元执行的同一条指令所处理的数据是不同的。一个顺序应用程序被编译后,可能按 SISD 组织并运行于串行硬件上,也可能按 SIMD 组织并运行于并行硬件上
SIMD 在使用 for
循环处理数组时最有效,例如,一条分别对 16 对数据进行运算的 SIMD 指令在 16 个 ALU 中同时运算,只需一次运算时间即可完成。但在使用 case
或 switch
语句时效率最低,每个执行单元必须根据不同的数据执行不同的操作。
MISD 是指同时执行多条指令,处理同一个数据,实际上不存在这样的计算机。
MIMD 是指同时执行多条指令分别处理多个不同的数据,分为多计算机系统和多处理器系统。
向量处理器是 SIMD 的变体,实现直接操作一维数组(向量)指令集的 CPU,在特定环境中提升性能,特别是在数值模拟等领域。
SIMD 和 MIMD 是两种并行计算模式,其中 SIMD 是数据级并行,MIMD 是并行程度更高的线程级并行或线程级以上并行计算模式。
传统 CPU 中,线程切换开销大,频繁切换会极大影响系统性能。硬件多线程通过提供单独的寄存器组和程序计数器,实现快速线程切换,减少开销。
硬件多线程有 3 种实现方式:细粒度多线程、粗粒度多线程和同时多线程(SMT)。
多个线程轮流交叉执行指令,多个线程的指令不相关,可乱序并行执行。处理器每个时钟周期切换线程,例如,时钟周期
仅在一个线程出现较大开销的阻塞时才切换线程,如 Cache 缺失。发生阻塞时,必须清除被阻塞的流水线,新线程的指令执行前需要重载流水线,因此,线程切换开销较大。
SMT 是上述两种多线程技术的变体,实现指令级并行和线程级并行。即在同一个时钟周期中,发射多个不同线程的多条指令执行。
Intel 处理器中的超线程(Hyper-threading)即 SMT,在单处理器或单核中设置两套线程状态部件,共享高速缓存和功能部件。
多核处理器是将多个处理单元集成到单个 CPU 中,每个处理单元称为一个核(core)。每个核可以有自己的 Cache,也可以共享同一个 Cache。所有核一般对称共享主存储器,因此多核属于共享存储的对称多处理器。图 5.23 是一个不共享 Cache 的双核 CPU 结构。
在多核计算机系统中,为充分发挥硬件性能,必须采用多线程或多进程执行,使每个核在同一时刻都有线程在执行。多核上的多个线程在物理上并行执行,是真正意义上的并行执行。
具有共享的单一物理地址空间的多处理器称为共享内存多处理器(SMP)。处理器通过存储器中的共享变量互相通信,所有处理器都能通过存取指令访问任何存储器位置。
单一地址空间的多处理器有两种类型:
早期计算机中,内存控制器未整合进 CPU,访存操作需经过北桥芯片(集成内存控制器并与内存相连)。CPU 通过前端总线和北桥芯片相连,这就是 UMA 架构。随着 CPU 性能提升和多核、多 CPU 的普及,前端总线成为瓶颈。为消除瓶颈,NUMA 架构诞生,内存控制器被集成到 CPU 内部,每个 CPU 都有独立的内存控制器,独立连接一部分内存,称为本地内存。CPU 之间通过 QPI 总线相连,可通过 QPI 总线访问其他 CPU 的远程内存。NUMA 架构下,访问本地内存比访问远程内存快。
多个处理器同时访问同一共享变量时,需通过对共享变量加锁的方式进行互斥访问。在一个时刻只能有一个处理器获得锁,其他处理器必须等待,直到该处理器解锁变量为止。