视频加载失败

课程

5408 字
约 16 分钟

CH07

计算机体系结构notes/csdn-review·更新于 2026-09-15

第7章:存储系统

理解Cache三种映射方式;

  • 两种并行查找算法:相联存储器和单体多字存储器+比较器;

写策略

  • 写回与直达法的区别

评价系统性能的间接指标

  • 平均访存指标,计算公式:平均访存时间=命中时间+不命中率×不命中开销
  • 程序执行时间CPU时间=(CPU执行周期数+存储器停顿周期数)×时钟周期时间

不命中开销=不命中周期数(停顿)×时钟周期时间

存储器停顿时钟周期数=访存次数×不命中率×不命中开销

降低不命中率

  • 三种类型的不命中
    • 强制性不命中(增加块大小、预取)、容量不命中(增加容量)、冲突不命中(提高相联度)
  • 8种降低不命中率优化策略
    • 增加Cache块大小、增加Cache的容量、提高相联度、伪相联Cache(列相联Cache)、硬件预期、编译器控制的预取、编译器优化、“牺牲”Cache

减少Cache不命中开销-5种

  • 采用二级Cache(增加一级Cache,常用的方法)
  • 让读不命中优先于写
  • 写缓冲合并
  • 请求字处理技术
  • 非阻塞Cache或非锁定Cache技术

Cache三种映像规则

  1. 全相联映像:主存中的任一块可以被放置到Cache中的任意一个位置。
  • 对比:阅览室位置 ── 随便坐
  • 特点:空间利用率最高,冲突概率最低,实现最复杂(需要遍历比较)。

img

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

img

img

  1. 组相连映像:主存中的每一块可以被放置到Cache中唯一的一个组中的任何一个位置。
  • 组相联是直接映象和全相联的一种折中
  • 组的选择常采用位选择算法:

若主存第 i 块映象到第 k 组,则:k=i mod(G) (G为Cache的组数)

设 G=2g,则当表示为二进制数时,k 实际上就是i 的低 g 位:

img

低g位以及直接映象中的低m位通常称为索引。

并行查找实现算法

(采用直接映像或是组相联映像的情况下)

  1. 相联存储器;
  • 目录由2g个相联存储区构成,每个相联存储区的大小为n×(h+log2n)位。
  • 根据所查找到的组内块地址,从Cache存储体中读出的多个信息字中选一个,发送给CPU。
  • 同时比较相联存储器的内容

img

  1. 单体多字存储器+比较器

举例: 4路组相联并行标识比较(比较器的个数及位数)

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

img

写策略

  1. 写回法
  • 执行“写”操作时,只写入Cache。仅当Cache中相应的块被替换时,才写回主存。 (设置“修改位”支持这种策略)

“修改位”:为了减少替换时数据块的写回而设置;1:已修改;0:未修改,若产生替换时,此时不须写回下一级存储器,因为这时下一级存储器中相应块的内容与 Cache 中的一致。

  • 减少了访问主存的次数从而提高了效率。
  1. 写直达法
  • 执行“写”操作时,不仅写入Cache,而且也写入下一级存储器。
  • 写cache与写主存同步进行,其优点是cache每行无需设置一个修改位以及相应的判测逻辑。
  • 缺点是,cache对CPU向主存的写操作无高速缓冲功能,降低了cache的功效。

写回法的优点:速度快(只有置换时才写回下一级存储器),所使用的存储器带宽较低(因为大部分是对Cache写)。

写直达法的优点:易于实现,一致性好(cache、主存两者同时写)。

Cache的性能分析

平均访存时间 = 命中时间+不命中率×不命中开销

不命中开销=不命中周期数(停顿)×时钟周期时间

区别于程序执行时间

存储器停顿时钟周期数=访存次数×不命中率×不命中开销存储器停顿时钟周期数=访存次数 \times 不命中率 \times 不命中开销

CPU时间=CPU执行周期数+存储器停顿周期数)×时钟周期时间=CPU执行周期数+访存次数×不命中率×不命中开销)×时钟周期时间=IC×(CPIexecution+访存次数IC×不命中率×不命中开销)×时钟周期时间=IC×(CPIexecution+每条指令平均访存次数×不命中率×不命中开销)×时钟周期时间\begin{aligned} CPU时间 &= (CPU执行周期数 + 存储器停顿周期数) \times 时钟周期时间 \\ &= (CPU执行周期数 + 访存次数 \times 不命中率 \times 不命中开销) \times 时钟周期时间 \\ &= IC \times (CPI_{execution} + \frac{访存次数}{IC} \times 不命中率 \times 不命中开销) \times 时钟周期时间 \\ &= IC \times (CPI_{execution} + 每条指令平均访存次数 \times 不命中率 \times 不命中开销) \times 时钟周期时间 \end{aligned}

