Skip to content

2012年 408 计算机组成原理 第 44 题

计算机组成原理2012年综合题13分

题目

某 16 位计算机中,带符号整数用补码表示,数据 Cache 和指令 Cache 分离。下表给出了指令系统中部分指令格式,其中 Rs 和 Rd 表示寄存器,mem 表示存储单元地址,(x) 表示寄存器 x 或存储单元 x 的内容。

指令系统中部分指令格式

名称指令的汇编格式指令功能
加法指令ADD Rs, Rd(Rs) + (Rd) → Rd
算术/逻辑左移SHL Rd2 × (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]
指令 \ 周期1234567891011121314I1IFIDEXMWBI2IFIDEXMWBI3IF******IDEXMWBI4IF******IDEXMWB

(1) 若 int 型变量 x 的值为 -513,存放在寄存器 R1 中,则执行指令 “SHR R1” 后,R1 的内容是多少(用十六进制表示)?

(2) 若某个时间段中,有连续的 4 条指令进入流水线,在其执行过程中没有发生任何阻塞,则执行这 4 条指令所需的时钟周期数为多少?

(3) 若高级语言程序中某赋值语句为 x=a+bxab 均为 int 型变量,它们的存储单元地址分别表示为[x][a][b]。该语句对应的指令序列及其在指令流水线中的执行过程如下图所示。

则这 4 条指令执行过程中, I3 的 ID 段和 I4 的 IF 段被阻塞的原因各是什么?

(4) 若高级语言程序中某赋值语句为 x=x*2+axa 均为 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 → I1I3 读 R1,I1 在 WB 5 写 R16
I4 → I3I4 读 R1,I3 在 WB 9 写 R110
I4 → I2I4 读 R2,I2 在 WB 6 写 R27(被上一条覆盖到 10)
I5 → I4I5 读 R2,I4 在 WB 13 写 R214

Step 3. 画时序图。

指令 \ 周期1234567891011121314151617I1IFIDEXMWBI2IFIDEXMWBI3IF****IDEXMWBI4IF******IDEXMWBI5IF******IDEXMWB

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 阻塞——这正是题干强调"未采用转发技术"的原因。

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题