跳转到内容

2024—2025 学年第二学期《计算机组成与系统结构》B 卷答案与解析

说明:本答案按照课程 PPT、目录中的练习题库以及试卷给出的符号约定整理。数学表达式统一使用 LaTeX。
变形补码使用双符号位;整数的符号位和数值位之间用逗号分隔。


已知:

X=47,Y=+53X=-47,\qquad Y=+53

数值位为 6 位,因此真值表示范围为:

64x63-64\leq x\leq63

(1)求 XXYYY-Y 的变形补码

Section titled “(1)求 XXX、YYY、−Y-Y−Y 的变形补码”

首先写出绝对值的 6 位二进制形式:

47=(101111)247=(101111)_2 53=(110101)253=(110101)_2

正数的变形补码使用双符号位 00

[Y]=00,110101[Y]_{\text{补}}=00,110101

47-47 的补码:

+47:00,101111
取反:11,010000
加 1:11,010001

所以:

[X]=11,010001[X]_{\text{补}}=11,010001

同理,求 Y=53-Y=-53 的补码:

+53:00,110101
取反:11,001010
加 1:11,001011

所以:

[Y]=11,001011[-Y]_{\text{补}}=11,001011

答案:

[X]=11,010001\boxed{[X]_{\text{补}}=11,010001} [Y]=00,110101\boxed{[Y]_{\text{补}}=00,110101} [Y]=11,001011\boxed{[-Y]_{\text{补}}=11,001011} [X]+[Y]=11,010001+00,110101=00,000110\begin{aligned} [X]_{\text{补}}+[Y]_{\text{补}} &=11,010001+00,110101\\ &=00,000110 \end{aligned}

双符号位为 00,没有溢出,结果为正数:

X+Y=(000110)2=6X+Y=(000110)_2=6

答案:

X+Y=00,000110=(+6)10\boxed{X+Y=00,000110=(+6)_{10}}

(3)用变形补码计算 XYX-Y

Section titled “(3)用变形补码计算 X−YX-YX−Y”

减法转换为补码加法:

XY=X+(Y)X-Y=X+(-Y) [X]+[Y]=11,010001+11,001011=10,011100\begin{aligned} [X]_{\text{补}}+[-Y]_{\text{补}} &=11,010001+11,001011\\ &=10,011100 \end{aligned}

双符号位为 10,表示发生负溢出,也叫下溢。

从真值验证:

4753=100-47-53=-100

100-100 超出了 6 位数值位可表示的范围 [64,63][-64,63]

答案:

[XY]=10,011100\boxed{[X-Y]_{\text{补}}=10,011100} XY 发生下溢(负溢)\boxed{X-Y\text{ 发生下溢(负溢)}}

已知:

X=+17.5,Y=9X=+17.5,\qquad Y=-9

要求:

  • 阶码 5 位,其中含双符号位;
  • 尾数 8 位,其中含双符号位;
  • 阶码和尾数均采用补码;
  • 尾数数值位保持 6 位;
  • 舍入采用截去法。
17.5=(10001.1)217.5=(10001.1)_2

所以:

X=+0.100011×2101X=+0.100011\times2^{101}

即:

X=+0.100011×25X=+0.100011\times2^5

同理:

9=(1001)29=(1001)_2

所以:

Y=0.100100×2100Y=-0.100100\times2^{100}

即:

Y=0.100100×24Y=-0.100100\times2^4

XX 的阶码为 +5+5

[EX]=00101[E_X]_{\text{补}}=00101

XX 的尾数为正:

[MX]=00.100011[M_X]_{\text{补}}=00.100011

所以:

[X]=00101, 00.100011[X]_{\text{浮}}=00101,\ 00.100011

YY 的阶码为 +4+4

[EY]=00100[E_Y]_{\text{补}}=00100

Y=0.100100Y=-0.100100,其尾数补码为:

[MY]=11.011100[M_Y]_{\text{补}}=11.011100

所以:

[Y]=00100, 11.011100[Y]_{\text{浮}}=00100,\ 11.011100 ΔE=EXEY=54=1\Delta E=E_X-E_Y=5-4=1

YY 的阶码较小,因此将 YY 的尾数算术右移一位,阶码加 1:

11.01110011.101110(0)11.011100\longrightarrow11.101110(0)

对阶后:

[Y]=00101, 11.101110(0)[Y]_{\text{浮}}=00101,\ 11.101110(0)

括号中的 0 是移出的保护位。

00.100011+ 11.101110(0)00.010001(0)\begin{aligned} 00.100011\\ +\ 11.101110(0)\\ \hline 00.010001(0) \end{aligned}

