问答题 某计算机的主存地址空间大小为256MB,按字节编址。指令Cache和数据Cache分离,均有8个Cache行,主存与Cache交换的块大小为64B,数据Cache采用直接映射方式。现有两个功能相同的程序A和B,其伪代码如下:
程序A:
int a[256][256];
int sum_array1()
{
int i, j, sum=0;
for(i=0; i<256;i++)
for(j=0; j<256; j++)
sum+=a[i][j];
return sum;
}
程序B:
int a[256][256];
int sum array2()
{
int i, j, sum=0;
for(j=0; j<256; j++)
for(i=0; i<256; i++)
sum+=a[i][j];
return sum;
}
假定int类型数据用32位补码表示,程序编译时i,j,sum均分配在寄存器中,数组a按照行优先方式存放,其首地址为320(十进制数)。请回答下列问题,并说明理由或给出计算过程。
问答题 若不考虑用于Cache一致性维护和替换算法的控制位,则数据Cache的总容量为多少?
【正确答案】Cache中每一行必须有的信息包括1位有效位,标记信息和主存块数据。除此之外,还可能包括用于Cache一致性维护的修改位(DirtyBit)和用于替换算法的使用位(如LRU)等控制位。在本题中,不考虑用于Cache一致性维护和替换算法的控制位。
因为主存地址空间大小为256MB,又按字节编址,因而主存地址为log2(256M)=28位。
主存与Cache交换的块大小为64B,又按字节编址,其中log2(64)=6位为块内地址。
又数据Cache有8行,需要有log2(8)=3位行地址。
标志位的位数=28-6-3=19位。
综上所述,在不考虑用于Cache一致性维护和替换算法的控制位的情况下,数据Cache的总容量为8×(1bit+19bit+64×8bit)=4256bit=532B。
【答案解析】
问答题 数组元素a[0][31]和a[1][1]各自所在的主存块对应的Cache行号分别是多少?(Cache行号从0开始)
【正确答案】解法一:
首先把该数组元素的主存地址算出来,然后根据主存地址求出主存块号,最后用公式i=imodC计算出对应的Cache行号。其中i为主存块号,C为Cache行数,j为Cache行号。
又int型元素用32位补码表示,即占4B。所以:
①a[0][31]的地址为320+4×31=444,444/64=6余60,由题意知0开始编号,故该元素所在的主存块号为6。
i=6mod8=6,即对应的Cache行号为6。
②a[1][1]的地址为320+4×(1×256+1)=1348,1348/64=21余4,故该元素所在的主存块号为21。
j=21mod8=5,即对应的Cache行号为5。
解法二:
从1)可知,主存地址字段各段格式如下图所示。
[*]

主存地址字段各段格式

①将a[0][31]的地址444,写成28位二进制地址:
[*]
中间3位110为行索引,因此对应的Cache行号为6。
②将a[1][1]的地址1348,写成28位二进制地址:
[*]
中间3位101为行索引,因此对应的Cache行号为5。
【答案解析】
问答题 程序A和B的数据访问命中率各是多少?哪个程序的执行时间更短?
【正确答案】由题意知:编译时i,j,sum均分配在寄存器中,故数据访问命中率仅需要考虑数组a的访问情况。 ①由于数组a按行优先顺序存放,故程序A的数组访问顺序与存放顺序一致,故以此访问的数组元素位于相邻单元。那么每次将一个主存块装入Cache时,总是第一个数组元素缺失,其他全部命中,所以缺失数目与数组a所占的块数相等。数组a共有256×256=64K个元素,占64K×4B/64B=4K个主存块,也就是共缺失4K次。那么数据命中率即为: (64K-4K)/64K=93.75%。 ②程序B的数组访问顺序与存放顺序不同,依次访问的数组元素分布在相隔256×4=1024的单元处,即距离1024B/64B=16个主存块。而Cache只有8行,只能存最近访问的8个主存块,当程序B再次访问以前被装入Cache的主存块时,该主存块已经被替换出Cache,因此不能命中。由此可知,所有访问都不命中,那么数据命中率为0。 因此,程序A的执行速度比程序B快。
【答案解析】