文章目录
- 第7章 存储系统
- 7.5 减少命中时间
- 7.5.1 容量小、结构简单的Cache
- 7.5.2 虚拟Cache
- 7.5.2.1 物理Cache
- 7.5.2.2 虚拟Cache
- 7.5.3 Cache访问流水化
- 7.5.4 踪迹 Cache
- 7.5.5 Cache优化技术总结
第7章 存储系统
7.5 减少命中时间
背景:
- 命中时间直接影响到处理器的时钟频率。
- 在当今的许多计算机中,往往是
Cache的访问时间
限制了处理器的时钟频率
。
7.5.1 容量小、结构简单的Cache
为了有效地减少Cache的命中时间,可以采用容量小、结构简单的Cache。
Cache命中访问过程中最耗时的部分:
- 用块地址的索引部分访向标识存储器
- 读出标识并与地址进行比较
使用容量小、结构简单的Cache的原因:
- 硬件越简单,速度就越快
- 小容量Cache对减少命中时间有益
实现小容量Cache的方案:
- 使Cache容量足够小,以便可以与处理器做在同一芯片上,避免因片外访问而增加时间开销
- 折中方案:把Cache的标识放在片内,而把Cache的数据存储体放在片外,这样既可以实现快速标识检测,又能利用独立的存储芯片来提供更大的容量。
保持Cache结构的简单性:
- 采用直接映像Cache
- 直接映像Cache的主要优点是可以让
标识检测
和数据传送
同时进行,从而有效地减少命中时间。
7.5.2 虚拟Cache
在采用
虚拟存储器
(OS中的虚拟内存)的计算机中,每次访存都必须进行虚实地址的转换,即将CPU发出的虚地址转换为物理地址,这一般是由存储管理部件(MMU
)完成的。
在介绍虚拟Cache之前,需要先介绍物理Cache的概念
7.5.2.1 物理Cache
物理Cache
- 使用物理地址进行访问的传统Cache
- 标识存储器中存放的是物理地址,进行地址检测也是用物理地址。
一次访存过程:
- 当CPU要访问存储器时,给出一个虚拟地址,由MMU中的地址转换部件把该地址转换为主存物理地址。
- 然后再用这个物理地址去访问Cache。
- 如果要访问的数据或指令在Cache中被找到,则Cache命中。
- 否则不命中,用这个物理地址去访问存储器,取出一块数据或指令装入Cache
根据使用物理Cache访存的过程不难看出,物理Cache的缺点是:
- 地址转换和访问Cache
串行进行
,访问速度很慢。
7.5.2.2 虚拟Cache
虚拟Cache
- 可以直接用虚拟地址进行访问的Cache。
- 标识存储器中存放的是虚拟地址,进行地址检测用的也是虚拟地址。
一次访存过程:
- 当CPU要访问存储器时,把虚拟地址同时送给Cache和MMU
- 如果Cache命中,Cache根据该虚拟地址把CPU所需的数据或指令取出,送给CPU
- 如果Cache不命中,就要用经过MMU转换得到的主存物理地址访问主存,读出相应
的块,装人Cache中。
优点:
- 在命中时,不需要地址转换,省去了地址转换的时间。
- 不命中时,地址转换和访问Cache也是并行进行的,其速度比物理Cache快很多。
使用虚拟Cache存在的问题:
- 当进行
进程切换
时需要清空Cache
- 新进程的虚拟地址可能与原进程的相同,但它们所指向的物理空间却不同
解决该问题的一种办法:
- 在地址标识中增加一个进程标识符字段(
PID
)这样多个进程的数据就可以混合存放于Cache
中,由PID指出Cache中的各块是属于哪个程序的。 - 为了减少PID的位数,PID经常是由
操作系统
指定的。对于每一个进程,操作系统从循环使用的几个数字中指定一个作为其PID。 - 这种方法有时也需要清空Cache,这种情况仅发生在当某个PID被重用的时候,即该PID以前已被分配给了某个进程,现又把它分配给另一个进程的时候。
- 操作系统和用户同时对
同一物理地址
访问采用两种以上不同形式虚拟地址
访问,这些地址称为同义
或别名
- 可能导致同一个数据在虚拟Cache中存在两个副本
- 在物理Cache中不会发生,因为物理Cache首先会把虚拟地址转换到同一物理地址,从而找到同一个物理Cache块
解决方法:
反别名法
-
页着色
,例如Sun公司的UNIX要求所有别名的地址最后18位都相同
I/O
通常使用物理地址,所以为了与虚拟Cache打交道,需要把物理地址映像为虚拟地址。
⚠️虚拟索引+物理标识
兼顾虚拟Cache的好处与物理Cache的优点(折中)
思想:
- 标识是物理的地址
- 虚地址的页内位移作为访问cache的索引(页内位移不作虚→实地址转换)
- CPU发出访存请求后,在进行虚→实地址转换时,并行进行标识的读取,在完成地址转换后,再进行地址检测(把转换得到的物理地址与标识进行比较)
局限性:
- 容量受到限制
实现大容量Cache并使得索引位较少:
- 采用提高相联度的方法
- 原理:Cache的容量 =
7.5.3 Cache访问流水化
- 对第一级Cache的访问按流水方式组织
- 访问Cache需要多个时钟周期才可以完成
说明:
- 实际上不能减少Cache的
命中时间
,但是可以提高访问Cache的带宽
7.5.4 踪迹 Cache
背景:
- 开发指令级并行性时,当要每个时钟周期流出超过4条指令时,要提供足够多条彼此互不相关的指令是很困难的。
踪迹 Cache
- 存放CPU所执行过的动态指令序列
- 包含了由分支预测展开的指令,该分支预测是否正确需要在取到该指令时进行确认。
优点:
- 能够提高指令Cache的空间利用率。
缺点:
- 地址映象机制复杂
- 相同的指令序列有可能被当作条件分支的不同选择而重复存放
7.5.5 Cache优化技术总结
为了描述方便,引入以下记号:
-
“+”号
:表示改进了相应指标。 -
“-”号
:表示它使该指标变差。 -
空格栏
:表示它对该指标无影响。 -
复杂性
:0表示最容易,3表示最
Cache优化技术总结1——减少不命中率的方法
优化技术 | 不命中率 | 不命中开销 | 命中时间 | 硬件复杂度 | 说明 |
增加块大小 | + | - | 0 | 实现容易;Pentium 4 的第二级Cache采用了128字节的块 | |
增加Cache容量 | + | 1 | 被广泛采用,特别是第二级Cache | ||
提高相联度 | + | - | 1 | 被广泛采用 | |
伪相联Cache | + | 2 | MIPS R10000的第二级Cache采用 | ||
牺牲Cache | + | 2 | AMD Athlon采用了8个项的Victim Cache | ||
硬件预取指令和数据 | + | 2~3 | 许多机器预取指令,UltraSPARC Ⅲ预取数据 | ||
编译器控制的预取 | + | 3 | 需同时采用非阻塞Cache;有几种微处理器提供了对这种预取的支持 | ||
用编译技术减少Cache不命中次数 | + | 0 | 向软件提出了新要求;有些机器提供了编译器选项 |
Cache优化技术总结2——减少不命中开销的方法
优化技术 | 不命中率 | 不命中开销 | 命中时间 | 硬件复杂度 | 说明 |
使得读不命中优先于写 | + | - | 1 | 在单处理机上实现容易,被广泛采用 | |
写缓冲合并 | + | 1 | 与写直达合用,广泛应用,例如21164,UltraSPARC Ⅲ | ||
两级Cache | + | 2 | 硬件代价大;两级Cache的块大小不同时实现困难;被广泛采用 | ||
请求字处理技术 | + | 2 | 被广泛采用 | ||
非阻塞Cache | + | 3 | 在支持乱序执行的CPU中使用 |
Cache优化技术总结3——减少命中时间的方法
优化技术 | 不命中率 | 不命中开销 | 命中时间 | 硬件复杂度 | 说明 |
容量小且结构简单的Cache | + | 0 | 实现容易,被广泛采用 | ||
流水化Cache访问 | + | 1 | 被广泛采用 | ||
虚拟Cache技术 | + | 2 | 对于小容量Cache来说实现容易,已被Alpha 21164和UltraSPARC Ⅲ采用 | ||
踪迹Cache | + | 3 | Pentium 4 采用 |