课程
CH07
第7章:存储系统
理解Cache三种映射方式;
- 两种并行查找算法:相联存储器和单体多字存储器+比较器;
写策略
- 写回与直达法的区别
评价系统性能的间接指标
- 平均访存指标,计算公式:平均访存时间=命中时间+不命中率×不命中开销
- 程序执行时间CPU时间=(CPU执行周期数+存储器停顿周期数)×时钟周期时间
不命中开销=不命中周期数(停顿)×时钟周期时间
存储器停顿时钟周期数=访存次数×不命中率×不命中开销
降低不命中率
- 三种类型的不命中
- 强制性不命中(增加块大小、预取)、容量不命中(增加容量)、冲突不命中(提高相联度)
- 8种降低不命中率优化策略
- 增加Cache块大小、增加Cache的容量、提高相联度、伪相联Cache(列相联Cache)、硬件预期、编译器控制的预取、编译器优化、“牺牲”Cache
减少Cache不命中开销-5种
- 采用二级Cache(增加一级Cache,常用的方法)
- 让读不命中优先于写
- 写缓冲合并
- 请求字处理技术
- 非阻塞Cache或非锁定Cache技术
Cache三种映像规则
- 全相联映像:主存中的任一块可以被放置到Cache中的任意一个位置。
- 对比:阅览室位置 ── 随便坐
- 特点:空间利用率最高,冲突概率最低,实现最复杂(需要遍历比较)。

- 直接映象:主存中的每一块只能被放置到Cache中唯一的一个位置。(循环分配)
- 对比:阅览室位置 ── 只有一个位置可以坐
- 特点:空间利用率最低,冲突概率最高, 实现最简单。
- 对于主存的第 i 块,若它映象到Cache的第 j 块,则:j=i mod (M) (M为Cache的块数)
- 设M=2m,则当表示为二进制数时,j实际上就是i的低m位:


- 组相连映像:主存中的每一块可以被放置到Cache中唯一的一个组中的任何一个位置。
- 组相联是直接映象和全相联的一种折中
- 组的选择常采用位选择算法:
若主存第 i 块映象到第 k 组,则:k=i mod(G) (G为Cache的组数)
设 G=2g,则当表示为二进制数时,k 实际上就是i 的低 g 位:

低g位以及直接映象中的低m位通常称为索引。
并行查找实现算法
(采用直接映像或是组相联映像的情况下)
- 相联存储器;
- 目录由2g个相联存储区构成,每个相联存储区的大小为n×(h+log2n)位。
- 根据所查找到的组内块地址,从Cache存储体中读出的多个信息字中选一个,发送给CPU。
- 同时比较相联存储器的内容

- 单体多字存储器+比较器
举例: 4路组相联并行标识比较(比较器的个数及位数)
- 将表目录和数据项重新排列,一组4块
- CPU访存时,用本次访存地址中的索引作为地址从标识存储器中选取一行(对应于一组),并从该行并行读出4 个标识(分别对应于4路)。
- 与此同时,也从Cache存储体中并行读出4个信息字。然后将所读出的4个标识与本次访存地址中的标识进行并行比较,以确定是否命中以及该组中哪一个块是要访问的块(若命中)。
- 根据这些信息,就可以从已经读出的4个信息字中选择一个,送给CPU。

写策略
- 写回法
- 执行“写”操作时,只写入Cache。仅当Cache中相应的块被替换时,才写回主存。 (设置“修改位”支持这种策略)
“修改位”:为了减少替换时数据块的写回而设置;1:已修改;0:未修改,若产生替换时,此时不须写回下一级存储器,因为这时下一级存储器中相应块的内容与 Cache 中的一致。
- 减少了访问主存的次数从而提高了效率。
- 写直达法
- 执行“写”操作时,不仅写入Cache,而且也写入下一级存储器。
- 写cache与写主存同步进行,其优点是cache每行无需设置一个修改位以及相应的判测逻辑。
- 缺点是,cache对CPU向主存的写操作无高速缓冲功能,降低了cache的功效。
写回法的优点:速度快(只有置换时才写回下一级存储器),所使用的存储器带宽较低(因为大部分是对Cache写)。
写直达法的优点:易于实现,一致性好(cache、主存两者同时写)。
Cache的性能分析
平均访存时间 = 命中时间+不命中率×不命中开销
不命中开销=不命中周期数(停顿)×时钟周期时间
区别于程序执行时间
例7.1 用一个和Alpha AXP类似的机器作为第一个例子。假设Cache不命中开销为50个时钟周期,当不考虑存储器停顿时,所有指令的执行时间都是2.0个时钟周期,访问Cache不命中率为2%,平均每条指令访存1.33次。试分析Cache对性能的影响。
解:考虑Cache的不命中后,性能为:
实际CPI :3.33
3.33/2.0 = 1.67(倍)
CPU时间也增加为原来的1.67倍。
但若不采用Cache,则:
CPI=2.0+50×1.33=68.5
降低不命中率
三种类型的不命中(3C)
强制性不命中(Compulsory miss)
- 当第一次访问一个块时,该块不在Cache中,需从下一级存储器中调入Cache,这就是强制性不命中。 (冷启动不命中,首次访问不命中)
- 解决:增加块大小,预取
容量不命中(Capacity miss )
- 如果程序执行时所需的块不能全部调入Cache中,则当某些块被替换后,若又重新被访问,就会发生不命中。这种不命中称为容量不命中。
- 解决:增加容量
冲突不命中(Conflict miss)
- 与前两种不同
- 在组相联或直接映象Cache中,若太多的块映象到同一组(块)中,则会出现该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又被重新访问的情况,这就是发生了冲突不命中。(碰撞不命中,干扰不命中)
- 解决:提高相联度
8种降低不命中率优化策略
- 增加Cache块大小
- 对于给定的Cache容量,当块大小增加时,不命中率开始是下降,后来反而上升了。原因:
一方面它减少了强制性不命中;
另一方面,由于增加块大小会减少Cache中块的数目,所以有可能会增加冲突不命中。
- Cache容量越大,使不命中率达到最低的块大小就越大。
- 增加Cache的容量
- 缺点:
增加成本
可能增加命中时间
- 提高相联度
- 采用相联度超过8的方案的实际意义不大。
- 2:1 Cache经验规则
容量为N的直接映象Cache的不命中率和容量为N/2的两路组相联Cache的不命中率差不多相同。
- 提高相联度是以增加命中时间为代价。
- 伪相联 Cache(列相联 Cache)

