矩阵乘法的开销问题

  1 #include <stdio.h>

  2 #include <time.h>

  3 

  4 int A[1000][2000]={{0}};                                                   

  5 int B[2000][3000]={{0}};

  6 int C[1000][3000]={{0}};

  7 void print_matrix(int row,int col,int a[row][col]);

  8 int main(){

  9 

 10     int i=1000,k=2000,j=3000;

 11     int x,y,z;

 12     int start = clock();

 13     for(y=0;y<k;y++)

 14         for (x=0;x<i;x++)

 15             for(z=0;z<j;z++)

 16                 {

 17                     C[x][z]+= A[x][y]*B[y][z];

 18 

 19                 }    

 20     int  end = clock();

 21     printf("time is%d\n ",(end-start));

 22     return 0;

当循环顺序是x,y,z时,所需时间最小,约为15.9s。当循环顺序是x,z,y时,时间为33.8s。当循环顺序是y,z,x时,时间是41s。

原因是C[x][z],A[x][y],B[y][z]的读写开销和最后一层循环的变量有关,当最后一层变量是z时,C[x][z]和B[y][z]的内存地址是连续的,

而当最后一层循环变量是x时,C[x][z]和A[x][y]的内存地址是跨页的(4*3000和4*2000>4096字节)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值