因此:

[X+Y]=00101, 00.010001(0)[X+Y]_{\text{浮}}=00101,\ 00.010001(0)

尾数 00.010001 不是规格化正数,需要左移一位,同时阶码减 1:

00.010001(0)00.10001000.010001(0)\longrightarrow00.100010 001010010000101\longrightarrow00100

所以:

[X+Y]=00100, 00.100010[X+Y]_{\text{浮}}=00100,\ 00.100010

采用截去法,直接舍去超出 6 位数值位的部分:

[X+Y]=00100, 00.100010[X+Y]_{\text{浮}}=00100,\ 00.100010

阶码没有溢出。

还原真值:

X+Y=+0.100010×24X+Y=+0.100010\times2^4 =+(1000.10)2=+(1000.10)_2 =8.5=8.5

最终答案:

[X+Y]=00100, 00.100010\boxed{[X+Y]_{\text{浮}}=00100,\ 00.100010} X+Y=(1000.1)2=8.5\boxed{X+Y=(1000.1)_2=8.5}

3. 顺序存储器与交叉存储器带宽

Section titled “3. 顺序存储器与交叉存储器带宽”

已知:

T=400ns,τ=50nsT=400ns,\qquad \tau=50ns

每字 64 位,连续读取 16 个字。

q=16×64=1024bitq=16\times64=1024bit

顺序存储器每读一个字都需要一个完整存储周期:

t=nTt_{\text{顺}}=nT t=16×400=6400nst_{\text{顺}}=16\times400=6400ns

带宽:

W=qtW_{\text{顺}}=\frac{q}{t_{\text{顺}}} W=1024bit6400ns=160Mbit/sW_{\text{顺}} =\frac{1024bit}{6400ns} =160Mbit/s

交叉存储器读出第一个字需要一个存储周期,后续各字按照总线传送周期连续输出:

t=T+(n1)τt_{\text{交}}=T+(n-1)\tau t=400+15×50=1150nst_{\text{交}} =400+15\times50 =1150ns

带宽:

W=1024bit1150ns890.4Mbit/sW_{\text{交}} =\frac{1024bit}{1150ns} \approx890.4Mbit/s

答案:

存储器组织方式读取时间带宽
顺序存储器6400ns6400ns160Mbit/s160Mbit/s
交叉存储器1150ns1150ns890.4Mbit/s890.4Mbit/s

已知:

  • 计算机字长为 32 位,即每字 4B4B
  • 主存容量为 4MB4MB
  • Cache 数据存储体容量为 8KB8KB
  • 块长为 16 个字;
  • 采用直接相联映射;
  • 主存按字节编址。

主存容量:

4MB=222B4MB=2^{22}B

所以主存地址长度为 22 位。

每块包含 16 个字:

16×4B=64B=26B16\times4B=64B=2^6B

因此块内偏移字段为 6 位,也可以进一步拆分为:

块内字偏移:4 位
字内字节偏移:2 位

Cache 行数:

8KB64B=21326=27=128\frac{8KB}{64B} =\frac{2^{13}}{2^6} =2^7 =128

所以行索引字段为 7 位。

标记字段:

2276=922-7-6=9

主存地址划分为:

┌─────────┬───────────┬──────────────┐
│ Tag 9位 │ 行索引 7位 │ 块内偏移 6位 │
└─────────┴───────────┴──────────────┘

若把块内偏移继续拆开:

┌─────────┬───────────┬────────────┬──────────────┐
│ Tag 9位 │ 行索引 7位 │ 字偏移 4位 │ 字节偏移 2位 │
└─────────┴───────────┴────────────┴──────────────┘

CPU 每轮访问 0~199 号单元,共 200 个字。

每块有 16 个字,所以涉及的主存块数为:

20016=13\left\lceil\frac{200}{16}\right\rceil=13

Cache 有 128 行,且这 13 个连续块映射到不同 Cache 行,不会发生冲突替换。

第一轮:

  • 每个块第一次访问不命中,共 13 次不命中;
  • 其余访问命中。

第一轮命中次数:

20013=187200-13=187

之后重复 4 轮,所需数据块都仍在 Cache 中:

4×200=8004\times200=800

总访问次数:

5×200=10005\times200=1000

总命中次数:

187+800=987187+800=987

命中率:

h=9871000=0.987=98.7%h=\frac{987}{1000}=0.987=98.7\%

答案:

h=98.7%\boxed{h=98.7\%}

按照课程题库采用的平均访问时间公式:

