以下是计算两个向量点积的程序段: float dotproduet(float x[8],float y[8]) { float Sum=0.0; int i; for(i=0,i

admin2014-04-17  36

问题 以下是计算两个向量点积的程序段:
    float dotproduet(float x[8],float  y[8])
    {
    float Sum=0.0;
    int  i;
    for(i=0,i<8;i++)
    sum+=x*y
    return  Sum;
    }
    试回答以下问题:
假定该段程序运行的计算机的数据Cache采用直接映射方式,其容量为32B,每个主存块大小为16B。假定编译程序将变量sum和i分配给寄存器,数组x存放在00000040H开始的32B的连续存储区中,数组y则紧跟在x后进行存放。试计算该程序数据访问的命中率,要求说明每次访问的Cache命中情况。

选项

答案Cache共有32B/16B=2行;4个数组元素占一个主存块(float占4B);数组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[0]~x[3]在主存第4块? 提示:因为数组x存放在00000040H开始的32B的连续存储区中,而00000040H转换成十进制为64,64B占4个主存块(0、1、2、3),所以x[0]~x[3]在主存第4块。

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

最新回复(0)