中央处理器

考点定位

  • 大纲章节:CPU 的功能和基本结构、指令执行过程、数据通路的功能和基本结构、控制器的功能和工作原理(硬布线/微程序)、指令流水线(含流水线冒险与对策、超标量与动态调度概念、多发射/超长指令字/多线程)
  • 常见题型:微操作序列书写(大题,配控制信号)、微指令编码字段设计与位数计算(选择/大题)、流水线时空图绘制与加速比/吞吐率计算(大题高频)、冒险类型判断与对策(选择)、寄存器可见性分类(选择)、硬布线与微程序对比(选择)
  • 考查频率:高(408 计组分值最重的一章,近十年几乎每年都有本章大题:流水线计算与微操作/微指令设计轮流出大题,选择题年年覆盖)
  • 前置知识:指令格式与寻址方式见指令系统;MAR/MDR 与主存读写时序见存储器层次结构;ALU 与补码运算见数据的表示和运算
  • 工程师读者注意:你天天接触的"乱序执行、分支预测"是工程语境,考试考的是教材口径的时空图计数、微命令层级定义、冒险三分类的准确定义——特别是"转发不能消除 load-use 停顿""字段直接编码要留全 0 状态"这类细粒度口径,按本节作答
  • 本章测验:CPU与指令流水线-章节测

一、CPU 的功能与基本结构

1.1 功能总览

CPU = 运算器 + 控制器 + 若干寄存器 + 内部总线/数据通路 + 中断系统。功能四条:

  1. 指令控制:控制指令的执行顺序(取指、PC 自增、转移)
  2. 操作控制:产生每条指令所需的微命令(控制信号)序列
  3. 时间控制:按节拍有序发出微命令(时序发生器)
  4. 数据加工:算术/逻辑运算(ALU)

外加中断处理:响应并处理异常与中断请求。

1.2 运算器的组成

运算器(ALU 部件)完成数据加工,典型组成:

部件作用
ALU核心运算电路,组合逻辑,本身不保存数据
通用寄存器组(ACC、MQ、R0~Rn 等)提供操作数、暂存结果
暂存器(Y、Z 或 TMP)缓存操作数/结果(因为 ALU 不能保持数据、内部总线一次只能送一个数)
状态/条件码寄存器(PSW/FLAGS)记录零、负、进位、溢出等标志
内部总线连接上述部件

1.3 控制器的组成

控制器是"指挥部":取指令、分析指令、执行指令(发微命令)、控制程序输入/输出及异常处理。典型组成:

部件作用
程序计数器 PC存放下一条指令的主存地址
指令寄存器 IR存放当前正在执行的指令
指令译码器 ID对 IR 中的操作码译码,识别指令
时序系统(时钟、节拍发生器)产生节拍/机器周期信号
微操作信号发生器(控制单元 CU)依据"操作码译码结果 + 时序 + 状态"产生微命令序列
中断系统(排队、向量形成等)响应中断

按实现方式分硬布线控制器与微程序控制器(见本章第四节,是考试重心)。

1.4 寄存器分类(用户可见性——选择题高频)

寄存器类别用户可见性说明
通用寄存器 R0~Rn / ACC / MQ数据/地址寄存器可见程序员可直接编程使用
基址寄存器 BR地址寄存器可见(常由系统管理)面向系统,地址变换
变址寄存器 IX地址寄存器可见面向用户,数组遍历
栈指针 SP地址寄存器可见指向栈顶
条件码寄存器(FLAGS)状态寄存器可见程序员可读、可测试(隐含设置)
程序计数器 PC控制/状态不可见(可间接影响)不能直接读写,但转移指令改变其值
指令寄存器 IR控制寄存器不可见指令流入后由硬件使用
MAR控制寄存器不可见CPU 与主存接口,程序员无法访问
MDR控制寄存器不可见同上
微指令寄存器 μIR控制寄存器不可见微程序控制器专用

记忆口诀:"通用地变栈标可见,P I 两 M μ 不可见"(PC、IR、MAR、MDR、μIR 对用户透明)。

二、指令执行过程

2.1 指令周期 → 机器周期 → 时钟周期

三层包含关系(自顶向下逐级细分):

指令周期⊇机器周期⊇时钟周期(节拍)\text{指令周期} \supseteq \text{机器周期} \supseteq \text{时钟周期(节拍)}

  • 指令周期:取出并执行完一条指令的全部时间。
  • 机器周期:完成一个基本操作(读/写一次主存等)的时间,常以存取周期为基准,含若干节拍。
  • 时钟周期(节拍):最小时间单位,一个时钟脉冲控制一拍。

一条指令的指令周期由若干机器周期组成。408 教材口径把机器周期细分为四类:

