CUDA教程之——共享存储器(1)-矩阵相乘

  共享存储器(shared memory)是可以被同一个线程块中所有线程访问的可读写存储器,生存期是线程块的生命期。

   下面有矩阵乘法来说明共享存储器的相关知识。

    算法:矩阵A的高度为M,宽度为w。矩阵B的高度为w,宽度为N。矩阵C的高度为M,宽度为N。实现C=A×B的矩阵相乘。为了简化问题,我们将w取32,M和N取32的整数倍。

  分配资源

dim3 dimBlock(BLOCK_SIZE,BLOCK_SIZE);
dim3 dimGrid(N/dimBlock.x,M/dimBlock.y);

  

  未优化的核函数

__global__ void simpleMultiply(float* a,float* b,float* c,int N){
	int row=blockIdx.y*blockDim.y+threadIdx.y;
	int col=blockIdx.x*blockDim.x+threadIdx.x;
	float sum=0.0f;
	for(int i=0;i<TILE_DIM;i++){
			sum+=a[row*TILE_DIM+i]*b[i*N+col];
	}
	c[row*N+col]=sum;
}

  优化后的核函数:                  

__global__ void coalescedMultiply(float* a,float* b,float* c,int N){
	__shared__ float aTile[TILE_DIM][TILE_DIM],bTILE[TILE_DIM][TILE_DIM];
	int row=blockIdx.y*blockDim.y+threadIdx.y;
	int col=blockIdx.x*blockDim.x+threadIdx.x;
	float sum=0.0f;
	aTILE[threadIdx.y][threadIdx.x]=a[row*TILE_DIM+threadIdx.x];
	bTILE[threadIdx.y][threadIdx.x]=b[threadIdx.y*N+col];
	__syncthreads();
	for(int i=0;i<TILE_DIM;i++){
			sum+=aTile[threadIdx.y][i]*bTile[i][threadIdx.x];
	}
	c[row*N+col]=sum;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值