Atri Website

Back

重点#

  • 知道分离数据 cache 和指令 cache 的作用和目的(考过,2014)
  • 了解多级缓存的设计原理

1. 缓存设计时应该考虑的问题#

决定系统访存性能的重要因素之一是cache 命中率,命中率与关联度有关,同时也和 cache 容量有关。显然,cache 容量越大,命中率就越高。此外,命中率还与主存块大小有一定的关系。大的主存块能很好地利用空间局部性,但是,主存块越大,其缺失损失也越大。因此,主存块大小必须适中。

关联度:一个主存块映射到 cache 中时可能存放的位置个数,即每个主存块可被映射到多少个 cache 行。关联度越高,命中率越高。(因为 cache 冲突概率更小)

除上述提到的这些问题外,设计 cache 时还要考虑采用单级还是多级 cache,数据 cache 和指令 cache 是分开还是合在一起,主存—总线—cache—CPU 之间采用什么架构等,甚至 DRAM 芯片的内部结构、存储器总线的总线事务类型等也都与 cache 设计有关,都会影响系统总体性能。

考研时只靠”重点”里的内容

2. 分离 cache#

随着指令流水技术的发展,现代处理器通常将指令 Cache 和数据 Cache 分开设计,形成分离的 Cache 结构

统一 Cache 的优点在于其设计和实现相对简单,但在流水线执行中,取指部件和执行部件同时访问同一 Cache 时容易产生冲突。

分离数据 cache 和指令 cache 的作用和目的:

通过采用分离 Cache 结构,不仅可以消除取指和执行的访存冲突,还能针对指令和数据的不同局部性特征进行优化,从而提升整体性能。

3. 多级 cache#

早期 CPU 采用的是单级片外 cache,现在一般是多级片内 cache 成为主流。目前 cache 都在 CPU 芯片内,且使用 L1 和 L2 cache,甚至有 L3 cache。通常 L1 cache 采用分离 cache,即数据 cache 和指令 cache 分开设置。L2 和 L3 cache 为联合式,即数据和指令放在一个 cache 中。

在一个采用两级 cache 的系统中,

  1. CPU 总是先访问 L1 cache,if L1 cache hit,则读取结束
  2. If L1 cache miss,再从 L2 cache 中找
  3. If L2 cache 包含所请求的信息(L2 cache hit),则缺失损失为 L2 cache 的访问时间,这比访问主存要快得多
  4. If L2 cache 访问缺失,则需从主存取信息并同时送 L1 cache 和 L2 cache,此时缺失损失较大。

一般来说,L1 离 CPU 最近,速度最快、容量较小;L2 则较远,速度较慢、容量较大。

通常情况下,L1 级采用分离指令 Cache 和数据 Cache 的设计,其中 L1 的数据 Cache 在写操作中采用写分配法(将主存块调入 cache 再写)与回写法(只写缓存,替换时回写)相结合的策略。

组合作用
全写法 + 非写分配命中时,同时写入 cache 和主存;缺失时,只写入主存,不放入 cache
回写法 + 写分配命中时,只写入 cache;缺失时,先把主存块送入 cache,再在 cache 里更新

下图展示一个典型的两级 Cache 系统。通常,L1 和 L2 Cache 均采用回写法,当 L1 发生写命中时,仅更新 L1;当 L1 块被替换时,若为脏块,则写回 L2;L2 同理,在替换时写回主存。

由于 L2 Cache 的访问速度远高于主存,L1 无须在写命中时访问主存,仅更新自身 Cache 行即可快速完成写操作;后续出现替换时,L1 的脏块写回由 L2 承接,从而有效避免因频繁写操作导致的写缓冲饱和或溢出问题。

为了减少写主存的开销,通常在 cache 和主存之间加一个写缓冲(write buffer)。在 CPU 写 cache 的同时,也将信息写入写缓冲,然后由存储控制器将写缓冲中的内容写人主存。写缓冲是一个 FIFO 队列,只有少量空间,CPU 只需将信息写写缓冲而无须写慢速的主存,因而效果较好。但如果写操作频繁发生,则会使写缓冲饱和而发生阻塞。

全局缺失率和局部缺失率#

在多级 cache 中,有全局缺失率和局部缺失率两种不同的概念。

  • 全局缺失率:在所有级 cache 中都缺失的访问次数占总访问次数的比例
  • 局部缺失率:在某级 cache 中缺失的访问次数占对该级 cache 的总访问次数的比例

例如,对于两级 cache,若 CPU 总的访存次数为 100,在 L1 cache 命中的次数为 94,剩下的 6 次中在 L2 cache 命中的次数为 5,只有 1 次需要访问主存,则全局缺失率为 1%1\%,L1 cache 和 L2 cache 的局部缺失率分别为 6/100=6%6/100=6\%1/6=16.7%1/6=16.7\%

计组:如何设计 cache 的结构
Author Juyao Huang
Published at June 15, 2026
Comment seems to stuck. Try to refresh?✨