周期触发条件核心任务
取指周期 FE每条指令必有取出指令送 IR,PC 指向下一条
间址周期 IND指令采用间接寻址时才有取操作数的有效地址
执行周期 EX每条指令必有完成操作码规定的操作
中断周期 INT有中断请求且 CPU 开中断时才有保存断点、关中断、转向中断服务程序入口

2.2 取指周期完整推演(微操作 + 控制信号,大题模板)

设单总线结构 CPU(内部总线连接各寄存器),取指周期每拍微操作与控制信号(微命令)如下。这张表是微操作序列大题的"标准开头",必须能默写:

节拍微操作控制信号(微命令)数据流说明
T0(PC)→MAR(PC) \to MARPCout、MARinPC 内容经内部总线送 MAR,选中指令所在主存单元
T11→R1 \to R(发读命令);M(MAR)→MDRM(MAR) \to MDRRead、MDRin主存读,指令字经存储器数据线送入 MDR
T2(MDR)→IR(MDR) \to IRMDRout、IRin指令送 IR,随后指令译码器开始译码
T3(PC)+1→PC(PC)+1 \to PCPC 自增(PC+1 / PC+4,硬件加法器完成)形成下一条指令地址(定长指令可与此拍并行)

要点:PC 自增在取指周期内完成(工程直觉里"执行完才加"是错的);若指令字长与存储字长不等、或按字节编址取多字节指令,(PC)+Δ(PC)+\Delta 的 Δ\Delta 是指令字长(字节数)。

2.3 间址周期微操作(间接寻址指令专用)

任务:把形式地址 A 变换为有效地址 EA(或直接取得操作数)。以一次间址为例:

节拍微操作控制信号
T0(Ad(IR))→MAR(Ad(IR)) \to MARAd(IR)out(或 MDRout)、MARin
T11→R1 \to R;M(MAR)→MDRM(MAR) \to MDRRead、MDRin
T2(MDR)→Ad(IR)(MDR) \to Ad(IR)(EA 送回 IR 地址字段)MDRout、Ad(IR)in

N 重间址就重复 N 次间址周期,最后一步取出的是操作数本身(留在 MDR 供执行周期使用)。

2.4 中断周期微操作(响应中断的硬件动作)

触发条件:执行周期结束时检测到有中断请求且允许中断(开中断)。任务:保存断点、转向服务程序。采用堆栈保存断点的典型微操作序列:

节拍微操作控制信号说明
T0(SP)−1→SP(SP)-1 \to SPSP 自减修改栈指针
T1(SP)→MAR(SP) \to MARSPout、MARin栈顶单元地址送 MAR
T2(PC)→MDR(PC) \to MDR(断点 = 当前 PC)PCout、MDRin准备写入断点
T31→W1 \to W;(MDR)→M(MAR)(MDR) \to M(MAR)Write断点压栈
T4向量地址 →PC\to PC硬件向量法:由中断排队器 + 向量发生器形成服务程序入口送 PC
T50→EINT0 \to EINT(关中断)关中断命令防止响应过程被新中断打断

随后回到取指周期,执行中断服务程序的第一条指令。注意:执行中断服务程序是软件的事,中断周期只做上述硬件动作——选择题常在这里设错。

2.5 四类周期的数据流小结

周期数据流主干
取指PC→MAR→PC \to MAR \to 主存 →MDR→IR\to MDR \to IR;(PC)+Δ→PC(PC)+\Delta \to PC
间址Ad(IR)→MAR→Ad(IR) \to MAR \to 主存 →MDR→Ad(IR)\to MDR \to Ad(IR)(EA 回填)
执行视指令类型:寄存器/主存/ALU/PC(转移指令改 PC)
中断PC→MDR→PC \to MDR \to 主存栈顶;向量地址 →PC\to PC

三、数据通路的功能与基本结构

3.1 功能与组成

数据通路:数据在 CPU 功能部件之间传送的路径。由 ALU、通用寄存器、暂存器、内部总线、MAR/MDR(到主存的接口)以及各部件入口/出口的控制门(门控电路)组成。控制器发出的微命令(如 PCout、MARin)控制这些门的开/闭,从而决定数据"从哪来、到哪去"。

数据通路的基本结构有两类:

  1. CPU 内部总线方式(单总线/多总线):结构简单、灵活,但总线是独占资源,需要暂存器配合;速度受总线争用限制。
  2. 专用数据通路方式:根据指令需求为高频数据流向专门布线(多总线/直达线),无争用、速度快,但结构复杂、硬件多——RISC 流水线 CPU 的选择。

3.2 单总线结构:寄存器间传送如何实现

