# 第二章 缓存优化 - 考试考点精细化梳理 --- ## 考点分级 ### 【必考核心考点】 #### 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) ```