ta=htc+(1h)tmt_a=ht_c+(1-h)t_m

代入:

ta=0.987×10+0.013×50t_a =0.987\times10 +0.013\times50 ta=9.87+0.65=10.52nst_a=9.87+0.65=10.52ns

答案:

ta=10.52ns\boxed{t_a=10.52ns}

补充:若某教材把“不命中”定义为先访问 Cache,再访问主存,则会写成
ta=tc+(1h)tm=10.65nst_a=t_c+(1-h)t_m=10.65ns。本课程此前题库采用前一种加权公式,因此本卷建议答 10.52ns10.52ns


机器字长为 16 位,各类指令格式为:

二地址:OP 4位 + A1 6位 + A2 6位
一地址:OP 10位 + A 6位
零地址:OP 16位

已知:

  • 二地址指令 14 条;
  • 一地址指令 125 条。

4 位操作码共有:

24=162^4=16

种编码。

二地址指令使用 14 种,还剩:

1614=216-14=2

个 4 位前缀可扩展为一地址指令。

每个前缀再扩展 6 位,可以表示:

26=642^6=64

条一地址指令。

所以一地址指令区域最多有:

2×64=1282\times64=128

个 10 位操作码。

已使用 125 个,还剩:

128125=3128-125=3

个 10 位前缀可继续扩展为零地址指令。

每个前缀还能扩展 6 位:

N0=3×26=192N_0=3\times2^6=192

答案:

零地址指令最多有192\boxed{零地址指令最多有192条}

(2)整个指令系统最多有多少条指令

Section titled “(2)整个指令系统最多有多少条指令”
N=14+125+192=331N=14+125+192=331

答案:

整个指令系统最多有331条指令\boxed{整个指令系统最多有331条指令}

(3)若一地址指令要求设计 247 条,二地址指令最多有多少条

Section titled “(3)若一地址指令要求设计 247 条,二地址指令最多有多少条”

每保留一个 4 位扩展前缀,最多可形成 64 条一地址指令。

247 条一地址指令至少需要:

24764=4\left\lceil\frac{247}{64}\right\rceil=4

个扩展前缀。

因此二地址指令最多有:

244=164=122^4-4=16-4=12

答案:

二地址指令最多有12\boxed{二地址指令最多有12条}

已知:

lw rt, imm(rs)

功能为:

R[rt]M[R[rs]+SignExt(imm)]R[rt]\leftarrow M[R[rs]+\operatorname{SignExt}(imm)]

题目表格中取指周期已经给出,需要补充计算周期和执行周期。

操作:

R[rs]XR[rs]\rightarrow X

控制信号:

Rout,Xin

因为 Rs/Rt=0 时选择 rs,而表格只列高电平信号,所以不用列出 Rs/Rt

操作:

SignExt(IR(I))+XZ\operatorname{SignExt}(IR(I))+X\rightarrow Z

控制信号:

IR(I)out,ADD

操作:

ZARZ\rightarrow AR

控制信号:

Zout,ARin

题目已经给出:

M[AR]DRM[AR]\rightarrow DR

控制信号:

Read,DREin

操作:

DRR[rt]DR\rightarrow R[rt]

控制信号:

DRout,Rin

由于 RegDst=0 时选择 rt,而题目只要求列高电平信号,因此不列 RegDst

空号答案
R[rs]XR[rs]\rightarrow X
IR(I)out,ADD
ZARZ\rightarrow AR
DRR[rt]DR\rightarrow R[rt]
DRout,Rin

完整流程:

计算周期:
T5 R[rs] → X
T6 SignExt(imm) + X → Z
执行周期:
T7 Z → AR
T8 M[AR] → DR
T9 DR → R[rt]

微指令字长为 32 位,各字段如下:

字段位号位数编码方式
W 组31~275编码表示
X 组26~243编码表示
Y 组23~204编码表示
Z 组19~128直接表示
判别测试字段11~75题设可改为编码表示
下址字段6~07直接给出后继微地址

下址字段为 7 位,最多可寻址:

27=1282^7=128

个微地址单元。

每条微指令为 32 位,所以控制存储器最大容量为:

128×32=4096bit128\times32=4096bit

也可以写成:

4096bit=512B4096bit=512B

答案:

4096bit\boxed{4096bit}

(2)判别测试条件最多有多少个

Section titled “(2)判别测试条件最多有多少个”

判别测试字段为 5 位,采用编码表示时共有:

25=322^5=32

种编码。

编码字段通常需要保留一种编码表示“不进行判别测试”,所以最多可表示:

