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与内存结合