以下是计算两个向量点积的程序段: float dotproduct (float x L83 f float y [8] ) float sum=0.0; int i; for (i=0;i<8;1++) sum+=x [i] *y [i) ; re

admin2017-04-28  43

问题 以下是计算两个向量点积的程序段:
float  dotproduct (float  x L83 f float  y [8] )
float sum=0.0;
int i;
for (i=0;i<8;1++)
sum+=x *y [i) ;
return sum;
}
试回答以下问题:
假定该段程序运行的计算机的数据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块(块号从O开始),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[0]~x[3]在主存第4块? 解析:因为数组x存放在00000040H开始的32B的连续存储区中,而00000040H转换成十进制为64,64B占4个主存块(0、1、2、3),所以x[0]~x[3]在主存第4块。

解析
转载请注明原文地址:https://jikaoti.com/ti/mnfjFFFM
0

最新回复(0)