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