关键约束(选择题反复考):

  1. 同一时刻内部总线上只能有一个部件发送数据(多个 out 不能同拍打开);但可以有多个接收方(多个 in 同时有效)。
  2. ALU 是组合逻辑电路,输入端必须保持稳定才能得到正确输出,且输出不能直接挂回总线形成环——所以一端接暂存器 Y(锁存总线来的操作数),输出经暂存器 Z 再回总线。
  3. 单总线结构中,一个操作数来自 Y(上一拍锁存),另一个来自总线,所以两个寄存器相加至少要 3 拍。

3.3 典型传送的微操作序列(大题标准写法)

例 1:寄存器间传送 (R0)→R1(R0) \to R1

节拍微操作控制信号
T0(R0)→R1(R0) \to R1R0out、R1in(一拍完成)

例 2:寄存器加法 (R1)+(R2)→R3(R1) + (R2) \to R3

节拍微操作控制信号
T0(R1)→Y(R1) \to YR1out、Yin
T1(Y)+(R2)→Z(Y) + (R2) \to ZR2out、Add(ALU 加法微命令)、Zin
T2(Z)→R3(Z) \to R3Zout、R3in

注意 T1 拍 R2out 打开时 Y 闭锁保持 R1 的值,ALU 两输入端 (Y)(Y) 与总线(R2)稳定,结果锁入 Z——这就是"暂存器存在的理由"。

例 3:从主存取数 (R1)(R1) 间接寻址加法 ADD R0,(R1)(取指 + 执行全序列)

节拍微操作控制信号周期
T0(PC)→MAR(PC) \to MARPCout、MARin取指
T1M(MAR)→MDRM(MAR) \to MDRRead、MDRin取指
T2(MDR)→IR(MDR) \to IRMDRout、IRin取指
T3(PC)+1→PC(PC)+1 \to PCPC 自增取指
T4(R1)→MAR(R1) \to MARR1out、MARin执行(寄存器间接取操作数地址)
T5M(MAR)→MDRM(MAR) \to MDRRead、MDRin执行
T6(MDR)→Y(MDR) \to YMDRout、Yin执行
T7(Y)+(R0)→Z(Y)+(R0) \to ZR0out、Add、Zin执行
T8(Z)→R0(Z) \to R0Zout、R0in执行

例 4:写主存(存数)指令 STA addr,(ACC) 写入直接地址 addr 单元

节拍微操作控制信号周期
T0~T3同取指四步同 2.2 表取指
T4Ad(IR)→MARAd(IR) \to MARAd(IR)out、MARin执行
T5(ACC)→MDR(ACC) \to MDRACCout、MDRin执行
T61→W1 \to W;(MDR)→M(MAR)(MDR) \to M(MAR)Write执行

写法口诀:"源 out、目的 in,经过总线一拍一传送;ALU 进出靠 Y、Z;访存必经 MAR/MDR"。

3.3 多总线结构与专用通路

结构特点一条寄存器加法耗时适用
单总线一条内部总线,需 Y/Z 暂存3 拍教学、结构简单
双总线两操作数各占一条总线同时送 ALU,结果仍需暂存(或第三条总线)2 拍(或 1 拍)折中
三总线两条输入总线 + 一条输出总线1 拍高性能
专用通路按数据流向专门布线(如 PC→MAR 直连、转发旁路线)视设计RISC 流水线 CPU

考试大多以单总线为背景(微操作序列大题);流水线一节默认专用通路(否则一拍一个阶段做不到)。

四、控制器:硬布线与微程序

4.1 控制器的功能与两类实现

控制单元 CU 的输入:操作码译码信号、时序信号(节拍/机器周期)、状态反馈(FLAGS、中断请求);输出:微命令(控制信号)序列。产生微命令序列的方式有两类:

  1. 组合逻辑(硬布线)控制器:用组合逻辑电路直接由输入"算出"微命令。速度快,但设计/修改困难,指令功能扩展要改电路——适合 RISC。
  2. 微程序控制器:把每条指令的微命令序列编成微程序存入控制存储器(ROM),执行指令 = 执行对应微程序。规整、易扩展(改 ROM 内容即可),但每条微指令都要访问控存,速度慢——适合 CISC。

4.2 微程序控制器的层级定义(名词链条,选择高频)

微命令(一个控制信号)→组合微指令→序列微程序→解释一条机器指令机器指令\text{微命令(一个控制信号)} \xrightarrow{\text{组合}} \text{微指令} \xrightarrow{\text{序列}} \text{微程序} \xrightarrow{\text{解释一条机器指令}} \text{机器指令}