251=312^5-1=31

个判别测试条件。

答案:

31\boxed{31个}

(3)最多可以设计多少条微指令

Section titled “(3)最多可以设计多少条微指令”

微指令条数由下址字段的寻址范围决定:

27=1282^7=128

答案:

128\boxed{128条}

(4)一条微指令中最多同时出现多少个有效微命令

Section titled “(4)一条微指令中最多同时出现多少个有效微命令”

W、X、Y 三个字段采用编码表示,每个字段同一时刻最多发出一个微命令:

1+1+1=31+1+1=3

Z 组采用直接表示,8 位可以同时发出 8 个微命令。

因此:

3+8=113+8=11

答案:

11\boxed{11个}

(5)该格式最多可表示多少种微命令

Section titled “(5)该格式最多可表示多少种微命令”

编码表示字段需要各保留一种“不发命令”的编码。

W 组:

251=312^5-1=31

X 组:

231=72^3-1=7

Y 组:

241=152^4-1=15

Z 组直接表示:

88

总数:

31+7+15+8=6131+7+15+8=61

答案:

61种微命令\boxed{61种微命令}

根据预约表:

时间: 1 2 3 4 5 6
S1: √ √ √
S2: √ √
S3: √

S1S_1

31=23-1=2 63=36-3=3 61=56-1=5

所以 S1S_1 产生禁止延迟:

{2,3,5}\{2,3,5\}

S2S_2

42=24-2=2

产生禁止延迟:

{2}\{2\}

S3S_3 只使用一次,不产生禁止延迟。

合并后:

F={2,3,5}\boxed{F=\{2,3,5\}}

令冲突向量按照:

C=(c5c4c3c2c1)C=(c_5c_4c_3c_2c_1)

排列,其中 ci=1c_i=1 表示延迟 ii 禁止。

因此:

C0=(10110)\boxed{C_0=(10110)}

(2)最小启动循环和最小平均间隔

Section titled “(2)最小启动循环和最小平均间隔”

从初始状态 10110 出发:

  • 延迟 1 允许;
  • 延迟 4 允许;
  • 延迟不小于 6 时也允许。

选择延迟 1:

C1=(10110>>1)10110C_1=(10110>>1)\lor10110 C1=0101110110=11111C_1=01011\lor10110=11111

状态 11111 的延迟 1~5 都被禁止,只能选择不小于 6 的延迟。

选择延迟 6 后回到初始状态:

10110 --1--> 11111 --6--> 10110

所以最小启动循环为:

(1,6)\boxed{(1,6)}

最小平均启动间隔:

dˉmin=1+62=3.5\bar d_{\min} =\frac{1+6}{2} =3.5

答案:

dˉmin=3.5 个时钟周期\boxed{\bar d_{\min}=3.5\text{ 个时钟周期}}

可达状态包括:

A = 10110
B = 11111
C = 10111

状态转移关系:

A --1--> B
A --4--> C
A --6及以上--> A
B --6及以上--> A
C --4--> C
C --6及以上--> A

状态图:

stateDiagram-v2
A: 10110
B: 11111
C: 10111
A --> B: 1
B --> A: 6及以上
A --> C: 4
C --> C: 4
C --> A: 6及以上
A --> A: 6及以上

其中平均间隔最小的闭合回路为:

A1B6AA\xrightarrow{1}B\xrightarrow{6}A

平均间隔为 3.53.5


2. 串行计算机和 SIMD 单向环计算点积

Section titled “2. 串行计算机和 SIMD 单向环计算点积”

计算:

S=A1B1+A2B2++A64B64S=A_1B_1+A_2B_2+\cdots+A_{64}B_{64}

已知:

  • 一次乘法需要 4 个单位时间;
  • 一次加法需要 2 个单位时间;
  • 相邻 PE 传送一次数据需要 1 个单位时间。

64 项点积需要:

  • 64 次乘法;
  • 63 次加法。

由于加法器和乘法器同一时刻只能使用其中一个,所以:

T=64×4+63×2T_{\text{串}} =64\times4+63\times2 T=256+126=382T_{\text{串}} =256+126 =382

答案:

T=382 个单位时间\boxed{T_{\text{串}}=382\text{ 个单位时间}}

共有 64 项,平均分配给 16 个 PE:

6416=4\frac{64}{16}=4

每个 PE 先完成本地 4 项点积。

每个 PE 执行 4 次乘法:

4×4=164\times4=16

个单位时间。

4 个乘积相加需要 3 次加法:

3×2=63\times2=6

个单位时间。

本地计算总时间:

