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的来读取数据,从而使你程序中的空间局部性较大
- 
一旦从存储器中读入了一个数据对象,就尽可能地多使用它,从而使得程序中的时间局部性大
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号