《计算机组成与设计》阅读笔记——cache

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/winter_wu_1998/article/details/84952859
  • 局部性原理

    • 时间局部性
      - 如果一个数据项被访问,那么不久后它可能再次被访问
      - 循环
    • 空间局部性
      - 如果一个数据项被访问,那么与他地址相邻的数据项也很有可能被访问
      - 数组
    • 局部性原理是cache产生的基础
  • cache地址组成

    • 索引位
      • n位索引表示cache有 2 n 2^n 个块
    • 块大小位
      • m位表示有 2 m 2^m
      • 额外的两位用来表示byte偏移
    • 标记位
      • 假设地址为32位
      • tag = 32 - (m + n + 2)
  • cache大小

    • 索引 * (块大小 + tag大小 + 有效位大小)
    • 2^n * (2^{m+ 2 + 3} + (32 - n - m -2 ) + 10 )
    • 一般只计算数据大小
  • cache 缺失

    • 导致流水线阻塞
    • 指令cache缺失
      • PC = PC - 4
      • 读取主存并等待数据
      • 写入cache,设置有效位
      • 重新执行指令
    • 数据cache缺失
      • 阻塞IF到MEM阶段
      • 下面的过程和指令缺失一样
    • 强制缺失
      • cache中第一次出现的块产生的缺失,又叫做冷启动缺失
    • 容量缺失
      • cache容纳不了一个程序执行所需要的所有块
      • 当某些块被调换出去,随后又被调入产生的缺失
    • 冲突缺失
      • 组相联或者直接映射的cache中,多个块竞争同一组产生的缺失
      • 全相联cache中不存在
  • 写操作

    • 直写法
      • 同时写入cache和主存
      • 缺点
        • 使得写操作花费时间长
      • 通过写缓冲解决时间过长问题
        • 写入一个buffer中然后直接执行后面的过程,同时buffer写入主存
        • 当缓冲区满的时候任然会堵塞
        • 如果写入buffer的速度大于写入主存的速度,buffer很有可能会满
    • 回写法
      • 标记该块为脏块,但是不直接写会
      • 只有当该块有cache缺失被替换的时候才写会主存
    • 写缺失
      • 直写法下的写缺失
        • 写分配
          • 直接写入cache中对应的组中而不用预先判断是否是对应的块
          • 如果是对应的块,则写入buffer等待写回,程序继续
          • 如果不是,则从主存中取出对应的块剩余的部分
          • 只需要一个执行周期
        • 写不分配
          • 直接改写主存中对应的数据块,而不写cache
          • 原因是有时我们会将整个块清零,此时写入cache没有意义
      • 回写法下的写缺失
        • 一般是写分配的
        • 第一个执行周期需要判断是否是写缺失
          • 因为如果是写缺失,需要首先将cache中的块写回主存,否则内容会丢失
        • 第二个周期执行写操作
        • 或者可以通过加buffer的方式减少一个周期
          • 在第一个周期直接将要被修改的数据写入buffer并执行写操作,同时又从主存中取出剩下的部分块
  • 减少缺失代价

    • 减少读取第一个字的延迟比较困难,但是我们可以通过增加主存和cache之间的带宽来使得加较大容量的块和较小容量的块拥有相近的损失代价
    • 带宽即每个时钟周期传输的字节数
    • 加宽方法
      • 第一种就是加宽总线每次传动的数据数
      • 第二种是加宽储存器每次读取的数据数
  • 更多的cache组织方式

    • 组相联

      • 每个组包含n个块
      • 一个组为一个索引,组中根据tag判断应该读哪个块
      • cache可以放到组中的任意位置
    • 全相联

      • 一个cache只有一个组,没有索引位,全部通过tag判断
      • 块可以放在cache中的任意位置
      • 一般应用于较小的cache,否则搜索时间过长
      • 当然也可以像后面的虚拟存储器一样通过外置一个页表的方法免去搜索
    • 提高关联度,即增加组中块的个数,优点是降低了损失率,缺点是增加了命中时间(来自于tag的比较)
      在这里插入图片描述

  • L1和L2cache

    • L1cache一般较小
      • 更低的命中时间
      • 原因是从L2取出数据的缺失代价较小
    • L2cache一般较大
      • 更低的缺失率
      • 原因是从主存中取出数据的缺失代价很大

猜你喜欢

转载自blog.csdn.net/winter_wu_1998/article/details/84952859