AMAT
Hit Time + Miss Rate × Miss Penalty
CS152 · 第 7 课
这一课把第 6 课的缓存结构变成可以量化分析的工具——用 AMAT 公式统一衡量命中时间和缺失代价,用"3C"模型区分不同缺失的根本原因,并把单级缓存扩展成真实处理器普遍采用的多级缓存体系。
处理器-DRAM 性能鸿沟每年扩大约 50%;缓存靠时间/空间局部性弥合这道鸿沟;三种放置策略——全相联、组相联、直接映射。
组相联/全相联缓存在缺失时需要决定替换哪一行:随机(Random);LRU(最近最少使用)——状态需要在每次访问时更新,真正实现只在小规模组(如 2 路)内可行,4-8 路通常用伪 LRU(Pseudo-LRU)二叉树近似;FIFO/轮转——常用于高相联度缓存;NMRU(非最近使用)——FIFO 的变体,对最近使用过的行例外处理。替换策略通常被认为是"二阶效应",因为它只在缺失时才起作用。
\[ \text{AMAT} = \text{Hit Time} + \text{Miss Rate} \times \text{Miss Penalty} \]
一条经验法则:选用尽量大的缓存,只要它的命中时间不超过 1 个周期(对当时的工艺,大约是 8–32 KB 量级)。
缓存参数对性能的影响可以逐一对应到这三类缺失:更大的容量(减少容量/冲突缺失,但增加命中时间);更高的相联度(减少冲突缺失,但可能增加命中时间);更大的行大小(减少强制性缺失,但增加冲突缺失与缺失代价)。
| 策略 | 说明 |
|---|---|
| 写通(Write-through) | 命中时同时写缓存和主存——流量更高,但流水线/缓存设计更简单 |
| 写回(Write-back) | 只写缓存,行被换出时才写回主存(配合每行一个脏位 dirty bit 进一步减少写回流量) |
| 不按写分配(No-write-allocate) | 写缺失时只写主存,不把该块调入缓存 |
| 按写分配(Write-allocate) | 写缺失时把该块调入缓存 |
常见组合是"写通 + 不按写分配"或"写回 + 按写分配"。为了不让写缺失拖慢流水线,可以引入写缓冲(write buffer):位于数据缓存和统一 L2 之间,写回缓存的脏行、或写通缓存的所有写操作都先进入写缓冲,由缓存流水线异步处理,从而降低读缺失的有效代价。
子块放置(sector cache):给每个比整行更小的子块单独配一个有效位,既不必把整行做大(避免增大缺失代价),又能减少标签开销——缺失时只需读取真正需要的那个子块。
包含式(inclusive)多级缓存:内层(L1)缓存持有的行必须也存在于外层(L2)中——外部一致性侦听只需检查外层缓存即可。排他式(exclusive)多级缓存:内层缓存可能持有外层没有的行,缺失时在内外层之间"交换"行(真实例子:AMD Athlon,64KB 一级 + 256KB 二级)。
真实多级缓存参数对比(原始规格数字):
核对:z196 的 96 核确实等于 4 核/芯片 × 24 芯片/系统。这些真实数字直观展示了"离处理器越近的缓存越小越快,越远的缓存越大越慢"这条设计规律,贯穿从 L1 到 L4 整整四个层级。
问题 1:假设有一个容量无限大、但仍然是有限相联度的缓存,程序第一次访问某个从未访问过的地址时,仍然会发生哪种缺失?
问题 2:AMAT(平均访存时间)的公式是什么?
问题 3:"排他式(exclusive)"多级缓存与"包含式(inclusive)"多级缓存的关键区别是什么?
Hit Time + Miss Rate × Miss Penalty
强制性、容量性、冲突性缺失,各自的应对手段不同
写通/写回 × 按写分配/不按写分配
局部/全局缺失率、MPI;包含式 vs. 排他式
sp23/lecture_slides/L07_Memory_II.pdf(UC Berkeley CS152/CS252A, Spring 2023, Sophia Shao)