-
Notifications
You must be signed in to change notification settings - Fork 1
10月28日笔记
直接映射cache:每个主存地址仅仅对应到cache中的一个块,因此我们只需要检查cache中的一个位置来判断该数据是否在cache中,块block是cache和主存之间的传输单位
被映射的高速缓存索引可以由存储器地址的低2位来决定,例如存储器地址低2位为00的数据映射到cache索引为0的位置
当有多个存储器地址的数据可以选择的时候,哪一个数据应该被放置在cache里?当需要一字节,控制器会找到对应的块,整块load进来
在cache中,通过标记tag来记录地址信息,由此来判断cache中的数据块来源于哪一个存储器地址
将多个存储地址映射到同一个cache索引,如何分辨是哪一个地址的数据在里面?当块大小大于1字节的时候,将存储器地址分成3部分,从高到低,分别标签位(用来检测数据是否是所需要的数据)、索引位(用来在cache中选择块)、块内字节偏移位(用于在块内选择所需要的字节),这三部分都采用无符号整数来表示
cache的字节数由高度×宽度来表示,高度定义为cache中块的数量,宽度定义为每个块的字节数
hit rate、miss rate、miss penalty、hit time
7.3 访问与缺失
写直达:同时更新cache和主存
写回:dirty位
块大小的选择是一个权衡的设计过程,通常来说,使用较大的块可以减少缺失率,因为利用了空间局部性原理,对于连续数组的访问有比较好的效果
缺失率不是唯一的性能指标,同时还要考虑缺失代价,当块大小增加的时候,缺失代价会增加,块越大,需要花费越多的时间去填满它,大的块也不总是有利的,当保持cache的大小不变,增加块的大小,一开始缺失率会由于空间局部性而快速下降,然而过了某一点之后,缺失率会上升,这是因为块大小和cache大小相比太大,块的数量就会很少
乒乓效应,缺失代价随着块大小的增加而不断增加,当保持cache大小不变,增加块的大小,缺失率会先下降,然后再上升,一开始下降的原因是利用了空间局部性原理,随后缺失率上升的原因是块的数量变少,影响了对时间局部性的利用
平均存储访问时间是一个比缺失率更加重要的指标
随着块大小的增加,平均访存时间会先减小,这是由于一开始缺失率下降的速度大于缺失代价增长的速度,但是最终随着块大小不断增加,平均访存时间会快速上升,因为缺失代价和缺失率都上升了
cache缺失类型:cache缺失3C模型中,1、强制缺失,出现在程序第一次开始启动的时候,这类缺失不能轻易被避免,主存中每个块都会发生一次强制缺失,又称为冷启动缺失;2、冲突缺失,当两个不同的主存地址映射到同一个cache地址时,会发生这类缺失,解决方法:1、增加cache大小,没有解决根本问题,2、cache每个索引对应的块数
全相联cache,一共只有一组,一组包含多个块,主存地址中标签域和偏移都和之前一致,由于只有一组,因此不需要索引域,每一个块都可以放在cache中任何一个位置,但是也必须通过cache中每个块的标签来判断数据是否在cache里面
优点:1、数据可以放置在cache中任何位置,因此不存在冲突缺失;缺点在于,对于每个块的标签域都需要一个硬件比较器,如果块大小为4字节,cache大小为64K字节,则需要16384个比较器,这样的设计硬件开销很大,现实中一般不采用这种设计方案
最后一种缺失我们称为容量缺失,这类缺失产生的原因是因为cache的容量有限,如果增加cache的容量,就不会产生这类缺失
首先考虑无限容量的全相联cache,发生的缺失均为强制缺失;其次考虑有限容量的全相联cache,其中除了强制缺失以外,都是容量缺失,最后考虑有限容量的有限关联度的cache,其中除了前两种缺失以外,其余都是冲突缺失