CUDA教程之——共享存储器(1)-矩阵相乘
来源:互联网 发布:阿里云幕布 高清下载 编辑:程序博客网 时间:2024/06/11 06:44
共享存储器(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;}
1 0
- CUDA教程之——共享存储器(1)-矩阵相乘
- CUDA教程之——共享存储器(2)-矩阵与自身转置相乘
- CUDA: 共享存储器实现矩阵相乘
- CUDA编程接口:共享存储器实现矩阵相乘
- CUDA矩阵乘法——利用共享存储器
- 【CUDA并行编程之四】矩阵相乘
- 【CUDA并行编程之四】矩阵相乘
- CUDA编程—通过shared memory优化矩阵相乘
- CUDA学习: 共享存储器
- CUDA矩阵相乘
- CUDA线程协作之共享存储器“__shared__”&&“__syncthreads()”
- 基于CUDA的矩阵相乘
- CUDA C 任意矩阵相乘
- CUDA之矩阵乘法——globalmemory
- CUDA之矩阵乘法——复数
- cuda 任意维度的矩阵相乘
- CUDA任意维度的矩阵相乘
- CUDA任意矩阵相乘 TLP最终版
- java常见对象集合
- Android实践:如何高效加载Bitmap
- invalidate()和postInvalidate() 的区别及使用
- Error: 'S' is not a valid file-based resource name character: File-bas
- NADetector实时流量监控软件
- CUDA教程之——共享存储器(1)-矩阵相乘
- springmvc 整合mybatis dao层不写实现类
- 简单的Git 命令:获取仓库文件和切换远程分支
- 合并排序数组 II
- 第五章笔记
- 关于super和this关键字调用构造器的几点总结
- php数据导出为txt文档和导入txt文档解析数据
- JAVA后台程序设计及UTIL.CONCURRENT包的运用
- Restful API 简单示例--HelloWorld