家庭作业6.28+6.37+6.38——20135202、20135220
第六章家庭作业
分值分配
6.28:20135202(1.5) 20135220(0.5)
6.37:20135202(1) 20135220(3)
6.38:20135202(3) 20135220(1)
6.28 分值1分
(1)所有会在组6中命中的十六进制存储器地址:
由习题6.13的表可知,如要命中组六,需要标记位为91,组为6,也就是说八个CT位的值分别为1001 0001,三个CI的值为110,剩下两位是任意的,取值范围为00,01,10,11,所以所有的情况只有四种:
1 0010 0011 1000 = 0x1238
1 0010 0011 1001 = 0x1239
1 0010 0011 1010 = 0x123A
1 0010 0011 1011 = 0x123B
(2)命中组1的:同上题相同,八个CT值分别为0100 0101,三个CI值分别为001,有四种情况:
0 1000 1010 0100 = 0x08A4
0 1000 1010 0101 = 0x08A5
0 1000 1010 0110 = 0x08A6
0 1000 1010 0111 = 0x08A7
6.37 分值2分
题目
C程序:
int x[2][256];
int i;
int sum=0;
for (i=0;i<256;i++){
sum += x[0][i] * x[1][i];
}
-
sizeof(int) == 4
-
数组X从存储器地址0x0开始,按照行优先顺序存储。
-
每种情况中,高速缓存最开始时都是空的。
-
唯一的存储器访问是对数组x的条目进行访问,其他所有变量都存储在寄存器中。
A、假设高速缓存是1024字节,直接映射,高速缓存块大小为32字节,不命中率是多少?
直接映射是每组只有一个高速缓存行,块大小为32字节,表示可以存储8个int数值。
数组是按照行优先存储的,计算数组一行的大小为256*4=1024,所以高速缓存只够存数组的一行。
所以x[0]和x[1]的每一个元素(x[0][i]和x[1][i])对应的高速缓存是同一个块。
因此,每次请求都在加载,驱逐,替换。不命中率为100%。
B、高速缓存改为2048字节,不命中率是多少?
缓存足够大,可以存储整个数组
因此只有冷不命中,而块大小为32字节,表示可以存储8个int数值
所以每次都会加载x[0][i]~x[0][i+7]共8个数值到缓存组中,这里就只有x[0][i]是不命中的
所以不命中率为1/8 = 12.5%
C、高速缓存是1024字节,两路组相联,使用LRU替换策略,高速缓存块大小为32字节,不命中率是多少?
两路组相联表示每组有两个高速缓存行,而每行可以存储8个数值
高速缓存只有1024字节,不够存储数组
发生不命中的时候,一个是冷不命中,另一个是缓存中没有,需要加载进去
这时使用的是LRU替换策略,替换最近最少用的,替换的那一行的8个数值已经都用过了,再也不会用到了
所以最后还是相当于只有冷不命中,相当于每8个数据中只有一个是不命中的
所以不命中率为1/8 = 12.5%
D、C中,更大的高速缓存大小会帮助降低不命中率吗?
不会,因为块大小不变时,冷不命中的概率不可能被减小。
E、C中,更大的块大小会帮助降低不命中率吗?
会降低,因为一个块的大小增加,冷不命中的频率就降低。
6.38 分值2分
解:
由题意可知,C=4KB=4096 Bytes,而C = S x E x B,在直接映射高速缓存中E = 1,块大小B=16 Bytes,可得S = 256,一共有256个高速缓存组。
(1)N = 64时:
数组大小为2x64x4=512字节,缓存容量足够大,不用考虑容量不命中。
因为每块是16字节,数组中每个单元为4字节,所以四个一组,一共需要16组,每一组中的行都是满的
sumA步长为1,遵循了行优先顺序,这个里面只有冷不命中,就是四个中有一个不命中,不命中率为0.25
sumB是列优先,步长为N,每一次都会与上一次的映射到同一个块,导致每次都会冲突,所以不命中率为1
sumC中除了四个中有一个冷不命中外,还因为列扫描到i+1时的冲突不命中(每次都会映射到同一组同一块),所以不命中率为0.5
(2)N = 60时:
数组大小为2x60x4=480字节,缓存容量足够大,不用考虑容量不命中。
因为每块是16字节,数组中每个单元为4字节,所以四个一组,一共需要16组,但行中不是满的
sumA同上,只有冷不命中,不命中率为0.25
sumB消除了冲突不命中,不会每次都映射到同一组同一块,所以只有冷不命中,不命中率为0.25
sumC理由同上,只有冷不命中,不命中率为0.25