问答题
以下是计算两个向量点积的程序段:
float dotproduct(float
x[8],float y[8]);
{
float sum=0.0;
int i;
for(i=0;i<8;i++)
sum+=x[i]*y[i];
return sum;
}
试回答以下问题:
问答题
访问数组x和y时的时间局部性和空间局部性各如何?能否推断出命中率的高低?
【正确答案】数组x和y都按存放顺序访问,不考虑映射的情况下,空间局部性都较好,但都只被访问一次,所以没有时间局部性。命中率的高低与块大小、映射方式等都有关,所以无法推断命中率的高低。
【答案解析】
问答题
假定该段程序运行的计算机的数据Cache采用直接映射方式,其容量为32B,每个主存块大小为16B。假定编译程序将变量sum和i分配给寄存器,数组x存放在00000040H开始的32B的连续存储区中,数组y则紧跟在x后进行存放。试计算该程序数据访问的命中率,要求说明每次访问的Cache命中情况。
【正确答案】Cache共有32B/16B=2行;4个数组元素占一个主存块(float占4个字节);数组x的8个元素(共32B)分别存放在主存40H开始的32个单元中,共占有两个主存块,其中x[0]~x[3]在主存第4块(块号从0开始),X[4]~x[7]在主存第5块中;数组y的8个元素分别在主存第6块和第7块中。所以,x[0]~x[3]和y[0]~y[3]都映射到Cache第0行;x[4]~x[7]和y[4]~y[7]都映射到Cache第1行;因为x[i]和y[i](0≤i≤7)总是映射到同一个Cache行,相互淘汰对方,所以每次都不命中,命中率为0。
解析:因为数组x存放在00000040H开始的32B的连续存储区中,而00000040H转换成十进制为64,64B占4个主存块(0、1、2、3),所以x[0]~x[3]在主存第4块。
【答案解析】
问答题
将上述(2)中的数据Cache改用2-路组相联映射方式,块大小改为8B,其他条件不变,则该程序数据访问的命中率是多少?
【正确答案】若Cache改用2-路组相联,块大小改为8B,则Cache共有4行,每组两行,共两组。两个数组元素占一个主存块。数组x有4个主存块,x[0]~x[1]、x[2]~x[3],x[4]~x[5],x[6]~X[7],分别在主存第8~11块中;数组y有4个主存块,y[0]~y[1]、y[2]~y[3],y[4]~y[5],y[6]~y[7],分别在主存第12~15块中;因为每组有两行,所以x[i]和y[i](0≤i≤7)虽然映射到同一个Cache组,但可以存放到同一组的不同Cache行内。因此,不会发生冲突。每调入一个主存块,装入的两个数组元素中,第2个数组元素总是命中的,所以命中率为50%。
【答案解析】
问答题
在上述(2)中条件不变的情况下,如果将数组x定义为float[12],则数据访问的命中率又是多少?
【正确答案】若(2)中条件不变,数组x定义了12个元素,则12个元素共有48B,使得y从主存第7块开始存放,即x[0]~x[3]在主存第4块,x[4]~x[7]在主存第5块,x[8]~x[11]在主存第6块中,y[0]~y[3]在主存第7块,y[4]~x[7]在主存第8块。因而,x[i]和y[i](0≤i≤7)就不会映射到同一个Cache行中。每调入一个主存块,装入4个数组元素,第一个元素不命中,后面3个总命中,所以命中率为75%。
【答案解析】