
这题答案是:
原指令系统平均 CPI = 1.57
新指令系统平均 CPI ≈ 1.91
这道题的关键不是单纯加权平均,而是第二问中“增加寄存器-存储器型算术逻辑指令”会使程序的动态指令条数减少,所以新平均 CPI 的分母不能再用原来的 M,而要用新的指令总数。
一、原指令系统的平均 CPI
题目给出的动态指令比例和 CPI 为:
| 指令类型 | 比例 | CPI |
|---|---|---|
| 算术逻辑指令 | 43% | 1 |
| LOAD 指令 | 21% | 2 |
| STORE 指令 | 12% | 2 |
| 转移指令 | 24% | 2 |
平均 CPI 按动态指令比例加权:
平均 CPI = 0.43 × 1 + 0.21 × 2 + 0.12 × 2 + 0.24 × 2
= 0.43 + 0.42 + 0.24 + 0.48
= 1.57
所以原指令系统的平均 CPI 为:
1.57
二、新指令系统的分析
题目说:程序共有 M 条指令,其中算术逻辑指令占 43%,也就是:
算术逻辑指令数 = 0.43M
其中有 25% 的算术逻辑指令满足:
一个操作数已在寄存器中,另一个操作数在存储器中,需要先用 LOAD 取到寄存器。
因此这部分算术逻辑指令数为:
0.43M × 25% = 0.1075M
在原指令系统中,这类操作需要两条指令完成:
LOAD 指令 + 算术逻辑指令
现在新增一种“寄存器-存储器型算术逻辑指令”,可以直接完成:
寄存器操作数 + 存储器操作数
所以原来的:
LOAD + 算术逻辑指令
可以合并成:
1 条寄存器-存储器型算术逻辑指令
因此减少的指令条数就是那部分 LOAD 指令:
减少指令数 = 0.1075M
新程序的总指令数为:
M' = M - 0.1075M = 0.8925M
这是本题最容易错的地方:新平均 CPI 的分母是 0.8925M,不是 M。
三、重新统计新指令系统下各类指令数量
原来算术逻辑指令有 0.43M 条,其中 25% 变成新的寄存器-存储器型指令。
普通算术逻辑指令剩余:
0.43M × 75% = 0.3225M
新增寄存器-存储器型算术逻辑指令:
0.43M × 25% = 0.1075M
LOAD 指令原来有 0.21M 条,其中 0.1075M 条被合并掉,所以剩余:
0.21M - 0.1075M = 0.1025M
STORE 指令不变:
0.12M
转移指令数量不变:
0.24M
但是题目说转移指令的 CPI 变为 3。
四、计算新指令系统总时钟周期数
各类指令的时钟周期数如下:
普通算术逻辑指令:0.3225M × 1 = 0.3225M
寄存器-存储器型算术逻辑指令:0.1075M × 2 = 0.215M
LOAD 指令:0.1025M × 2 = 0.205M
STORE 指令:0.12M × 2 = 0.24M
转移指令:0.24M × 3 = 0.72M
总时钟周期数为:
总周期数 = 0.3225M + 0.215M + 0.205M + 0.24M + 0.72M
= 1.7025M
新平均 CPI 为:
新平均 CPI = 总周期数 / 新指令总数
= 1.7025M / 0.8925M
≈ 1.9076
≈ 1.91
所以新指令系统的平均 CPI 约为:
1.91
五、这题为什么容易错
这题最常见的错误是直接用原来的 M 当分母,算成:
1.7025M / M = 1.7025
这个结果是错的,因为增加新指令后,原来的部分 LOAD + 算术逻辑指令 被合并成了一条指令,动态指令条数减少了。
平均 CPI 的定义是:
平均 CPI = 总时钟周期数 / 程序执行的总指令条数
所以程序指令数变化时,必须重新统计指令总数。
六、这类题的做法总结
遇到“增加新指令”“合并指令”“减少指令条数”“改变某类指令 CPI”这类题,不能只机械套加权平均。应先判断动态指令数是否发生变化。
本题中:
原平均 CPI = 1.57
新指令总数 = 0.8925M
新总周期数 = 1.7025M
新平均 CPI = 1.7025M / 0.8925M ≈ 1.91
虽然新增指令减少了一部分 LOAD 指令,但转移指令 CPI 从 2 变成 3,同时新平均 CPI 的分母也变小了,所以最终平均 CPI 反而变大。



