Files
2026-05-16 17:16:51 +08:00

265 lines
8.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第二章 缓存优化 - 考试考点精细化梳理
---
## 考点分级
### 【必考核心考点】
#### 1. Cache平均访存时间公式计算题必考
**核心考法**:计算题(★★★★★)
**标准公式**
```
平均访存时间 = 命中时间 + 不命中率 × 不命中开销
或更精确的公式(考虑写操作):
平均访存时间 = 命中时间 + 不命中率 × (不命中开销 + 写不命中处理开销)
```
**扩展公式(含存储器停顿时)**
```
CPU时间 = IC × (CPIexecution + 每条指令平均访存次数 × 不命中率 × 不命中开销) × 时钟周期时间
```
**考题类型**
- 给定命中时间、不命中率、不命中开销,求平均访存时间
- 结合CPU时间公式计算性能提升倍数
- 比较不同Cache组织的性能优劣
**解题步骤**
1. 识别题目给出的参数(命中时间、不命中率、不命中开销)
2. 代入公式计算平均访存时间
3. 如需计算CPU时间注意单位统一时钟周期
**常见陷阱**
- 将不命中率当作命中率使用
- 混淆"不命中开销"和"命中时间"的单位
- 在多级Cache系统中混淆局部不命中率和全局不命中率
**易错易混点**
- 全局不命中率 = 该级不命中次数 / CPU总访存次数
- 局部不命中率 = 该级不命中次数 / 到达该级的访存次数
**答题模板**
```
解:根据平均访存时间公式
平均访存时间 = 命中时间 + 不命中率 × 不命中开销
已知:命中时间 = ___不命中率 = ___不命中开销 = ___
代入:
平均访存时间 = ___ + ___ × ___ = ___
平均访存时间为___个时钟周期。
```
**踩分细则**
- 正确写出公式1分
- 识别并代入正确参数2分
- 计算过程正确2分
- 最终答案及单位正确1分
---
#### 2. 两级Cache性能分析计算题高频
**核心考法**:计算题(★★★★☆)
**核心公式**
```
全局不命中率(L1) = 不命中次数(L1) / CPU总访存次数
全局不命中率(L2) = 不命中次数(L2) / CPU总访存次数
局部不命中率(L2) = 不命中次数(L2) / 不命中次数(L1)
平均访存时间(L1+L2) = 命中时间(L1) + 不命中率(L1) × [命中时间(L2) + 不命中率(L2) × 不命中开销(L2)]
```
**考题类型**
- 给定L1和L2的不命中次数求局部/全局不命中率
- 计算平均访存时间
- 计算每条指令的平均停顿时间
**解题步骤**
1. 先算L1的全局不命中率 = N(L1) / 总访存
2. 再算L2的局部不命中率 = N(L2) / N(L1)
3. 计算全局不命中率(L2) = N(L2) / 总访存
4. 代入两级Cache平均访存时间公式
**易错易混点**
- 混淆局部不命中率和全局不命中率
- L2的局部不命中率是以L1不命中次数为基数不是总访存次数
- 注意单位统一ns vs 时钟周期)
**答题模板**
```
解:
(1) 计算不命中率:
L1不命中率全局= ___ / ___ = ___%
L2局部不命中率 = ___ / ___ = ___%
L2全局不命中率 = ___ / ___ = ___%
(2) 计算平均访存时间:
平均访存时间 = 命中时间(L1) + 不命中率(L1) × [命中时间(L2) + 局部不命中率(L2) × 不命中开销(L2)]
= ___ + ___% × [___ + ___% × ___]
= ___
(3) 计算每条指令平均停顿时间:
每条指令平均停顿 = (平均访存时间 - 命中时间L1) × 每条指令访存次数
= ___
平均访存时间为___个时钟周期每条指令平均停顿___个时钟周期。
```
---
#### 3. 3C不命中分类选择题/填空题必考)
**核心考法**:选择题、填空题、简答题(★★★★★)
**三种不命中类型**
| 类型 | 全称 | 发生原因 | 解决方案 |
|------|------|----------|----------|
| Compulsory | 强制不命中 | 第一次访问某块 | 预取、增大块大小 |
| Capacity | 容量不命中 | Cache容量有限 | 增大Cache容量 |
| Conflict | 冲突不命中 | 直接映射/组相联中的映射冲突 | 增加相联度、增大Cache |
**考试重点**
- 给定场景能判断属于哪种不命中
- 区分三种不命中的根本原因
- 理解降低不命中率的方法分别针对哪种不命中
**常见陷阱**
- 将容量不命中和冲突不命中混淆
- 误以为增加相联度能解决容量不命中
**答题话术**
```
3C不命中是指Cache的三种不命中类型
1. 强制不命中Compulsory也称首次不命中当数据第一次被访问时必然发生
2. 容量不命中Capacity由于Cache容量有限一段时间内访问的数据无法全部容纳
3. 冲突不命中Conflict在直接映射或组相联Cache中多个数据块竞争同一组的位置
降低不命中率的方法:
- 增加块大小 → 主要减少强制不命中
- 增加Cache容量 → 主要减少容量不命中
- 提高相联度 → 主要减少冲突不命中
```
**得分要点**:能正确说出三种不命中的名称、原因和主要解决措施即可得分。
---
### 【高频考点】
#### 4. 直接映像 vs 组相联Cache比较计算题/分析题)
**核心考法**:计算题、分析题(★★★★☆)
**比较维度**
- 不命中率:组相联 < 直接映像
- 命中时间:直接映像 < 组相联(因为多路选择器延迟)
- 综合性能:需结合具体参数分析
**常见考题**
给出两种Cache的命中时间、不命中率、不命中开销计算平均访存时间并比较。
**解题思路**
1. 分别计算两种结构的平均访存时间
2. 考虑时钟周期增加因子(如组相联可能时钟周期更长)
3. 综合比较,注意单位统一
**易错易混点**
- 认为相联度越高越好
- 忽略命中时间增加的影响
- 时钟周期增加10%可能在某些情况下反而让直接映像更快
---
#### 5. 伪相联Cache了解即可
**核心考法**:选择题、填空题(★★★☆☆)
**原理**:先按直接映像查找,未命中时再按另一路查找
**平均访存时间公式**
```
命中时间伪相联 = 命中时间1路 + 伪命中率 × 2
伪命中率 = 失效率1路 - 失效率2路
```
---
#### 6. 写策略与写分配策略(选择题高频)
**核心考法**:选择题、填空题(★★★☆☆)
**四种组合**
| 写策略 | 写分配策略 | 特点 |
|--------|------------|------|
| 写直达 | 写分配 | 每次写都更新下一级存储器 |
| 写直达 | 写不分配 | 跳过Cache直接写主存 |
| 写回 | 写分配 | 只更新Cache替换时写回 |
| 写回 | 写不分配 | 跳过Cache直接写主存 |
**考试重点**
- 理解写直达和写回的区别
- 理解写分配和不分配的区别
- 应用场景选择
**常见陷阱**
- 混淆"写分配"和"写回"的概念
- 误以为写分配只用于写回法
---
### 【了解考点】
#### 7. 降低不命中率的8种方法
**考法**:选择题、简答题
**8种方法**
1. 增大块大小
2. 增大Cache容量
3. 提高相联度
4. 减少强制不命中(预取)
5. 减少容量不命中(增大容量)
6. 减少冲突不命中(提高相联度)
7. 编译器优化(软件预取)
8. 写合并
---
## 典型计算题解题示范
**例题**类似Alpha AXP例题
> 假设Cache不命中开销为50个时钟周期当不考虑存储器停顿时所有指令的执行时间都是2.0个时钟周期访问Cache不命中率为2%平均每条指令访存1.33次。求有Cache时的CPI和性能提升倍数。
**标准解题**
```
解:
CPI有Cache = CPIexecution + 每条指令平均访存次数 × 不命中率 × 不命中开销
= 2.0 + 1.33 × 2% × 50
= 2.0 + 1.33
= 3.33
性能提升倍数 = CPI有Cache / CPIexecution = 3.33 / 2.0 = 1.67倍
有Cache时的CPI为3.33CPU时间增加为原来的1.67倍。
```
---
## 本章核心公式速记
```
1. 平均访存时间 = 命中时间 + 不命中率 × 不命中开销
2. CPI = CPIexecution + 每条指令平均访存次数 × 不命中率 × 不命中开销
3. 全局不命中率 = 该级不命中次数 / CPU总访存次数
4. 局部不命中率 = 该级不命中次数 / 到达该级的访存次数
5. 两级Cache平均访存时间 = 命中时间L1 + 不命中率L1 × (命中时间L2 + 不命中率L2 × 不命中开销L2)
```