初步学习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):稀疏矩阵向量乘法(单精度)相关推荐

  1. cuda矩阵相乘_CUDA入门实战2:将矩阵乘法速度提升5000倍

    本实验采用不同的方法来计算 8192 * 8192 的整型矩阵乘法运算. C语言版 C语言是大家公认的高性能语言,那我们就从C语言开始吧. // 用一位数组表示二维矩阵 mat1 = (int*) m ...

  2. cuda矩阵相乘_CUDA计算矩阵相乘

    1.最简单的 kernel 函数 __global__ void MatrixMulKernel( float* Md, float* Nd, float* Pd, int Width) { int ...

  3. Torch中的矩阵相乘分类

    矩阵相乘在torch中的几种情况 1.矩阵逐元素(Element-wise)乘法 torch.mul(mat1, other) mat和other可以是标量也可以是任意维度的矩阵,只要满足最终相乘是可 ...

  4. NVIDIA CUDA 高度并行处理器编程(九):并行模式:稀疏矩阵-向量乘法

    并行模式:稀疏矩阵-向量乘法 背景 使用 CSR 格式的并行 SpMV 填充与转置 使用混合方法来控制填充 通过排序和划分来规则化 介绍并行算法中的压缩与规格化 背景 稀疏矩阵是很多元素是 0 的矩阵 ...

  5. CUDA实现矩阵相乘

    文章目录 前言 1.简单思路 分析 2.优化 总结 前言 本文主要借助CUDA实现矩阵相乘. 1.简单思路 #include <stdio.h>#define BLOCK_NUM 8 #d ...

  6. C语言求任意两个矩阵相乘的算法(初学尝试矩阵乘法)

    C语言求任意两个矩阵相乘的算法(不同于大部分规格固定的矩阵乘法) 结果图如下   : 代码如下: //----- 任意两个矩阵相乘 # include <stdio.h> int main ...

  7. pytorch 矩阵相乘_深入浅出PyTorch(算子篇)

    Tensor 自从张量(Tensor)计算这个概念出现后,神经网络的算法就可以看作是一系列的张量计算.所谓的张量,它原本是个数学概念,表示各种向量或者数值之间的关系.PyTorch的张量(torch. ...

  8. HLS 开发学习(五) 稀疏矩阵向量乘法

    文章目录 稀疏矩阵向量乘法 CRS数据结构 稀疏矩阵向量乘 Test bench 测试用例 优化 稀疏矩阵向量乘法 CRS数据结构 b即为a的CRS表示,值(values)数组保存矩阵中非零元素的值. ...

  9. 并行计算——OpenMP加速矩阵相乘

    OpenMP是一套基于共享内存方式的多线程并发编程库.第一次接触它大概在半年前,也就是研究cuda编程的那段时间.OpenMP产生的线程运行于CPU上,这和cuda不同.由于GPU的cuda核心非常多 ...

最新文章

  1. Android 串口通讯 获取卡号
  2. stm32 GPIO模式
  3. Java黑皮书课后题第8章:*8.8(所有最近的点对)修改程序清单8-3,找出所有所有具有最小距离的点对。下面是一个运行示例
  4. P4103 [HEOI2014]大工程
  5. OOB套接字传输实例(达不到预期结果)
  6. Spring 定时任务的几种实现
  7. Greenplum segment级问题的排查 - gp_session_role=utility (含csvlog日志格式解读)
  8. OpenCV成长之路:直线、轮廓的提取与描述
  9. 2015计算机二级java真题_2015年计算机二级考试java试题
  10. 如何在Windows下发布QT应用程序
  11. nginx 反向代理时丢失端口的解决方案(转)
  12. ListView多种item注意以及自己出现的莫名其妙的错误
  13. opencv小球与颜色识别
  14. pageadmin CMS网站建设教程:模板中如何实现信息数据共享
  15. python的easyocr图像文字识别
  16. 语言-汉语-官话-中原官话-兖菏片:兖菏片
  17. 支付宝「银行卡绑定流程」设计资源分享
  18. 理想国pandas练习题4
  19. 相量的瞬时功率 平均功率 无功功率 视在功率
  20. 64位系统最大支持多少内存

热门文章

  1. try…finally与嵌套及自定义异常抛出
  2. LeetCode228场周赛解题报告
  3. 数据库开发设计规范及表结构设计原则
  4. firewall mysql端口_Centos7 firewall开放3306端口
  5. mysql scope runtime_maven scope provided和runtime的例子
  6. 文末送书 | Facebook:易于解释的神经元可能会阻碍神经网络的学习
  7. iPhone X 刘海打理指北
  8. 论文浅尝 - AAAI2020 | 多轮对话系统中的历史自适应知识融合机制
  9. Linux系统中Oracle数据库使用SELECT语句检索数据(1)实例应用
  10. Dubbo+Zookeeper+SpringBoot