术语严格定义
微命令控制部件向执行部件发出的最基本控制信号(如 PCout、MARin、Read)。是"发令",执行部件收到后完成的动作叫微操作(微命令是因,微操作是果;注意相容微命令可同拍并行,互斥微命令不可)
微指令同一节拍(CPU 周期)内可以并行执行的一组微命令的组合 + 顺序控制信息。格式 = 操作控制字段 + 顺序控制字段(判别测试字段 + 下地址字段)
微程序实现一条机器指令功能的微指令序列。每条机器指令对应一段微程序;取指微程序是所有指令公用的,放在控存固定位置
控制存储器 CMCPU 内的 ROM,存放全部微程序;其字长 = 微指令字长,容量 = 微指令条数
μAR(CMAR)微地址寄存器,指向下一条要读的微指令(相当于微程序世界的 PC)
μIR(CMDR)微指令寄存器,存放从控存读出的微指令

执行机器指令的流程:公共取指微程序取出指令 → 操作码经微地址形成部件(映射机构)产生该指令微程序的入口地址 → 逐条执行微指令 → 结束后回到取指微程序。

4.3 微指令的编码方式(位数计算——计算大题高频)

操作控制字段的三种编码方式:

(1)直接编码(直接控制)方式:每一位对应一个微命令,"1"发出、"0"不发出,无需译码。

操作控制字段位数=微命令个数 N\text{操作控制字段位数} = \text{微命令个数 } N

优点:速度快、并行能力强(各位独立);缺点:字长太长(几十个微命令就要几十位)。

(2)字段直接编码方式:把互斥的微命令分成一组(一个字段),字段内的编码经译码器产生微命令;相容(可并行)的微命令必须分在不同字段。每个字段要留一个编码(通常 000)表示"该字段不发出任何微命令":

第 i 字段位数 ni=⌈log⁡2(字段内微命令数+1)⌉,操作控制字段位数=∑ini\text{第 } i \text{ 字段位数 } n_i = \lceil \log_2(\text{字段内微命令数} + 1) \rceil, \qquad \text{操作控制字段位数} = \sum_i n_i

优点:显著缩短字长;缺点:要经过译码器,速度略慢;微命令分组需人工分析互斥性。

(3)字段间接编码方式:某字段译码后的含义还要由另一字段的编码参与解释(字段间联动)。可进一步压缩字长,但削弱了并行性、译码更复杂,通常作为字段直接编码的补充。

高频陷阱:字段 3 位 ≠ 能编码 8 个微命令,留全 0 状态后只有 23−1=72^3-1 = 7 个。

4.4 微地址(后继微指令地址)的形成方式

方式原理特点
增量方式(计数器方式)后继微地址 = μPC+1\mu PC + 1(顺序执行时);转移时由转移微指令给出目标微地址与 PC 机制类似,顺序执行零额外信息,微指令字可不含下址字段(短);但转移要占用专门的转移微指令,速度受影响
断定方式(下址字段方式)微指令中设下地址字段,直接给出后继微指令地址(无条件跳转零开销);配合判别测试字段,按测试结果从多个候选中"断定"一个灵活(可随意跳转)、执行快;微指令字较长(下址字段要 log⁡2(控存容量)\log_2(\text{控存容量}) 位)

此外还有两类"入口/特殊地址"来源:由机器指令操作码映射(经微地址形成部件产生微程序入口,也称"功能转移")和由硬件直接产生(如中断向量地址、复位后取指微程序首地址)。断定方式中,判别测试字段 PP 指明要不要测试外部状态(如 FLAGS、中断请求),不测试则直接取下址字段。

4.5 水平型与垂直型微指令

对比项水平型微指令垂直型微指令
定义一条微指令并行定义多个微命令,直接控制多个门类似机器指令风格:操作码 + 地址码,一条微指令只完成一个基本操作
微指令字长长短(通常 3~4 位操作码 + 少量地址位)
并行能力强(一拍多个微操作)弱(一拍一个)
微程序长度短长
执行速度快慢(需译码且拍数多)
编写难度难(要熟悉数据通路细节)易(类似汇编)
用户熟悉硬件的设计者不必了解硬件的用户

字段直接/间接编码都是水平型微指令采用的压缩手段;水平型 ≠ 字段直接编码(水平型也可全直接编码)。混合型微指令介于两者之间。常考判断:"水平型微指令的并行操作能力比垂直型强"——对;"垂直型微指令就是字段间接编码"——错。

4.6 硬布线与微程序控制器对比

对比项硬布线控制器微程序控制器
实现原理组合逻辑电路直接产生微命令存储逻辑:微程序(ROM 控存)产生微命令
速度快(信号仅经门延迟)慢(每步都要读控存)
规整性/扩展性差,改指令要改电路好,改 ROM 内容即可(增删指令方便)
指令复杂度适应性适合简单、规整指令集适合复杂指令(CISC)
应用RISC CPUCISC CPU(x86 微码即此思想的现代演进)
电路规模随指令数指数膨胀控存容量与微指令数成正比