- 伪相联Cache的优点:命中时间小、不命中率低
- 原理:在逻辑上把直接映象Cache的空间上下平分为两个区(地址不连续)。对于任何一次访问,伪相联Cache先按直接映象Cache的方式去处理。若命中,则其访问过程与直接映象Cache的情况一样。若不命中,则再到另一区相应的位置去查找。若找到,则发生了伪命中,否则就只好访问下一级存储器。

- 硬件预期
- 指令和数据都可以预取
- 预取内容既可放入Cache,也可放在外缓冲器中。
- 指令预取通常由Cache之外的硬件完成
- 预取效果
- 编译器控制的预取:在编译时加入预取指令,在数据被用到之前发出预取请求。
- 编译器优化:通过对软件进行优化来降低不命中率
- “牺牲”Cache
- 在Cache和它从下一级存储器调数据的通路之间设置一个全相联的小Cache,称为“牺牲”Cache(Victim Cache)。用于存放被替换出去的块(称为牺牲者),以备重用。
减少Cache不命中开销
- 采用二级Cache。(增加一级Cache,常用的方法)
第一级Cache(L1)小而快 (速度与CPU时钟周期相匹配)
第二级Cache(L2)容量大 (尽量捕获更多的访存情况,从而降低不命中率)
- 让读不命中优先于写
- 一般在Cache(CPU内部的L1或L2)后面设置一个写缓冲器,临时存放处理器将要写入到主存中的数据,这样 CPU 在将数据写入 cache 和缓冲器之后可以继续执行,等到缓冲写入到主存中再释放。
- 缺点:在读不命中时,所读单元的最新值有可能还在写缓冲器中,尚未写入主存
- 写缓冲合并。
- 如果写缓冲器为空,就把数据和相应地址写入该缓冲器。
- 如果写缓冲器中已经有了待写入的数据,就要把这次的写入地址与写缓冲器中已有的所有地址进行比较,看是否有匹配的项。如果有地址匹配而对应的位置又是空闲的,就把这次要写入的数据与该项合并。这就叫写缓冲合并。
- 如果写缓冲器满且又没有能进行写合并的项,就必须等待。
- 请求字处理技术。
- 从下一级存储器调入Cache的块中,只有一个字是立即需要的。这个字称为请求字,应尽早把请求字发送给CPU
- 非阻塞Cache或非锁定Cache技术
- Cache不命中时仍允许CPU进行其它的命中访问。即允许“不命中下命中”。
考虑某一个机器,假设Cache读不命中开销为25个时钟周期,写不命中开销70个时钟周期,当不考虑存储器停顿时,所有指令的执行时间都是2.0个时钟周期,Cache的读不命中率和写不命中率均为4%,平均每条指令读存储器0.8次,写存储器0.5次。试分析考虑的Cache不命中后,Cache对性能的影响。
- 平均每条指令存储器停顿时钟周期数=“读”的次数×读不命中率×读不命中开销+“写”的次数×写不命中率×写不命中开销=0.8×4%×25+0.5×4%×70=2.2
- CPU时间=IC×[CPI+(存储停顿周期数/指令数)]×时钟周期时间
- 考虑Cache的不命中后,性能为: CPU时间=IC×(2.0+2.2)×时钟周期时间=IC×4.2×时钟周期时间 当考虑了Cache的不命中影响后,CPI从理想计算机的2.0增加到4.2,是原来的2.1倍。