例7.1 用一个和Alpha AXP类似的机器作为第一个例子。假设Cache不命中开销为50个时钟周期,当不考虑存储器停顿时,所有指令的执行时间都是2.0个时钟周期,访问Cache不命中率为2%,平均每条指令访存1.33次。试分析Cache对性能的影响。

解:考虑Cache的不命中后,性能为:

CPUcache=IC×(2.0+1.33×2%×50)×时钟周期时间=IC×3.33×时钟周期时间CPU时间_{有cache}=IC \times (2.0 + 1.33 \times 2\% \times 50) \times 时钟周期时间 = IC \times 3.33 \times 时钟周期时间

实际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种降低不命中率优化策略

  1. 增加Cache块大小
  • 对于给定的Cache容量,当块大小增加时,不命中率开始是下降,后来反而上升了。原因:

一方面它减少了强制性不命中;

另一方面,由于增加块大小会减少Cache中块的数目,所以有可能会增加冲突不命中。

  • Cache容量越大,使不命中率达到最低的块大小就越大。
  1. 增加Cache的容量
  • 缺点:

增加成本

可能增加命中时间

  1. 提高相联度
  • 采用相联度超过8的方案的实际意义不大。
  • 2:1 Cache经验规则

容量为N的直接映象Cache的不命中率和容量为N/2的两路组相联Cache的不命中率差不多相同。

  • 提高相联度是以增加命中时间为代价。
  1. 伪相联 Cache(列相联 Cache)

img

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

img

  1. 硬件预期
  • 指令和数据都可以预取
  • 预取内容既可放入Cache,也可放在外缓冲器中。
  • 指令预取通常由Cache之外的硬件完成
  • 预取效果
  1. 编译器控制的预取:在编译时加入预取指令,在数据被用到之前发出预取请求。
  2. 编译器优化:通过对软件进行优化来降低不命中率
  3. “牺牲”Cache
  • 在Cache和它从下一级存储器调数据的通路之间设置一个全相联的小Cache,称为“牺牲”Cache(Victim Cache)。用于存放被替换出去的块(称为牺牲者),以备重用。

减少Cache不命中开销

  1. 采用二级Cache。(增加一级Cache,常用的方法)

第一级Cache(L1)小而快 (速度与CPU时钟周期相匹配)

第二级Cache(L2)容量大 (尽量捕获更多的访存情况,从而降低不命中率)

  1. 让读不命中优先于写
  • 一般在Cache(CPU内部的L1或L2)后面设置一个写缓冲器,临时存放处理器将要写入到主存中的数据,这样 CPU 在将数据写入 cache 和缓冲器之后可以继续执行,等到缓冲写入到主存中再释放。
  • 缺点:在读不命中时,所读单元的最新值有可能还在写缓冲器中,尚未写入主存
  1. 写缓冲合并。
  • 如果写缓冲器为空,就把数据和相应地址写入该缓冲器。
  • 如果写缓冲器中已经有了待写入的数据,就要把这次的写入地址与写缓冲器中已有的所有地址进行比较,看是否有匹配的项。如果有地址匹配而对应的位置又是空闲的,就把这次要写入的数据与该项合并。这就叫写缓冲合并。
  • 如果写缓冲器满且又没有能进行写合并的项,就必须等待。
  1. 请求字处理技术。
  • 从下一级存储器调入Cache的块中,只有一个字是立即需要的。这个字称为请求字,应尽早把请求字发送给CPU
  1. 非阻塞Cache或非锁定Cache技术
  • Cache不命中时仍允许CPU进行其它的命中访问。即允许“不命中下命中”。

考虑某一个机器,假设Cache读不命中开销为25个时钟周期,写不命中开销70个时钟周期,当不考虑存储器停顿时,所有指令的执行时间都是2.0个时钟周期,Cache的读不命中率和写不命中率均为4%,平均每条指令读存储器0.8次,写存储器0.5次。试分析考虑的Cache不命中后,Cache对性能的影响。

  1. 平均每条指令存储器停顿时钟周期数=“读”的次数×读不命中率×读不命中开销+“写”的次数×写不命中率×写不命中开销=0.8×4%×25+0.5×4%×70=2.2
  2. CPU时间=IC×[CPI+(存储停顿周期数/指令数)]×时钟周期时间
  3. 考虑Cache的不命中后,性能为: CPU时间=IC×(2.0+2.2)×时钟周期时间=IC×4.2×时钟周期时间 当考虑了Cache的不命中影响后,CPI从理想计算机的2.0增加到4.2,是原来的2.1倍。
Profile Image of the Author
Sonder
好想要技术
这是公告标题
这只是一个公告
分类
标签
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录