记忆锚点:"硬布线快而难改(RISC),微程序慢而易改(CISC)"。

五、指令流水线

5.1 流水线的基本思想与分类

流水线 = 把重复性任务分解为若干子过程,各子过程用独立部件并行处理重叠的不同对象——时间并行(与"资源重复"的空间并行相对)。按级别分:指令流水线(部件级→处理机级)、算术流水线(部件级)、处理机级/处理机间流水线(宏流水)。

流水线有效工作的条件(选择考点):

  1. 各段耗时尽量相等(否则最慢段成为瓶颈,时钟周期取最长段时间);
  2. 只有连续不断的同类任务流入才能发挥效益(断流即损失);
  3. 需要专门的流水寄存器/锁存器隔离各段(各段并行工作在不同指令上)。

5.2 五段流水线结构(MIPS 风格,408 标准模型)

段名称功能关键部件
IF取指按 PC 从指令存储器取指令,PC+4IM(指令 Cache)、加法器
ID译码/取数指令译码,从寄存器堆读源操作数译码器、寄存器堆
EX执行ALU 运算、有效地址计算、分支条件判定ALU
MEM访存仅 lw/sw 访问数据存储器DM(数据 Cache)
WB写回结果写回寄存器堆寄存器堆写口

设计要点(后面算冒险的根据):寄存器堆采用同一拍"前半周期写、后半周期读"(WB 与依赖它的 ID 可同拍);指令存储器与数据存储器分体(或分 I-Cache/D-Cache),否则取指与取数冲突。

5.3 时空图(大题必考,表格化)

可单步逐拍点亮、切换冒险模式的交互动画见交互演示页"指令流水线时空图"。以下为 8 条指令、5 段、无冒险的理想时空图(行 = 指令,列 = 时钟周期):

指令 \ 时钟123456789101112
I1IFIDEXMEMWB
I2IFIDEXMEMWB
I3IFIDEXMEMWB
I4IFIDEXMEMWB
I5IFIDEXMEMWB
I6IFIDEXMEMWB
I7IFIDEXMEMWB
I8IFIDEXMEMWB

填满期(第 5 拍起)每拍流出一条指令;总时间 =(k+n−1)Δt= (k + n - 1)\Delta t(k=5k=5 段、n=8n=8 条:1212 拍)。

5.4 性能指标:吞吐率、加速比、效率(公式 + 例题)

设流水线分 kk 段、每段时间 Δt\Delta t(不等长时 Δt\Delta t 取最长段)、连续处理 nn 条指令、额外停顿 ss 拍:

T总=(k+n−1+s) ΔtT_{\text{总}} = (k + n - 1 + s)\,\Delta t

吞吐率 Tp=n(k+n−1+s) Δt,最大吞吐率 Tpmax⁡=1Δt\text{吞吐率 } T_p = \frac{n}{(k+n-1+s)\,\Delta t}, \qquad \text{最大吞吐率 } T_{p\max} = \frac{1}{\Delta t}

加速比 S=T串行T流水=nk Δt(k+n−1+s) Δt=nkk+n−1+s  →  n→∞    k\text{加速比 } S = \frac{T_{\text{串行}}}{T_{\text{流水}}} = \frac{nk\,\Delta t}{(k+n-1+s)\,\Delta t} = \frac{nk}{k+n-1+s} \;\xrightarrow{\;n\to\infty\;}\; k

效率 E=各段有效工作时间之和各段总时间之和=nk Δtk(k+n−1+s) Δt=nk+n−1+s\text{效率 } E = \frac{\text{各段有效工作时间之和}}{\text{各段总时间之和}} = \frac{nk\,\Delta t}{k(k+n-1+s)\,\Delta t} = \frac{n}{k+n-1+s}

三个必须内化的结论:加速比上限是段数 kk(nn 不大时远达不到);停顿 ss 直接进分母;Δt\Delta t 由瓶颈段决定(某段 2 拍其他 1 拍,时钟周期不变但该段占 2 格)。

例题 1(模拟题) 五段流水线,时钟周期 1 ns,执行 12 条指令,其中 2 次 load-use 冒险各停 1 拍,其余无冒险。求总时间、加速比、实际吞吐率。

解:T=(5+12−1+2)×1=18T = (5 + 12 - 1 + 2)\times 1 = 18 ns;S=12×518≈3.33S = \dfrac{12\times5}{18} \approx 3.33;Tp=1218≈0.67T_p = \dfrac{12}{18} \approx 0.67 条/ns。错因提醒:漏加停顿 2 拍(算成 16 拍)是最常见失误。

