cuda中的矩阵乘法
来源:互联网 发布:圣元 淘宝网折 编辑:程序博客网 时间:2024/05/16 08:26
乘法的形式都一样,都是分配一样的线程,两种形式不同的地方在于处理矩阵大小不同,通过分块的方法解决大矩阵的问题,两种形式的代码如下;
_global_void MatrixMulKernel(float*Md,float *Nd,float *Pd,int Width)
{
//2维线程ID
int tx = threadIdx.x;
int ty = threadIdx.y;
//Pvalue 存储线程计算得到的Pd中的元素
float Pvalue = 0;
for(int k=0;k<Width;++k)
{
float Mdelement = Md[ty*Width+k];
float Ndelement = Nd[k*Width+tx];
Pvalue+=Mdelement*Ndelement;
}
//把矩阵写入设备存储器,每个线程负责写一个元素
Pd[ty*Width+tx]=Pvalue;
}
//设置对应的执行配置参数,dim3类型的struct变量
dim3 dimBlock(Width,Width);//描述块的配置
dim3 dimGrid(1,1);//描述网格的配置信息,一共多少块
第二种方式,分块,怎么分块,分多少块,都可以根据自己的意愿来修改以便应对不同大小的矩阵。
_global_void MatrixMulKernel(float *Md, float *Nd, float *Pd ,int Width)
{
//计算Pd和Md中的元素的行索引和列索引
int Row = blockIdx.y*TILE_WIDTH+threadIdx.y;
int Col = blockIdx.x*TILE_WIDTH+threadIdx.x;
float Pvalue =0;
//每个线程负责计算块子矩阵的一个矩阵
for(int k=0;k<Width;++k)//Width是矩阵的总长度
{
Pvalue+=Md[Row*Width+k]*Nd[k*Width+Col];
}
Pd[Row*Width+Col]=Pvalue;//按行放
}
//设置执行配置参数
dim3 dimGrid(Width/TILE_WIDTH,Width/TILE_WIDTH);每个网格分配多少块
dim3 dimBlock(TILE_WIDTH,TILE_WIDTH);//每个块分配多少个线程
//启动用于计算线程的设备
MatrixMulKernel<<<dimGrid,dimBlock>>>(Md,Nd,Pd,Width)
注意:我觉得这个地方的索引和按列存储还是有些绕,的好好琢磨一下子。
- cuda中的矩阵乘法
- CUDA矩阵乘法
- CUDA 矩阵乘法优化
- CUDA:矩阵乘法原理
- CUDA: 矩阵乘法优化
- cuda 矩阵乘法
- cuda编程------矩阵乘法
- CUDA: 矩阵乘法优化
- CUDA矩阵乘法
- CUDA矩阵乘法
- Java通过JNI调用CUDA矩阵乘法
- CUDA Fortran 稀疏矩阵 乘法 测试
- 矩阵乘法——CUDA 优化记录
- CUDA编程(九)并行矩阵乘法
- CUDA之矩阵乘法——globalmemory
- CUDA之矩阵乘法——复数
- CUDA学习--矩阵乘法的并行运算
- CUDA程序性能分析-矩阵乘法
- 2016-5-20
- 机器学习: 神经网络中的Error函数
- Survive in the White Terror
- bootstrap模态框配置
- Struts2与Spring集成中的自动装配策略
- cuda中的矩阵乘法
- JAVA异常信息Exception e,e的相关方法
- java.lang.NoSuchMethodError: android.os.StatFs.getAvailableBlocksLong
- HBase Java API类介绍
- Unity3D协程介绍 以及 使用
- JavaSE入门学习45:文件传输基础之I/O流(四)
- NW.js & Electron Compared (2016 Edition)
- 一个简单的通过代码请求k8s生成应用的demo
- 使用JDBC连接mysql,db2等数据库