cuda矩阵相乘_cuda初学(1):稀疏矩阵向量乘法(单精度)
初步学习CUDA编程,实现简单稀疏矩阵向量乘法运算,由于硬件限制,目前只测试了单精度程序
GPU计算子程序gpu_fmmv.cu:
#include #include // CUDA-C includes
#include
#ifdef __cplusplus
extern "C" {
#endif
// For Fortran interface //
#define GPU_fmmv gpu_fmmv_
extern void GPU_fmmv(int *, int *, int *, float *, float *, float *);
#ifdef __cplusplus
}
#endif
#define THREAD_NUM 512
__global__ static void fmmv(int *neq, int *numcol, int *ia, float *a, float *v, float *w)
{
const int tId = threadIdx.x;
int row, col;
for(row = tId; row < *neq; row += THREAD_NUM){
w[row] = 0.0;
for(int num = numcol[row]; num < numcol[row+1]; num ++){
col = ia[num]-1;
w[row] += a[num]*v[col];
}
}
}
void GPU_fmmv(int *neqi, int *numcol, int *ia, float *a, float *v, float *w)
{
int *gpu_neq;
int *gpu_ia, *gpu_numcol;
float *gpu_a, *gpu_v, *gpu_w;
int neq = *neqi;
int nnz = numcol[neq];
/* Malloc space on GPU device */
cudaMalloc((void **) &gpu_neq, sizeof(int));
cudaMalloc((void **) &gpu_numcol, sizeof(float)*(neq+1));
cudaMalloc((void **) &gpu_ia, sizeof(int)*nnz);
cudaMalloc((void **) &gpu_a, sizeof(float)*nnz);
cudaMalloc((void **) &gpu_v, sizeof(float)*neq);
cudaMalloc((void **) &gpu_w, sizeof(float)*neq);
/* Copy data to GPU device */
cudaMemcpy(gpu_neq, &neq, sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(gpu_numcol, numcol, sizeof(int) * (neq+1), cudaMemcpyHostToDevice);
cudaMemcpy(gpu_ia, ia, sizeof(int) * nnz, cudaMemcpyHostToDevice);
cudaMemcpy(gpu_a, a, sizeof(float) * nnz, cudaMemcpyHostToDevice);
cudaMemcpy(gpu_v, v, sizeof(float) * neq, cudaMemcpyHostToDevice);
fmmv<<<1,THREAD_NUM,0>>>(gpu_neq, gpu_numcol, gpu_ia, gpu_a, gpu_v, gpu_w);
cudaMemcpy(w, gpu_w, sizeof(float) * neq, cudaMemcpyDeviceToHost);
cudaFree(gpu_neq);
cudaFree(gpu_numcol);
cudaFree(gpu_ia);
cudaFree(gpu_a);
cudaFree(gpu_v);
cudaFree(gpu_w);
}
主调用程序testgpu.f:
implicit real*4(a-h, o-z)
dimension numcol(1000), ia(10000)
dimension a(10000), v(1000), w(1000)
character*12 fname
numarg = 0
numarg = numarg + 1
call getarg(numarg, fname)
print *,'fname : ', fname
open(21,file=fname,form='formatted',status='old')
read(21,*) neq
read(21,*) (numcol(i),i=1,neq+1)
do i=1, neq
read(21,*) (ia(j),j=numcol(i)+1, numcol(i+1))
enddo
do i=1,neq
read(21,*) (a(j),j=numcol(i)+1, numcol(i+1))
enddo
read(21,*) (v(i),i=1,neq)
close(21)
call gpu_fmmv(neq, numcol, ia, a, v, w)
print *,'w ======'
print *,(w(i),i=1,neq)
stop 0000
end
编译命令:
nvcc -c gpu_fmmv.cu
ifort -o fmvv -L /usr/local/cuda/lib64/ -lcudart gpu_fmmv.o testgpu.f
cuda矩阵相乘_cuda初学(1):稀疏矩阵向量乘法(单精度)相关推荐
- cuda矩阵相乘_CUDA入门实战2:将矩阵乘法速度提升5000倍
本实验采用不同的方法来计算 8192 * 8192 的整型矩阵乘法运算. C语言版 C语言是大家公认的高性能语言,那我们就从C语言开始吧. // 用一位数组表示二维矩阵 mat1 = (int*) m ...
- cuda矩阵相乘_CUDA计算矩阵相乘
1.最简单的 kernel 函数 __global__ void MatrixMulKernel( float* Md, float* Nd, float* Pd, int Width) { int ...
- Torch中的矩阵相乘分类
矩阵相乘在torch中的几种情况 1.矩阵逐元素(Element-wise)乘法 torch.mul(mat1, other) mat和other可以是标量也可以是任意维度的矩阵,只要满足最终相乘是可 ...
- NVIDIA CUDA 高度并行处理器编程(九):并行模式:稀疏矩阵-向量乘法
并行模式:稀疏矩阵-向量乘法 背景 使用 CSR 格式的并行 SpMV 填充与转置 使用混合方法来控制填充 通过排序和划分来规则化 介绍并行算法中的压缩与规格化 背景 稀疏矩阵是很多元素是 0 的矩阵 ...
- CUDA实现矩阵相乘
文章目录 前言 1.简单思路 分析 2.优化 总结 前言 本文主要借助CUDA实现矩阵相乘. 1.简单思路 #include <stdio.h>#define BLOCK_NUM 8 #d ...
- C语言求任意两个矩阵相乘的算法(初学尝试矩阵乘法)
C语言求任意两个矩阵相乘的算法(不同于大部分规格固定的矩阵乘法) 结果图如下 : 代码如下: //----- 任意两个矩阵相乘 # include <stdio.h> int main ...
- pytorch 矩阵相乘_深入浅出PyTorch(算子篇)
Tensor 自从张量(Tensor)计算这个概念出现后,神经网络的算法就可以看作是一系列的张量计算.所谓的张量,它原本是个数学概念,表示各种向量或者数值之间的关系.PyTorch的张量(torch. ...
- HLS 开发学习(五) 稀疏矩阵向量乘法
文章目录 稀疏矩阵向量乘法 CRS数据结构 稀疏矩阵向量乘 Test bench 测试用例 优化 稀疏矩阵向量乘法 CRS数据结构 b即为a的CRS表示,值(values)数组保存矩阵中非零元素的值. ...
- 并行计算——OpenMP加速矩阵相乘
OpenMP是一套基于共享内存方式的多线程并发编程库.第一次接触它大概在半年前,也就是研究cuda编程的那段时间.OpenMP产生的线程运行于CPU上,这和cuda不同.由于GPU的cuda核心非常多 ...
最新文章
- Android 串口通讯 获取卡号
- stm32 GPIO模式
- Java黑皮书课后题第8章:*8.8(所有最近的点对)修改程序清单8-3,找出所有所有具有最小距离的点对。下面是一个运行示例
- P4103 [HEOI2014]大工程
- OOB套接字传输实例(达不到预期结果)
- Spring 定时任务的几种实现
- Greenplum segment级问题的排查 - gp_session_role=utility (含csvlog日志格式解读)
- OpenCV成长之路:直线、轮廓的提取与描述
- 2015计算机二级java真题_2015年计算机二级考试java试题
- 如何在Windows下发布QT应用程序
- nginx 反向代理时丢失端口的解决方案(转)
- ListView多种item注意以及自己出现的莫名其妙的错误
- opencv小球与颜色识别
- pageadmin CMS网站建设教程:模板中如何实现信息数据共享
- python的easyocr图像文字识别
- 语言-汉语-官话-中原官话-兖菏片:兖菏片
- 支付宝「银行卡绑定流程」设计资源分享
- 理想国pandas练习题4
- 相量的瞬时功率 平均功率 无功功率 视在功率
- 64位系统最大支持多少内存
热门文章
- try…finally与嵌套及自定义异常抛出
- LeetCode228场周赛解题报告
- 数据库开发设计规范及表结构设计原则
- firewall mysql端口_Centos7 firewall开放3306端口
- mysql scope runtime_maven scope provided和runtime的例子
- 文末送书 | Facebook:易于解释的神经元可能会阻碍神经网络的学习
- iPhone X 刘海打理指北
- 论文浅尝 - AAAI2020 | 多轮对话系统中的历史自适应知识融合机制
- Linux系统中Oracle数据库使用SELECT语句检索数据(1)实例应用
- Dubbo+Zookeeper+SpringBoot