CAAQA阅读笔记
转行前奏
Memory Hierarchy
Cache性能
- $CPU执行时间=(CPU时钟周期数 \times 存储器停顿周期数) \times 时钟周期$
- $存储器停顿时钟周期=(IC \times \frac{存储器访问数}{指令}\times缺失率\times缺失代价)$
四个存储器层次结构的问题
- 块的放置。通过
块地址 mod Cache的组数
来放置到对应的插槽中。如果组中有n个块,就成为n路组相联映射(i.e.相联度) - 块的识别。若有效位为1,且地址中的tag字段和块中的tag字段匹配(这是两个条件通过一个与门),然后就能取到对应的块,再根据地址字段的块偏移找到对应的块(块偏移字段的bit数=log2(块大小/主存宽度),是跟主存宽度相关的)
- 块的替换。随机,LRU,FIFO
- 写入策略。
- 写回。信息仅更新到Cache中,未更新到低一级的存储器中,只有在Cache中的块发生替换时,才将dirty的块写入低一级的存储器中,效率比较高
- 写直达。同时写入Cache和低一级的存储器中,一般会有一个写缓冲,来使得处理器在更新低一级存储器时不停顿。
- 写缺失
- 写分配。将发生写缺失的块调入Cache中,因此一般搭配写回策略
- 非写分配。不将写缺失的块调入Cache中,仅修改低一级的存储器的块,因此一般搭配写直达策略
- 索引字段的计算${2}^{索引} = \frac{Cache大小}{块大小\times相联度}$
- $AMAT(存储器的平均访问时间)=命中时间+缺失率\times缺失代价$
Cache优化
- 降低缺失率
- 降低不命中的代价
- 缩短Cache命中的时间
- 3’c不命中
- 强制不命中(冷启动不命中)。第一次访问某个指令或数据时,它肯定不在Cache中,必须读入Cache中执行。
- 容量不命中。Cache无法容纳程序执行期间所需要的全部块,由于一些块会被丢失,过会又被提取,就会出现”抖动”
- 冲突不命中。针对放置策略为组相联映射或全相联映射
- 多处理器中还有一致性缺失。
- 优化方法
- 增大块大小降低缺失率,块大小会增加硬件比较器的开销
- 增大缓存以降低缺失率
- 提高相联度以降低缺失率
- 采用多级Cache降低缺失代价
- Cache TLB与内存结合