第五章 存储层次
5.1名词解释存储层次——采用不同的技术实现的存储器,处在离CPU不同距离的层次上,目标是达到离CPU最近的存储器的速度,最远的存储器的容量。
全相联映象——主存中的任一块可以被放置到Cache中任意一个地方。
直接映象——主存中的每一块只能被放置到Cache中唯一的一个地方。
组相联映象——主存中的每一块可以放置到Cache中唯一的一组中任何一个地方(Cache分成若干组,每组由若干块构成)。
替换算法——由于主存中的块比Cache中的块多,所以当要从主存中调一个块到Cache中时,会出现该块所映象到的一组(或一个)Cache块已全部被占用的情况。这时,需要被迫腾出其中的某一块,以接纳新调入的块。
LRU——选择最近最少被访问的块作为被替换的块。实际实现都是选择最久没有被访问的块作为被替换的块。
写直达法——在执行写操作时,不仅把信息写入Cache中相应的块,而且也写入下一级存储器中相应的块。
写回法——只把信息写入Cache中相应块,该块只有被替换时,才被写回主存。
按写分配法——写失效时,先把所写单元所在的块调入Cache,然后再进行写入。
不按写分配法——写失效时,直接写入下一级存储器中,而不把相应的块调入Cache。
写合并——在往缓冲器写入地址和数据时,如果缓冲器中存在被修改过的块,就检查其地址,看看本次写入数据的地址是否和缓冲器内某个有效块的地址匹配。如果匹配,就将新数据与该块合并。
命中时间——访问Cache命中时所用的时间。
失效率——CPU访存时,在一级存储器中找不到所需信息的概率。
失效开销——CPU向二级存储器发出访问请求到把这个数据调入一级存储器所需的时间。
强制性失效——当第一次访问一个块时,该块不在Cache中,需要从下一级存储器中调入Cache,这就是强制性失效。
容量失效——如果程序在执行时,所需要的块不能全部调入Cache中,则当某些块被替换后又重新被访问,就会产生失效,这种失效就称作容量失效。
冲突失效——在组相联或直接映象Cache中,若太多的块映象到同一组(块)中,则会出现该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又被重新访问的情况。
2:1Cache经验规则——大小为N的直接映象Cache的失效率约等于大小为N /2的两路组相联Cache的实效率。
相联度——在组相联中,每组Cache中的块数。
Victim Cache——位于Cache和存储器之间的又一级Cache,容量小,采用全相联策略。用于存放由于失效而被丢弃(替换)的那些块。每当失效发生时,在访问下一级存储器之前,先检查Victim Cache中是否含有所需块。
伪相联Cache——一种既能获得多路组相联Cache的低失效率,又能获得直接映象Cache的命中速度的相联办法。
故障性预取——在预取时,若出现虚地址故障或违反保护权限,就会发生异常。
非故障性预取——在预取时,若出现虚地址故障或违反保护权限,不发生异常。
非阻塞Cache——Cache在等待预取数据返回时,还能继续提供指令和数据。
子块放置技术——把一个Cache块划分为若干小块,称为子块(sub-blocks),并为每个子块赋予一位有效值,用于说明该子块中的数据是否有效。失效时,只需从下一级存储器调入一个子块。
尽早重启动——在请求字没有到达时,CPU处于等待状态。一旦请求字到达,就立即发送给CPU,让等待的CPU尽早重启动,继续执行。
请求字优先——调 块时,首先向存储器请求CPU所要的请求字。请求字一旦到达,就立即送往CPU,让CPU继续执行,同时从存储器调入该块的其余部分。
多级包容性——一级存储器(Cache)中的数据总位于下一级存储器中。
虚拟Cache——地址使用虚地址的Cache。
多体交叉技术——具有多个存储体,各体之间按字交叉的存储技术。
存储体冲突——多个请求要访问同一个体。
TLB——一个专用高速存储器,用于存放近期经常使用的页表项,其内容是页表部分内容的一个副本。
简述“Cache—主存”和“主存—辅存”层次的区别。
存储层次比较项目
“Cache—主存”层次
“主存—辅存”层次
目 的
为了弥补主存速度的不足
为了弥补主存容量的不足
存储管理实现
全部由专用硬件实现
主要由软件实现
访问速度的比值
(第一级比第二级)
几比一
几百比一
典型的块(页)大小
几十个字节
几百到几千个字节
CPU对第二级的访问方式
可直接访问
均通过第一级
失效时CPU是否切换
不切换
切换到其它进程
5.3 降低Cache失效率有哪几种方法?简述其基本思想。
常用的降低Cache失效率的方法有下面几种:
增加Cache块大小。增加块大小利用了程序的空间局部性。
提高相联度,降低冲突失效。
Victim Cache,降低冲突失效。
伪相联Cache,降低冲突失效。
硬件预取技术,指令和数据都可以在处理器提出访问请求前进行预取。
由编译器控制的预取,硬件预取的替代方法,在编译时加入预取的指令,在数据被用到之前发出预取请求。
编译器优化,通过对软件的优化来降低失效率。
5.4简述减小Cache失效的几种方法。
让读失效优先于写。
子块放置技术。
请求字处理技术。
非阻塞Cache技术。
采用两级Cache、
5.5通过编译器对程序优化来改进Cache性能的方法有哪几种?简述其基本思想。
数组合并,通过提高空间局部性来减少失效次数。有些程序同时用相同的索引来访问若干个数组的同一维,这些访问可能会相互干扰,导致冲突失效,可以将这些相互独立的数组合并成一个复合数组,使得一个Cache块中能包含全部所需元素。
内外循环交换。循环嵌套时,程序没有按数据在存储器中的循序访问。只要简单地交换内外循环,就能使程序按数据在存储器中的存储循序进行访问。
循环融合。有些程序含有几部分独立的程序断,它们用相同的循环访问同样的数组,对相同的数据作不同的运算。通过将它们融合成一个单一循环,能使读入Cache的数据被替换出去之前得到反复的使用。
分块。通过改进时间局部性来减少失效。分块不是对数组的整行或整列进行访问,而是对子矩阵或块进行操作。
5.6 在“Cache—主存”层次中,主存的更新算法有哪几种??它们各有什么特点?
写直达法
易于实现,而且下一级存储器中的数据总是最新的。
写回法速度块,“写”操作能以Cache存储器的速度进行。而且对于同一单元的多个写最后只需一次写回下一级存储器,有些“写”只到达Cache,不到达主存,因而所使用的存储器频带较低。
5.7 组相联Cache比相同容量的之直接映象Cache的失效率低。由此是否可以得出结论:采用组相联Cache一定能带来性能上的提高?为什么?
答:不一定。因为组相联命中率的提高是以增加命中时间为代价的,组相联需要增加多路选择开关。
5.8 写出三级Cache的平均访问时间TA的公式。
平均访存时间 = 命中时间+失效率×失效开销只有第I层的失效时才会访问第I+1
设三级Cache的命中率分别为HL1,Hl2,HL3,失效率分别为Ml1、Ml2、ML3,第三级Cache的失效开销为PL3。
平均访问时间TA =HL1+Ml1{Hl2+Ml2(HL3+ML3×PL3)}
给定以下的假设,试计算直接映象Cache和两路组相联Cache的平均访问时间以及CPU的性能。由计算结果能得出什么结论?
理想Cache情况下的CPI为2.0,时钟周期为2ns,平均每条指令访存1.2次;
两者Cache容量均为64KB,块大小都是32字节;
组相联Cache中的多路选择器使CPU的时钟周期增加了10%;
这两种Cache的失效开销都是80ns;
命中时间为1个时钟周期;
64KB直接映象Cache的失效率为1.4%,64KB两路组相联Cache的失效率为1.0%。
解,平均访问时间=命中时间+失效率×失效开销平均访问时间1-路=2.0+1.4% *80=3.12ns
平均访问时间2-路=2.0*(1+10%)+1.0% *80=3.0ns
两路组相联的平均访问时间比较低
CPUtime=(CPU执行+存储等待周期)*时钟周期
CPU time=IC(CPI执行+总失效次数/指令总数*失效开销) *时钟周期
=IC((CPI执行*时钟周期)+(每条指令的访存次数*失效率*失效开销*时钟周期))
CPU time 1-way=IC(2.0*2+1.2*0.014*80)=5.344IC
CPU time 2-way=IC(2.2*2+1.2*0.01*80)=5.36IC
相对性能比:5.36/5.344=1.003
直接映象cache的访问速度比两路组相联cache要快1.04倍,而两路组相联Cache的平均性能比直接映象cache要高1.003倍。因此这里选择两路组相联。
5.10 假设一台计算机具有以下特性:
95%的访存在Cache中命中;
块大小为两个字,且失效时整个块被调入;
CPU发出访存请求的速率为109字/秒;
25%的访存为写访问;
存储器的最大流量为109字/秒(包括读和写);
主存每次只能读或写一个字;
在任何时候,Cache中 有30%的块被修改过;
写失效时,Cache采用写分配法。
现欲给计算机增添一台外设,为此想先知道主存的频带已经使用了多少。试对于以下两种情况计算主存频带的平均使用比例。
写直达Cache;
写回法Cache。
解:采用按写分配
(1)写直达cache访问命中,有两种情况:
读命中,不访问主存;
写命中,更新cache和主存,访问主存一次。
访问失效,有两种情况:
读失效,将主存中的块调入cache中,访问主存两次;
写失效,将要写的块调入cache,访问主存两次,再将修改的数据写入cache和主存,访问主存一次,共三次。上述分析如下表所示。
访问命中
访问类型
频率
访存次数
Y
读
95%*75%=71.3%
0
Y
写
95%*25%=23.8%
1
N
读
5%*75%=3.8%
2
N
写
5%*25%=1.3%
3
一次访存请求最后真正的平均访存次数=(71.3%*0)+(23.8%*1)+(3.8%*2)+(1.3%*3)=0.35
已用带宽=0.35×109/10 9 =35.0%
(2)写回法cache访问命中,有两种情况:
读命中,不访问主存;
写命中,不访问主存。采用写回法,只有当修改的cache块被换出时,才写入主存;
访问失效,有一个块将被换出,这也有两种情况:
如果被替换的块没有修改过,将主存中的块调入cache块中,访问主存两次;
如果被替换的块修改过,则首先将修改的块写入主存,需要访问主存两次;然后将主存中的块调入cache块中,需要访问主存两次,共四次访问主存。
访问命中
块为脏
频率
访存次数
Y
N
95%*70%=66.5%
0
Y
Y
95%*30%=28.5%
0
N
N
5%*70%=3.5%
2
N
Y
5%*30%=1.5%
4
所以:
一次访存请求最后真正的平均访存次数=66.5%*0+28.5%*0+3.5%*2+1.5%*4=0.13
已用带宽=0.13×10 9/10 9=13%
5.11 伪相联中,假设在直接映象位置没有发现匹配,而在另一个位置才找到数据(伪命中)时,需要1个额外的周期,而且不交换两个Cache中的数据,失效开销为50个时钟周期。试求:
推导出平均访存的时间公式。
利用(1)中得到的公式,对于2KBCache和128KBCache,重新计算伪相联的平均访存时间。请问哪一种伪相联更快?
假设 2KB直接映象Cache的总失效率为0.098,2路相联的总失效率为0.076;
128KB直接映象Cache的总失效率为0.010,2路相联的总失效率为0.007。
解:
不管作了何种改进,失效开销相同。不管是否交换内容,在同一“伪相联”组中的两块都是用同一个索引得到的,因此失效率相同,即:失效率伪相联=失效率2路。
伪相联cache的命中时间等于直接映象cache的命中时间加上伪相联查找过程中的命中时间*该命中所需的额外开销。
命中时间伪相联=命中时间1路+伪命中率伪相联×1
交换或不交换内容,伪相联的命中率都是由于在第一次失效时,将地址取反,再在第二次查找带来的。
因此 伪命中率伪相联=命中率2路-命中率1路=(1-失效率2路)-(1-失效率1路)
=失效率1路-失效率2路。交换内容需要增加伪相联的额外开销。
平均访存时间伪相联=命中时间1路+(失效率1路-失效率2路)×1
+失效率2路×失效开销1路将题设中的数据带入计算,得到:
平均访存时间2Kb=1+(0.098-0.076)*1+(0.076 *50 ) =4.822
平均访存时间128Kb=1+(0.010-0.007)*1+(0.007 *50 ) =1.353
显然是128KB的伪相联Cache要快一些。
5.12 假设采用理想存储器系统时的基本CPI是1.5,试利用表5.5,分别对于下述三种Cache计算CPI:
16KB直接映象统一Cache,采用写回法;
16KB两路组相联统一Cache,采用写回法;
32KB直接映象统一Cache,采用写回法。
解,CPI=CPI 执行+存储停顿周期数/指令数存储停顿由下列原因引起:
从主存中取指令
Lload和Store指令访问数据由TLB引起

.对于理想TLB,TLB失效开销为0。而对于统一Cache,R指令=R数据
P指令=主存延迟+传输一个块需要使用的时间=40+32/4=48(拍)
若为读失效,P数据=主存延迟+传输一个块需要使用的时间=40+32/4=48(拍)
若为写失效,且块是干净的,
P数据=主存延迟+传输一个块需要使用的时间=40+32/4=48(拍)
若为写失效,且块是脏的,
P数据=主存延迟+传输两个块需要使用的时间=40+64/4=56(拍)
CPI=1.5+[RP+(RP*20%)+0 ]
指令访存全是读,而数据传输指令Load或Store指令,
f数据*P数据=读百分比*(f数据*P数据)+写百分比*(f数据*P干净数据*其对应的百分比
+f数据*P脏数据*其对应的百分比)
=20%*(75%×48+25%*(50%*48+50%*(48+16)))=50(拍)
代入上述公式计算出结果为:
配置
失效率
CPI
16KB 直接统一映象
0.029
2.95
16KB两路统一映象
0.022
2.6
32KB直接统一映象
0.020
2.5