例题 2(模拟题) 某流水线 5 段,各段时间为 10、8、10、12、6 ns。时钟周期取多少?执行 100 条指令的总时间?

解:瓶颈段 12 ns → Δt=12\Delta t = 12 ns。总时间 =(5+100−1)×12=1248= (5+100-1)\times 12 = 1248 ns。若被问"该流水线可再细分瓶颈段为两段各 6 ns",时钟周期变为 10 ns——改造题的套路。

5.5 流水线冒险三类:定义与对策(选择大题双高频)

(1)结构冒险(资源冲突)

定义:多条指令同拍争用同一硬件资源(同一存储器、同一功能部件)。 典型:第 ii 条在 MEM 段取操作数、第 i+3i+3 条同拍在 IF 段取指令,二者争同一主存。 对策:① 资源重复——指令存储器与数据存储器分体(I-Cache/D-Cache 分离,这是哈佛结构的由来);② 让后者暂停一拍(气泡);③ 预取指令队列缓冲。

(2)数据冒险(数据相关)

定义:后一条指令需要的操作数要等前一条指令产生——流水线重叠使"写"还没发生"读"就要发生。三种相关:RAW(写后读,最主要)、WAR(读后写)、WAW(写后写);按序单发射五段流水线只可能发生 RAW。 典型:add $t0,$t1,$t2 之后紧跟 sub $t4,$t0,$t3($t0 还没写回,sub 就要读)。

对策:

  1. 暂停/插入气泡(stall):硬件检测到依赖,让后续指令在 ID 段等待,重复该拍。通用但损失性能。
  2. 转发/旁路(forwarding / bypass):把 EX 段 ALU 的输出(或 MEM 段的数据)经专用通路直接送到后续指令 EX 段的 ALU 输入端,不等 WB 写回寄存器堆。能消除大多数 RAW 停顿。
  3. load-use 冒险必然残留 1 拍:lw 的数据在 MEM 段末才有,紧随其后的指令 EX 段在 MEM 段前一拍就要用——转发也救不了,必须停 1 拍(MEM→EX 转发只能延后一拍)。
  4. 编译器调度(软件):把无关指令插到依赖指令之间,填充气泡。

例题 3(模拟题) 五段流水线(寄存器堆同拍先写后读),序列:lw $t0,0($s1);add $t2,$t0,$t1。分别求无转发、有转发时的停顿拍数。

解:无转发时 add 的 ID 段最早与 lw 的 WB 同拍(第 5 拍),比正常(第 3 拍)晚 2 拍 → 停 2 拍;有转发(MEM→EX)时 add 的 EX 延至 lw 的 MEM 下一拍 → 停 1 拍。错因提醒:以为"有转发就零停顿"——load-use 至少 1 拍,这是选择题最爱。

(3)控制冒险(转移冲突)

定义:转移/分支指令(以及中断、异常)改变执行顺序,而在分支方向确定前,后续指令地址未知,流水线已预取的指令可能作废。 对策:

  1. 尽早判定分支:把比较与目标地址计算从 EX 提前到 ID 段(增加专用比较器),预测错误代价从 2 拍降为 1 拍。
  2. 分支预测:静态(编译期固定:总是预测不转移/按循环回边预测转移/ opcode 位)与动态(硬件记录历史:2 位饱和计数器、分支目标缓冲器 BTB 缓存目标地址)。预测对则零代价,错则冲刷流水线。
  3. 延迟转移(延迟槽):编译器把一条与分支无关的指令填到分支指令后的"延迟槽"中,无论分支是否转移它都照常执行(RISC 经典)。
  4. 预取两个方向的指令(分支目标与顺序后继各存一份),判定后弃其一。

5.6 超标量与动态调度(概念题)

超标量(superscalar):CPU 内置多条并行流水线/多套功能部件,每个时钟周期发射多条指令(发射度 2、4……)。静态超标量靠编译器排序,动态超标量靠硬件(指令窗口)乱序取多条。CPI < 1,但不改变串行语义——数据冒险仍需转发/暂停,只是并行摊薄。与超流水对比:超标量是空间并行(资源重复),超流水是时间并行(段更细分、主频更高)。

动态调度:硬件在运行时重排指令执行顺序以消除停顿(乱序执行、按序完成)。经典方案:记分牌(Scoreboard)算法、Tomasulo 算法(保留站 + 寄存器换名,缓解 WAR/WAW)。相关硬件还包括重排序缓冲 ROB 支持精确异常。本考点只考概念,不考算法细节。

六、高级技术简要(大纲:了解)