16+6=2216+6=22

因为:

16=2416=2^4

需要 4 级加法归约:

4×2=84\times2=8

个单位时间。

在单向环上,关键路径的数据传送距离依次为:

1, 2, 4, 81,\ 2,\ 4,\ 8

因此数据传送时间为:

1+2+4+8=151+2+4+8=15

个单位时间。

总时间:

TSIMD=22+8+15=45T_{\text{SIMD}} =22+8+15 =45

答案:

TSIMD=45 个单位时间\boxed{T_{\text{SIMD}}=45\text{ 个单位时间}}

在 8 个处理器上计算:

S=i=1200AiBiS=\sum_{i=1}^{200}A_iB_i

已知:

N=8,m=200N=8,\quad m=200 tmulti=80ns,tadd=40nst_{\text{multi}}=80ns,\quad t_{\text{add}}=40ns h=1,g=200ns,l=400nsh=1,\quad g=200ns,\quad l=400ns

按课程公式,串行基准时间取:

T1=m(tmulti+tadd)T_1=m(t_{\text{multi}}+t_{\text{add}}) T1=200(80+40)=24000nsT_1=200(80+40)=24000ns

BSP 时间公式:

TBSP=mN(tmulti+tadd)+log2N(gh+l+tadd)T_{\text{BSP}} = \frac{m}{N} (t_{\text{multi}}+t_{\text{add}}) + \log_2N (gh+l+t_{\text{add}})

局部计算时间:

2008(80+40)=25×120=3000ns\frac{200}{8}(80+40) =25\times120 =3000ns

归约、通信和同步时间:

log28(200×1+400+40)\log_28(200\times1+400+40) =3×640=1920ns=3\times640 =1920ns

所以:

TBSP=3000+1920=4920nsT_{\text{BSP}} =3000+1920 =4920ns

加速比:

Sp=T1TBSP=2400049204.88S_p =\frac{T_1}{T_{\text{BSP}}} =\frac{24000}{4920} \approx4.88

答案:

TBSP=4920ns\boxed{T_{\text{BSP}}=4920ns} Sp,BSP4.88\boxed{S_{p,\text{BSP}}\approx4.88}

PRAM 时间公式:

TPRAM=mN(tmulti+tadd)+log2NtaddT_{\text{PRAM}} = \frac{m}{N} (t_{\text{multi}}+t_{\text{add}}) + \log_2N\cdot t_{\text{add}}

代入:

TPRAM=3000+3×40T_{\text{PRAM}} =3000+3\times40 TPRAM=3120nsT_{\text{PRAM}} =3120ns

加速比:

Sp=T1TPRAM=2400031207.69S_p =\frac{T_1}{T_{\text{PRAM}}} =\frac{24000}{3120} \approx7.69

答案:

TPRAM=3120ns\boxed{T_{\text{PRAM}}=3120ns} Sp,PRAM7.69\boxed{S_{p,\text{PRAM}}\approx7.69}
题号答案
1(1)[X]=11,010001[X]_{\text{补}}=11,010001[Y]=00,110101[Y]_{\text{补}}=00,110101[Y]=11,001011[-Y]_{\text{补}}=11,001011
1(2)00,00011000,000110,真值 +6+6,无溢出
1(3)10,01110010,011100,下溢(负溢)
2[X+Y]=00100, 00.100010[X+Y]_{\text{浮}}=00100,\ 00.100010,真值 (1000.1)2=8.5(1000.1)_2=8.5
3顺序:160Mbit/s160Mbit/s;交叉:890.4Mbit/s890.4Mbit/s
4(1)Tag 9 位,行索引 7 位,块内偏移 6 位
4(2)98.7%98.7\%
4(3)10.52ns10.52ns
题号答案
1(1)192 条
1(2)331 条
1(3)12 条
2R[rs]XR[rs]\to X;② IR(I)out、ADD;③ ZARZ\to AR;④ DRR[rt]DR\to R[rt];⑤ DRout、Rin
3(1)4096bit4096bit
3(2)31 个
3(3)128 条
3(4)11 个
3(5)61 种
题号答案
1(1)F={2,3,5}F=\{2,3,5\}C0=10110C_0=10110
1(2)最小循环 (1,6)(1,6),最小平均间隔 3.53.5 个时钟周期
2(1)382 个单位时间
2(2)45 个单位时间
3(1)TBSP=4920nsT_{\text{BSP}}=4920nsSp4.88S_p\approx4.88
3(2)TPRAM=3120nsT_{\text{PRAM}}=3120nsSp7.69S_p\approx7.69