CSAPP学习笔记 -- 第六章 存储器层次结构(下)

6.4 高速缓存存储器

6.4.1 通用的高速缓存存储器组织结构
高速缓存存储器结构
 
6.4.2 直接映射高速缓存
每组只有一行的高速缓存称为直接映射高速缓存
  • 直接映射高速缓存中的组选择
  • 直接映射高速缓存中的行匹配
  • 直接映射高速缓存中的字选择
    • 由组选择和行匹配确定字
  • 直接映射高速缓存中的不命中时的行替换
    • 如果缓存不命中,那么它需要从存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引位指示的组中的一个高速缓存行中
    • 替换策略:用新取出的行直接替换当前行
  • 综合:运行中的直接映射高速缓存
  • 直接映射高速缓存中的冲突不命中
 
6.4.3 组相联高速缓存
1<E<C/B的高速缓存称为E路组相联高速缓存
  • 组相联高速缓存中的组选择
    • 与直接映射高速缓存相同
  • 组相联高速缓存中的行匹配与字选择
    • 根据标记位匹配
  • 组相联高速缓存中的不命中时的行替换
    • 请求的字不在组内任何一行,缓存不命中,高速缓存必须从内存中取出包含这个字的块
    • 替换策略:LFU、LRU等
 
6.4.4 全相联高速缓存
全相联高速缓存E=C/B
  • 全相联高速缓存中的组选择
    • 只有一行,不用选组
  • 全相联高速缓存中的行匹配与字选择
    • 与组相联高速缓存一样
  • 全相联高速缓存只适合做小的高速缓存,例如虚拟内存中的TLB
 
6.4.5 有关写的问题
处理写命中
  • 直写:立即将w的高速缓存快写回到紧接着的低一层中,缺点是每次写都回引起总线流量
  • 写回:尽可能推迟更新,只有当替换算法要驱逐这个更新过的块时,才把它写到紧接着的低一层去,缺点是增加了复杂性。
 
处理写不命中
  • 写分配:加载相应的低一层的块到高速缓存中,然后更新,缺点是每一次不命中都会导致一个块从低一层传送到高速缓存中。
  • 非写分配:避开高速缓存,直接写到第一层中。
 
直写--非写分配    |    写回--写分配
 
6.4.6 一个真实的高速缓存层次结构的解剖
 
6.4.7 高速缓存参数的性能影响
衡量高速缓存性能的指标
  • 不命中率
  • 命中率
  • 命中时间
  • 不命中处罚
 
性能影响因素
  • 高速缓存大小
    • 较大的高速缓存可能提高命中率,但会影响速度
  • 块大小
  • 相联度
  • 写策略
 
 
6.5 编写高速缓存友好的代码

基本方法
  • 让最常见的情况运行的快
  • 尽量减小每个循环内部的缓存不命中数量
    • 局部变量的反复使用
    • 循环
    • 步长为k的引用模式
    • 高速缓存命中率
 
 
6.6 综合:高速缓存对程序性能的影响

6.6.1 存储器山
 
6.6.2 重新排列循环以提高空间局部性
  • n值较大时,不同版本性能差距较大
  • 每次迭代内存引用和不命中数量都相同的版本,有大致相同的性能
  • 性能最糟糕的两个版本的内存访问次数和不命中次数明显较多
 
6.6.3 在程序中利用局部性
推荐技术
  • 将注意力集中在内循环,大部分计算和内存访问都发生在这里
  • 通过按照数据对象存储在内存中的顺序、以步长为1的来读取数据,从而使你程序中的空间局部性较大
  • 一旦从存储器中读入了一个数据对象,就尽可能地多使用它,从而使得程序中的时间局部性大
posted @ 2020-09-20 21:14  Yoke_cc  阅读(386)  评论(0编辑  收藏  举报