265 lines
8.1 KiB
Markdown
265 lines
8.1 KiB
Markdown
# 第二章 缓存优化 - 考试考点精细化梳理
|
||
|
||
---
|
||
|
||
## 考点分级
|
||
|
||
### 【必考核心考点】
|
||
|
||
#### 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.33,CPU时间增加为原来的1.67倍。
|
||
```
|
||
|
||
---
|
||
|
||
## 本章核心公式速记
|
||
|
||
```
|
||
1. 平均访存时间 = 命中时间 + 不命中率 × 不命中开销
|
||
2. CPI = CPIexecution + 每条指令平均访存次数 × 不命中率 × 不命中开销
|
||
3. 全局不命中率 = 该级不命中次数 / CPU总访存次数
|
||
4. 局部不命中率 = 该级不命中次数 / 到达该级的访存次数
|
||
5. 两级Cache平均访存时间 = 命中时间L1 + 不命中率L1 × (命中时间L2 + 不命中率L2 × 不命中开销L2)
|
||
``` |