技术一句话定义关键属性
多发射每拍发射多条指令(含超标量静态/动态、VLIW 两条路线)CPI < 1
超长指令字 VLIW编译器把多个可并行操作打包进一条超长指令(可达数百位),硬件不需复杂调度逻辑完全静态调度;代码膨胀、兼容性差(EPIC/Itanium 是其演进)
超流水线把段切得更细(更多段),提高时钟频率段多 → 冒险代价更大(预测错冲刷更多拍)、分支预测要求更高
多线程硬件维护多个线程上下文(多组 PC/寄存器),一个线程停顿时切换/混发另一个细粒度(每拍切换,延迟大)、粗粒度(长停顿才切换)、SMT 同时多线程(同拍多线程混合发射;超线程即 SMT)

辨析一句话:超标量/VLIW 提高单线程指令级并行;多线程挖掘线程级并行,用无关线程的指令填充流水线气泡(掩盖 Cache 缺失等长停顿)。

例题

例题 4(模拟题) 单总线 CPU(含 Y、Z 暂存器),写出指令 SUB R2, R3((R2)−(R3)→R2(R2)-(R3)\to R2)取指与执行阶段的完整微操作及控制信号序列。

解:取指 4 步同 2.2 节表(PCout/MARin → Read/MDRin → MDRout/IRin → PC+1);执行 3 步:T4:R2out、Yin((R2)→Y(R2)\to Y);T5:R3out、Sub、Zin((Y)−(R3)→Z(Y)-(R3)\to Z);T6:Zout、R2in((Z)→R2(Z)\to R2)。共 7 拍。错因提醒:把两个源操作数同拍送总线(R2out、R3out 同时有效)违反单总线约束。

例题 5(模拟题) 某机共 20 个微命令,分为 4 个互斥组(各组 4、5、7、4 个),采用字段直接编码;判别测试字段 2 位;控存容量 512 条微指令。求微指令字长。

解:操作控制字段 = ⌈log⁡2(4+1)⌉+⌈log⁡2(5+1)⌉+⌈log⁡2(7+1)⌉+⌈log⁡2(4+1)⌉=3+3+3+3=12\lceil\log_2(4+1)\rceil + \lceil\log_2(5+1)\rceil + \lceil\log_2(7+1)\rceil + \lceil\log_2(4+1)\rceil = 3+3+3+3 = 12 位;下址字段 = log⁡2512=9\log_2 512 = 9 位;总字长 =12+2+9=23= 12 + 2 + 9 = 23 位。错因提醒:字段 7 个微命令只写 log⁡27=2.8\log_2 7 = 2.8 取 3 位是碰巧对,规范算法必须"+1 留空状态";若不留(每字段都必发一个微命令)才能用 log⁡27\log_2 7——题目没说明时按留全 0 处理。

例题 6(模拟题) 五段流水线执行下列 6 条指令:I1 为 lw,I2 为 add 且与 I1 构成 load-use 冒险(有转发),I3、I4、I5 与前无关,I6 为无条件转移 jmp(目标在 ID 段末确定并冲刷后续预取)。画出时空图并求总时间与实际加速比。

解:load-use 有转发停 1 拍——I2 的 ID 重复一拍,其后指令逐级顺延一拍。时空图(行 = 指令,列 = 时钟,停顿逐拍推演可单步观察,见交互演示页"指令流水线时空图";"IF×"表示该拍指令滞留在 IF 等待):

指令 \ 时钟12345678910111213
I1 lwIFIDEXMEMWB
I2 addIFIDIDEXMEMWB
I3IFIF×IDEXMEMWB
I4IFIF×IDEXMEMWB
I5IFIF×IDEXMEMWB
I6 jmpIFIF×ID(冲刷)
目标IFIDEXMEMWB

I6 的 ID 在第 8 拍末确定转移目标。大题务必先声明口径再计算(评卷按声明的口径给步骤分):

  • 口径 A(I6 在 ID 段末即完成转移动作、其后无操作):6 条指令总时间 =8= 8 拍,S=6×58=3.75S = \dfrac{6\times5}{8} = 3.75;
  • 口径 B(把目标指令也算入并算到其 WB 完成):共 7 条、总时间 =13= 13 拍,S=7×513≈2.69S = \dfrac{7\times5}{13} \approx 2.69。

错因提醒:① 画时空图时停顿会向后传染——I2 停一拍,I3~I6 全部顺延一拍(不是只有 I2 受影响);② 转移指令的目标要重新从 IF 开始走完整流水线,不能"接在 I6 后面继续排"。

例题 7(模拟题) 微程序控制器中,机器指令的操作码如何变成微程序入口地址?

