题目
(来源课堂)
考虑一个4行且每行16字节的cache,主存按每块16字节划分,即块0有地址0到15的16个字节,等等。现在考虑一个程序,它以如下地址顺序访问主存:
一次:63 ~ 70
循环10次:15 ~ 32,80 ~ 95
(a)假设cache采用直接映射技术。主存块0, 4, … 指派到行0;块1,5, … 指派到行1;以此类推。请计算命中率。
(b)假设cache采用二路组关联映射,共有两组,每组两行。偶序号块被指派到组0,奇序号块被指派到组1。请计算使用LRU替换策略的二路组关联cache的命中率。
解答
(a) 采用直接映射
- 一次访问:63 ~ 70
主存地址63-70为主存的第3、4块,将被指派到Cache的行3和0,访问过程中,顺序发生以下事件:
(i) 访问主存地址63,主存第3块被调入Cache的行3;
(ii) 访问主存地址64,主存第4块被调入Cache的行0;
(iii) 访问主存地址65-70,均为主存第4块,已经在Cache中,Cache均命中。 - 循环10次访问:15 ~ 32,80 ~ 95
主存地址15-32为主存的第0、1和2块,将被指派到Cache的行0、1和2。
主存地址80-95为主存的第5块,将被指派到Cache的行1。
在第1次循环中,顺序发生以下事件:
(i) 访问主存地址15,为主存第0块被调入Cache的行0;
(ii) 访问主存地址16,为主存第1块被调入Cache的行1;
(iii) 访问主存地址17-31,均为主存第1块,已经在Cache中,Cache均命中;
(iv) 访问主存地址32,为主存第2块被调入Cache的行2;
(v) 访问主存地址80,为主存第5块被调入Cache的行1;
(vi) 访问主存地址81-95,均为主存第5块,已经在Cache中,Cache均命中。
在后续的每次循环中,顺序发生以下事件:
(i) 访问主存地址15,为主存第0块,已经在Cache的行0中,命中;
(ii) 访问主存地址16,为主存第1块被调入Cache的行1;
(iii) 访问主存地址17-31,均为主存第1块,已经在Cache中,Cache均命中;
(iv) 访问主存地址32,为主存第2块,已经在Cache的行2中,命中;
(v) 访问主存地址80,为主存第5块被调入Cache的行1;
(vi) 访问主存地址81-95,均为主存第5块,已经在Cache中,Cache均命中。 - Cache命中率 = 缓存命中的次数/总共访问的访问次数
= (6 + (15 + 15) + (1 + 15 + 1 + 15) * 9) / (8 + (18 + 16) * 10)
= 324 / 348 = 93.1%
(b) 采用二路组关联映射
- 一次访问:63 ~ 70
主存地址63-70为主存的第3、4块,将被指派到Cache的行3和0,访问过程中,顺序发生以下事件:
(i) 访问主存地址63,主存第3块被调入Cache的行3;
(ii) 访问主存地址64,主存第4块被调入Cache的行0;
(iii) 访问主存地址65-70,均为主存第4块,已经在Cache中,Cache均命中。 - 循环10次访问:15 ~ 32,80 ~ 95
主存地址15-32为主存的第0、1和2块,将被指派到Cache的行0、1和2。
主存地址80-95为主存的第5块,将被指派到Cache的行1。
在第1次循环中,顺序发生以下事件:
(i) 访问主存地址15,为主存第0块被调入Cache组0的行1;
(ii) 访问主存地址16,为主存第1块被调入Cache组1的行1;
(iii) 访问主存地址17-31,均为主存第1块,已经在Cache中,Cache均命中;
(iv) 访问主存地址32,为主存第2块应被调入Cache的组0,但组0已满,根据LRU策略,将组0的行0替代,主存第2块调入Cache组0的行0;
(v) 访问主存地址80,为主存第5块应被调入Cache的组1,但组1已满,根据LRU策略,将组1的行0替代,主存第5块调入Cache组1的行0;
(vi) 访问主存地址81-95,均为主存第5块,已经在Cache中,Cache均命中。
此时后续循环所访问的主存块0、1、2和5均已在Cache中,因此后续循环缓存全部命中。 - Cache命中率 = 缓存命中的块数/总共访问内存的块数
= (6 + (15 + 15) + (18 + 16) * 9) / (8 + (18 + 16) * 10)
= 342 / 348 = 98.3%