(1) 第一问。数组...
解答:
(1) 第一问。数组a分为2个页面存储。根据C语言程序段,数组a共有24×64=1536个元素,每个数组元素类型为int,sizeof(int)=4,即一个元素占4B内存,所以数组a占1536×4B=6KB内存。页面大小为4KB,数组元素在内存空间连续存放,需要占 ⌈6KB/4KB⌉=2 个页面。
第二问。对于数组a的访问,会发生2次缺页异常。因为在M上执行上述程序段之前数组a不在主存,且数组a分为2个页面存储。所以当访问这两个页面中第一个元素时,页面尚未调入内存,会产生缺页异常,总计2次缺页异常。
第三问。两个页故障地址分别是0042 2000H和0042 3000H。虚拟地址格式为,页面大小为4KB= 2^12 B,按字节编址,页内地址占低12位,虚拟地址为32位,虚页号占高32-12=20位。数组a在虚拟地址空间中分配的起始地址为0042 2000H,第一次缺页访问虚拟页号为0042 2H,数组元素在内存空间从低地址到高地址连续存放,所以第二次缺页访问虚拟页号为0042 3H,访问该页面第一个元素所在页内地址为000H,即访问位置为0042 3000H。所以两个页故障地址分别是0042 2000H和0042 3000H。
(2) 第一问。该程序段的数据访问没有时间局部性。
第二问。时间局部性是指如果某数据被访问过,不久以后该数据可能再次被访问。显然a中每个元素仅被访问1次,不存在重复访问,所以没有时间局部性。
(3) 第一问和第二问。组相联映射格式为 ,主存块大小为32B= 2^5 B,按字节编址,块内地址占低5位,数据区大小为8KB,有8KB/32B= 2^8 行,数据Cache采用4路组相联映射,有 2^8/4=2^6 组,组号占中间6位,虚拟地址为32位,主存字块标记占高32-5-6=21位。综上,虚拟地址中低5位(A4~A0)用作块内地址,低11位中高6位(A10~A5)用作Cache组号。
a[1][0]的虚拟地址0042 2100H。因为a的起始地址为0042 2000H,一行有64个元素,一个元素占4个地址单元,所以a[1][0]的虚拟地址是0042 2000H+(64×1+0)×4H=0042 2100H。
第四问。a[1][0]所在主存块对应的Cache组号是8。因为a[1][0]的虚拟地址0042 2100H = ,组号001 000B=8。
(4) 第一问。数组a占192个主存块。根据(1)第一问的结论,数组a占6KB内存,主存块大小为32B,由于a的起始地址为0042 2000H = ,第一个元素的块内地址是00000B=0,也就是数组a占用每个块都是用a中元素占满了,不存在数组a占了某个块的仅一部分内存空间的情况。所以数组a恰好占6KB/32B=192个主存块。
第二问。数组a的Cache命中率为87.5%。主存块大小为32B,数组a每个元素大小为4B,一个主存块包含32B/4B=8个元素,数组a按行优先存放,C语言程序段按行访问数组元素,每个元素仅访问一次,所以每访问每个主存块中第一个元素产生Cache缺失,剩余8-1=7次Cache命中,所以数组a的Cache命中率为7/8=87.5%。
第三问。数组a的Cache命中率为87.5%。将循环中i和j的次序调换后的C语言程序段按列访问数组元素,数据Cache采用4路组相联映射,a的起始地址为0042 2000H。
数组a按行优先存放,外层循环j总共有64次迭代,外层循环j的每8次迭代元素都会被映射到8个组中,数组a共有24行,外层循环j的每一次迭代只会映射到这8个组中某24/8=3行,每组有4行,3<4,所以外层循环的每一次迭代均不会发生对本次迭代中已经调入的主存块的替换。每个元素仅访问一次,所以每访问每个主存块中第一个元素产生Cache缺失,剩余8-1=7次Cache命中,所以数组a的Cache命中率为7/8=87.5%。
登录后提交答案
暂无评论,来抢沙发