Appearance
题目
下列关于 CPI 和 CPU 时钟周期的叙述中,错误的是( )。
错因
A
不同指令类型的 CPI 完全可以不同。多周期 CPU、流水线 CPU 都是这样:算术指令可能 1 周期、Load 因要访存可能 3–5 周期、乘除法又更长。即使是单周期 CPU,"单条指令固定占 1 周期"也只是名义值,程序的平均 CPI 仍可能因指令组合不同而不同。A 描述正确——题目找"错误的",不选 A。
C
单周期 CPU 每条指令在 1 个时钟周期内执行完,所以这个周期必须长到能装下最复杂指令的关键路径(典型最坏情况是 Load:取指 → 译码 → 算地址 → 访存 → 写回)。其他短指令也用同样的周期,因此单周期 CPU 时钟频率被最慢的指令拉低。C 描述正确,不选 C。
D
流水线把一条指令切成若干段(IF / ID / EX / MEM / WB 等),每段在一个时钟周期内完成。时钟周期必须 ≥ 最长那段的延迟,否则该段无法在一个周期内做完,整条流水线就崩。D 描述正确,不选 D。
总解析
题目问"错误的"叙述,B 是错的。
B 错在哪里:
程序的实际 CPI 不是只看指令本身的"理想 CPI",还要叠加访存延迟带来的额外周期——其中最大头就是 Cache 缺失。一次缺失要从下一级缓存或主存取数据,可能花几十甚至上百个时钟周期,期间该条 Load/Store 指令在流水线里阻塞,等价于增加了它的 CPI。
通用经验公式(带访存惩罚的有效 CPI):
举例:理想 CPI = 1.0,每条指令平均 1.3 次访存,缺失率 5%,缺失代价 100 周期:
缺失率从 5% 降到 2%,CPI 从 7.5 降到 3.6——Cache 缺失率直接、显著地影响程序 CPI。所以 B 把它说成"无关"是错的。
逐项核验:
| 选项 | 内容 | 对/错 | 理由 |
|---|---|---|---|
| A | 不同类型指令的 CPI 可能不一样 | ✓ | 多周期/流水线 CPU 普遍现象 |
| B | 程序 CPI 与 Cache 缺失率无关 | ✗ | 缺失代价直接进 CPI 公式 |
| C | 单周期 CPU 时钟周期 = 最耗时指令时间 | ✓ | 一周期装下最长关键路径 |
| D | 流水线 CPU 时钟周期 = 最长流水段时间 | ✓ | 各段必须在 1 周期内完成 |
最终答案是 B。
CPI 与时钟周期速记:
| 概念 | 关键 |
|---|---|
| 指令 CPI | 取决于指令类型与微架构 |
| 程序 CPI | 加权平均 + 访存惩罚 + 流水线冒险阻塞 |
| 单周期时钟周期 | = 最耗时指令的关键路径延迟 |
| 多周期时钟周期 | = 单步关键路径(远小于单周期) |
| 流水线时钟周期 | = 最长流水段延迟 + 锁存器开销 |
把"CPI 与 Cache 无关"当对的人,多半把 CPI 当成"由 ISA 死定的常数"——其实程序的 CPI 是程序运行时测出来的,跟微架构、访存、缺失率全部相关。