解:取指微程序取出指令后,IR 中的操作码经微地址形成部件(映射机构)做"操作码 → 控存地址"的变换(如操作码左移/拼接常数前缀),得到该指令微程序在控存中的入口地址送 μAR;随后按增量或断定方式执行后续微指令,执行完回到取指微程序入口(固定地址,硬件产生)。错因提醒:"操作码本身就是控存地址"通常不成立,除非设计成一一映射——考试说"经微地址形成部件(映射)产生"最稳。

常见坑

  1. PC 自增发生在取指周期内,不在执行周期;取指结束 PC 已指向下一条指令。
  2. 间址周期不是每条指令都有;一次间址一个间址周期,N 重间址 N 个。执行周期才是每条指令必有。
  3. 中断周期只做硬件动作(存断点、关中断、送向量地址),执行服务程序不属于中断周期。
  4. 单总线同一时刻只能一个部件发送(一个 out),但可以多个接收(多个 in 同拍有效)。
  5. ALU 是组合逻辑、不能保持数据:两个寄存器相加必须借 Y、Z,单总线结构至少 3 拍;"R1out、R2out 同拍"是错误序列。
  6. 微命令是"控制信号"(因),微操作是"执行的动作"(果);相容微命令可同拍并行,互斥微命令不能放同一字段(字段直接编码按互斥性分组)。
  7. 字段直接编码每字段留一个全 0 状态:nn 位字段最多 2n−12^n - 1 个微命令;直接编码才是"位数 = 微命令数"。
  8. 水平型微指令:字长长、并行强、微程序短、速度快;垂直型相反——"水平型字长短"是高频错误选项。
  9. 断定方式靠下址字段直接给后继微地址(微指令字长变长);增量方式靠 μPC+1\mu PC+1(字短,转移要专门微指令)。
  10. 加速比公式分母含停顿 ss:(k+n−1+s)Δt(k+n-1+s)\Delta t;时钟周期由最长段决定,不是平均值。
  11. 转发不能消除 load-use:至少停 1 拍;无转发 load-use(同拍先写后读假设下)停 2 拍。数值取决于假设,做题先声明"寄存器堆同拍前半写后半读"是否成立。
  12. 三类冒险对策不要张冠李戴:结构冒险→资源重复/暂停;数据冒险→转发/暂停/调度;控制冒险→预测/延迟槽/提前判定。
  13. 超标量与超流水的方向:超标量空间并行(每拍多发射)、超流水时间并行(更细分段提主频);VLIW 的调度者是编译器不是硬件。
  14. WAR/WAW 在按序五段流水线中不会发生,动态调度(乱序)才引入;说"五段流水线可能发生 WAW"是错的。
  15. 每条机器指令对应一段微程序,但取指微程序是公用的,不重复存放——算控存容量别重复计。

自测

  1. 单总线结构(含 Y、Z)中,完成 AND R1, R2((R1)∧(R2)→R1(R1)\wedge(R2)\to R1)执行阶段需要几拍?写出每拍微操作与控制信号。
  2. 某机 25 个微命令分 5 个互斥组(5、6、7、3、4 个),字段直接编码;判别字段 1 位,控存 1024 条微指令。微指令字长多少位?
  3. 列出中断周期必须完成的 3 件硬件任务。
  4. 六段流水线执行 20 条指令,时钟周期 2 ns,其中 3 次冒险各停 1 拍。求总时间、加速比与实际吞吐率。
  5. 判断并改错:a) 垂直型微指令并行能力比水平型强;b) 字段间接编码中某字段的含义需另一字段参与解释;c) 分支预测属于数据冒险对策。

自测答案与简析

  1. 3 拍:T0:(R1)→Y,R1out、Yin;T1:(Y)∧(R2)→Z,R2out、And、Zin;T2:(Z)→R1,Zout、R1in。与加法结构完全一致,只换 And 微命令。
  2. 3+3+3+2+3=143+3+3+2+3 = 14 位操作控制字段(5→3、6→3、7→3、3→2、4→3,均"+1 留空"),下址 log⁡21024=10\log_2 1024 = 10 位,判别 1 位,共 14+1+10=2514+1+10 = 25 位。
  3. 保存断点(PC 压栈或存指定单元)、关中断(0→0\toEINT)、向量地址送 PC(转向服务程序入口)。
  4. T=(6+20−1+3)×2=56T = (6+20-1+3)\times 2 = 56 ns;S=20×628≈4.29S = \dfrac{20\times6}{28} \approx 4.29;Tp=2056≈0.36T_p = \dfrac{20}{56}\approx 0.36 条/ns。
  5. a) 错,水平型并行能力强(垂直型一条微指令只做一个基本操作);b) 对;c) 错,分支预测是控制冒险对策(数据冒险是转发/暂停/调度)。