csapp2e 家庭作业 6.46

本文探讨了一种用于优化10000*10000数组转置算法的方法,通过减少循环次数和内存访问顺序改进了性能,从9.301s降低到3.830秒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void transpose(int *dst,int *src,int dim)
{
 int i,j;
 int im,jm;
 for(i=0;i<dim-3;i+=4)
 {
  im = i*dim;
  for(j=0;j<dim-3;j+=4)
  {
   jm = j*dim;

   dst[jm+i]=src[im+j];
   dst[jm+i+1]=src[im+dim+j];
   dst[jm+i+2]=src[im+2*dim+j];
   dst[jm+i+3]=src[im+3*dim+j];
   dst[jm+dim+i]=src[im+j+1];
   dst[jm+dim+i+1]=src[im+dim+j+1];
   dst[jm+dim+i+2] =src[im+2*dim+j+1];
   dst[jm+dim+i+3]=src[im+3*dim+j+1];
   dst[jm+2*dim+i]=src[im+j+2];
   dst[jm+2*dim+i+1]=src[im+dim+j+2];
   dst[jm+2*dim+i+2]=src[im+2*dim+j+2];
   dst[jm+2*dim+i+3]=src[im+3*dim+j+2];
   dst[jm+3*dim+i]=src[im+dim+j+3];
   dst[jm+3*dim+i+1]=src[im+dim+j+3];
   dst[jm+3*dim+i+2]=src[im+2*dim+j+3];
   dst[jm+3*dim+i+3]=src[im+3*dim+j+3];
  }
 }
 for(;i<dim;i++)
  for(;j<dim;j++)
   dst[j*dim+i]=src[i*dim+j];
}

 

 

用10000*10000的数组测试(linux下需要取消stack的大小限制才运行这么大的数组)

书上的程序平均需要 9.301s

优化后评价需要 3.830秒

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值