Appearance
题目
某 16 位计算机中,带符号整数用补码表示,数据 Cache 和指令 Cache 分离。下表给出了指令系统中部分指令格式,其中 Rs 和 Rd 表示寄存器,mem 表示存储单元地址,(x) 表示寄存器 x 或存储单元 x 的内容。
指令系统中部分指令格式
| 名称 | 指令的汇编格式 | 指令功能 |
|---|---|---|
| 加法指令 | ADD Rs, Rd | (Rs) + (Rd) → Rd |
| 算术/逻辑左移 | SHL Rd | 2 × (Rd) → Rd |
| 算术右移 | SHR Rd | (Rd) / 2 → Rd |
| 取数指令 | LOAD Rd, mem | (mem) → Rd |
| 存数指令 | STORE Rs, mem | (Rs) → mem |
该计算机采用 5 段流水方式执行指令,各流水段分别是取指(IF)、译码/读寄存器(ID)、执行/计算有效地址(EX)、访问存储器(M)和结果写回寄存器(WB),流水线采用 “按序发射,按序完成” 方式,没有采用转发技术处理数据相关,并且同一个寄存器的读和写操作不能在同一个时钟周期内进行。请回答下列问题:
题 44 图:题(3) x=a+b 的指令序列与流水线执行过程
I1 LOAD R1, [a]
I2 LOAD R2, [b]
I3 ADD R1, R2
I4 STORE R2, [x](1) 若 int 型变量 x 的值为 -513,存放在寄存器 R1 中,则执行指令 “SHR R1” 后,R1 的内容是多少(用十六进制表示)?
(2) 若某个时间段中,有连续的 4 条指令进入流水线,在其执行过程中没有发生任何阻塞,则执行这 4 条指令所需的时钟周期数为多少?
(3) 若高级语言程序中某赋值语句为 x=a+b,x、a 和 b 均为 int 型变量,它们的存储单元地址分别表示为[x]、[a]和[b]。该语句对应的指令序列及其在指令流水线中的执行过程如下图所示。
则这 4 条指令执行过程中, I3 的 ID 段和 I4 的 IF 段被阻塞的原因各是什么?
(4) 若高级语言程序中某赋值语句为 x=x*2+a,x 和 a 均为 unsigned int 类型变量,它们的存储单元地址分别表示为[x]、[a],则执行这条语句至少需要多少个时钟周期?要求模仿题 44 图画出这条语句对应的指令序列及其在流水线中的执行过程示意图。
解析
本题考查 5 段静态流水线在 没有转发 且 同一寄存器读写不能在同一周期 这两个限制下,数据相关导致的阻塞数。判断要点:
- 后面指令的 ID 段(读寄存器)必须晚于前面指令的 WB 段(写寄存器)至少 1 个周期;
- "按序发射、按序完成" 意味着后一条指令的 IF 不能跑到前一条之前——前一条阻塞,后一条 IF 也跟着堵在那。
汇编约定(从 (3) 可推断):ADD Rs, Rd 表示 Rd ← Rs + Rd(第二操作数是目的);STORE Rs, [m] 表示把 Rs 存入主存 m;SHR Rd / SHL Rd 是单操作数移位。
(1) 执行 SHR R1 后 R1 的内容 [2 分]
Step 1. 算 −513 的 16 位补码。
取反加 1:
即指令执行前 R1 = 1111 1101 1111 1111B = FDFFH。
Step 2. 算术右移 1 位(保符号)。
x 是 int,右移要保留符号位(即算术右移,原符号位填回最高位):
R1 = FEFFH,对应十进制 −257(恰好等于 向下取整)。
易错点: 带符号整数右移要做"算术右移"(高位补符号位),不是逻辑右移(高位补 0)。本题如果按逻辑右移得 7EFFH 就错了——会把负数搞成正数。
(2) 4 条无阻塞指令的执行周期数 [2 分]
理想情况 5 段流水线无阻塞、不停顿:第 1 条进 IF,第 5 个周期它走到 WB;之后每周期完成 1 条。
通用公式: 条指令、 段流水线,最少 个周期。
(3) I3 的 ID 与 I4 的 IF 阻塞原因 [3 分]
I3 ADD R1, R2: 同时读 R1 和 R2。
- R1 由 I1(LOAD R1, [a])写回,I1 WB 在第 5 周期;
- R2 由 I2(LOAD R2, [b])写回,I2 WB 在第 6 周期。
由"读写不可同周期"约束,I3 最早可在 第 7 周期 进入 ID(紧跟 I2 WB 之后)。但 I3 IF 在第 3 周期就完成,中间需阻塞 3 个周期等待数据就绪 → 数据冒险(RAW)。
I4 STORE R2, [x]: I4 IF 阻塞是 结构性传递——因为流水线"按序发射",I4 的 IF 不能超过 I3。当 I3 卡在 ID 段时,I3 占着 IF→ID 入口,I4 的 IF 完成后无法把"位置"腾给后续指令,被迫陪 I3 一起停。简言之,I4 IF 阻塞是 I3 ID 阻塞造成的连锁反应。
易错点: I4 自身和前面的指令并无数据冒险(STORE R2 只读 R2,I2 早写完了),它纯粹是被 I3 的阻塞"带累"的。这是"按序发射"模式的代价;乱序流水线就可以让 I4 越过 I3 先做。
(4) x = x*2 + a 的指令序列与执行周期 [4 分]
Step 1. 写指令序列(5 条)。
I1 LOAD R1, [x]
I2 LOAD R2, [a]
I3 SHL R1 ; 也可写成 ADD R1, R1,等价于 R1 ← x * 2
I4 ADD R1, R2 ; R2 ← R1 + R2 = x*2 + a
I5 STORE R2, [x]Step 2. 排流水线时序(找数据冒险点)。
| 关系 | 原因 | I 的最早 ID 周期 |
|---|---|---|
| I3 → I1 | I3 读 R1,I1 在 WB 5 写 R1 | 6 |
| I4 → I3 | I4 读 R1,I3 在 WB 9 写 R1 | 10 |
| I4 → I2 | I4 读 R2,I2 在 WB 6 写 R2 | 7(被上一条覆盖到 10) |
| I5 → I4 | I5 读 R2,I4 在 WB 13 写 R2 | 14 |
Step 3. 画时序图。
Step 4. 总周期数。
I5 WB 在第 17 周期完成 → 整条赋值语句 最少需要 17 个时钟周期。
易错点: 数据冒险的"等待长度"公式:。本题 I3 IF 在 3,正常 ID 应在 4;I1 WB 在 5;故 I3 ID 推迟到 6,需阻塞 周期。逐条这样算更不容易漏。
编者注(生僻术语): "数据冒险(Data Hazard)"专指由数据依赖引起的流水线停顿,分 RAW、WAR、WAW 三种。本题这种"读旧值"的 RAW 冒险最常见。现代 CPU 用 转发 / 旁路(forwarding) 在 EX/MEM 阶段就把结果送给后续指令,可消除大部分 RAW 阻塞——这正是题干强调"未采用转发技术"的原因。