题6.32
解答:
题目分析过程:
高速缓存是4路组相连的,块大小为4个字节,有8组。地址宽为13位。
因此对高速缓存的地址格式来说,因为块的大小为4个字节,而且存储每次访问1个字节,所以最低的2位第0到1位是块偏移;又因为一共有8个组,所以需要3位二进制做组索引,所以第2到4位是组索引,剩下的5到12位是标记位。
因为引用的地址是0x0718写成二进制是0000011100011000,因此取低13位做缓存地址格式也就是0 0 1 1 1 0 0 0 1 1 0 0 0
其中最低两位0 0 是块偏移 转化成16进制就是0x0
2到4位110是组索引 转化成16进制就是0x6
5到12位00000111000是标记位 转化成16进制就是0x38
所以答案如下
A:
地址格式:
0 0 1 1 1 0 0 0 1 1 0 0 0
B:
存储器引用:
块偏移 0x0
组索引 0x6
标记位 0x38
是否命中 是
返回的高速缓存值 0xFA
题6.33
解答:
题目分析过程:
高速缓存是4路组相连的,块大小为4个字节,有8组。地址宽为13位。
因此对高速缓存的地址格式来说,因为块的大小为4个字节,而且存储每次访问1个字节,所以最低的2位第0到1位是块偏移;又因为一共有8个组,所以需要3位二进制做组索引,所以第2到4位是组索引,剩下的5到12位是标记位。
因为引用的地址是0x16EC写成二进制是0001011011101100,因此取低13位做缓存地址格式也就是1 0 1 1 0 1 1 1 0 1 1 0 0
其中最低两位0 0 是块偏移 转化成16进制就是0x0
2到4位011是组索引 转化成16进制就是0x3
5到12位00010110111是标记位 转化成16进制就是0xB7
所以答案如下
A:
地址格式:
1 0 1 1 0 1 1 1 0 1 1 0 0
B:
存储器引用:
块偏移 0x0
组索引 0x3
标记位 0xB7
是否命中 否
返回的高速缓存值 ——(无)
题6.37
解答:
A:不命中率是1 (100%不命中)
分析:
高速缓存的字节是1024字节,每个块大小是32字节,运用直接映射,所以一共有1024/32也就是32个组,所以组索引位数是5位,因为每次读4个字节,一个块有32个字节,所以块偏移位数有3位。剩下的高位为标记为。因为二维数组的储存是按行储存的,因此对于x[0][i]和x[1][i]来说,低8位是相同的,第九位才不一样,也就是说他们的组索引和字偏移都相同,但是不属于同一个块。因此第一次加载时为空不命中,之后的每一次加载时都需要重新把相应的块加载到缓存中,每次都会不命中。因此这种情况下不命中率是1
B:不命中率是1 /4 (25%不命中)
分析:
高速缓存的字节是2048字节,每个块大小是32字节,运用直接映射,所以一共有2048/32也就是64个组,所以组索引位数是6位,因为每次读4个字节,一个块有32个字节,所以块偏移位数有3位。剩下的高位为标记为。因为二维数组的储存是按行储存的,因此对于x[0][i]和x[1][i]来说,低8位是相同的,第九位才不一样,也就是说他们的组索引是不相同的,字偏移相同。这时可以同时把两个块加载到缓存,并且可以把整个数组都加载到缓存中。而且对于每一个块中的元素,只有第一次为空的时候加载会不命中。因此不命中率为1/4.
C:不命中率是1 /4 (25%不命中)
分析:
高速缓存的字节是1024字节,每个块大小是32字节,运用两路组相连映射,所以一共有1024/64也就是16个组,所以组索引位数是4位,因为每次读4个字节,一个块有32个字节,所以块偏移位数有3位。剩下的高位为标记为。因为二维数组的储存是按行储存的,因此对于x[0][i]和x[1][i]来说,低8位是相同的,第九位才不一样,也就是说他们的组索引是相同的,字偏移也相同。但是因为每个组有两行,所以可以同时把这两个块都加载到这个行中。这时可以同时把两个块加载到缓存,并且对于这个块中剩下的3个数据的访问都能命中。因此只有每个块第1个数据访问时不会命中。因此这个访问的不命中率是1/4
D:不能
分析:因为加载到缓存的时候每次都是加载到一个固定的组中的一个块的数据,这个不命中率并不是因为缓存的大小而引起的,并不是和组数相关的,而是由块的大小决定了,即使换了更大的缓存,每次还是只能加载一个块,还是只有第一个不命中,后面三个命中,不命中率还是1/4,不会发生改变。
E:能
分析:因为这种情况下不命中率是由块的大小决定的,加载到缓存的时候每次都是加载到一个固定的组中的一个块的数据,这个不命中率和块的大小相关,每次加载了一个块之后这个块中第一个数据后面的数据在读取时都能命中,因此不命中情况只发生在这个块第一次加载到缓存中时,不命中率是1/(块中的数据个数),因此增加块的大小会让后面命中的数据更多,从而就能降低不命中率。如果假设每个块中有64个字节,那每次就能加载8个int型数据,这样不命中率就能降到1/8
题6.37
解答:有25%的写会不命中。
缓存的大小为64KB,采用直接映射的方法,每个行中有4个字节,因为一个pixel结构体中就包含了4个字节,我们要进行操作的是一个结构体数组,每次进行清零的是一个结构体中的4个变量也就是连续的4个字节,因此在访问的时候结构体的第一个元素一定是不命中的。每个块加载时只能加载正好一个结构体,也就是4个字节。而且每新访问一个结构体的4个字节,一定会进行一次重新加载,并且加载后剩下三个元素都能命中,因此不命中率整体上也就是1/4