cuda编程入门:使用cuda实现矩阵加法
使用cuda实现矩阵加法
1.整体流程
1.申请内存
2.转移拷贝
3.释放空间
4.核函数
2.头文件
- 关于cuda操作的一些接口都在这个头文件里
#include <cuda_runtime.h>
3.申请内存
cudaMalloc()接口
参数 | 含义 |
---|---|
void *p | 内存地址的指针 |
size_t s | 申请的内存大小 |
cudaError_t | 返回类型 |
cudaError_t cudaMalloc(void **p, size_t s)
4.转移拷贝
cudaMemcpy()接口
参数 | 含义 |
---|---|
void *dst | 目标设备指针 |
const void *src | 源设备指针 |
size_t count | 内存复制的字节大小 |
cudaMemcpyKind | 含义 |
---|---|
cudaMemcpyHostToDevice | CPU–>GPU |
cudaMemcpyDeviceToHost | GPU–>CPU |
cudaError_t cudaMemcpy(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind);
5.释放空间
cudaFree接口
cudaError_t cudaFree(void *devPtr);
6.核函数
1.定义
__global__
标志核函数,在host
调用,在device
上执行- 核函数的返回类型必须是
void
threadIdx
线程索引 thread indexblockDim
线程块维度blockIdx
线程块索引 block index
__global__
void vecAddKernel(float* A_d, float* B_d, float* C_d, int n)
{// GPU中执行并行计算的thread id// 类比CPU中计算数组位置int i = threadIdx.x + blockDim.x * blockIdx.x;if (i < n) C_d[i] = A_d[i] + B_d[i];
}
2.调用
<<< >>>
告诉运行时如何启动设备(调用几个block,调用几个线程)
vecAddKernel <<< blockPerGrid, threadPerBlock >>> (da, db, dc, n);
7.编译与运行
使用nvcc进行编译
# 命令行终端执行
nvcc my_gpu_add.cu -o my_gpu_add
生成可执行文件my_gpu_add
运行
# 参数为执行加法运算的次数,相当于数组的大小
./my_gpu_add 1
8.源代码
附上源代码
// my_gpu_add.cu
#include <iostream>
#include <cuda_runtime.h>
#include <cstdlib>// 核函数
__global__
void vectorAddKernel(float * A_d, float * B_d, float * C_d, int n){int i = threadIdx.x + blockDim.x * blockIdx.x;if(i <= n) C_d[i] = A_d[i] + B_d[i];
}int main(int argc, char * argv[]){int n = atoi(argv[1]);std::cout << "执行加法" << n << "次" << std::endl;// 要申请的内存大小size_t size = n * sizeof(float);// 先在host上申请内存,生成数据// 在CPU上使用 free - malloc 申请内存方式float *a = (float*)malloc(size);float *b = (float*)malloc(size);float *c = (float*)malloc(size);// 生成随机数组for(int i = 0; i < n; i++){float af = rand() / double(RAND_MAX);float bf = rand() / double(RAND_MAX);a[i] = af;b[i] = bf;}// 定义device指针float * da = NULL;float * db = NULL;float * dc = NULL;// 显存申请cudaMalloc((void **) &da, size);cudaMalloc((void **) &db, size);cudaMalloc((void **) &dc, size);// 转移拷贝 host --> devicecudaMemcpy(da, a, size, cudaMemcpyHostToDevice);cudaMemcpy(db, b, size, cudaMemcpyHostToDevice);cudaMemcpy(dc, c, size, cudaMemcpyHostToDevice);// 调用核函数vectorAddKernel<<< n/256+1, 256>>> (da, db, dc, n);std::cout<<"nblockPerGrid:"<<n/256 +1 <<"\n";// 转移拷贝 device --> hostcudaMemcpy(c, dc, size, cudaMemcpyDeviceToHost);// 释放显存cudaFree(da);cudaFree(db);cudaFree(dc);// std::cout<<"a:"<<*a<<"\n";// std::cout<<"b:"<<*b<<"\n";// std::cout<<"c:"<<*c<<"\n";/*$ ./my_gpu_add 1a:0.840188b:0.394383c:1.23457通过这个输出可以看出:计算结果是正确的*/// 释放空间free(a);free(b);free(c);return 0;
}
cuda编程入门:使用cuda实现矩阵加法相关推荐
- 【转载】cuda编程入门
目录 1.什么是CUDA 2.为什么要用到CUDA 3.CUDA环境搭建 4.第一个CUDA程序 5. CUDA编程 5.1. 基本概念 5.2. 线程层次结构 5.3. 存储器层次结构 5.4. 运 ...
- 2.CUDA 编程手册中文版---编程模型
2.编程模型 更多精彩内容,请扫描下方二维码或者访问https://developer.nvidia.com/zh-cn/developer-program 来加入NVIDIA开发者计划 本章通过概述 ...
- CUDA编程学习3——并行计算初窥CUDA的软硬件架构
目录 并行计算概述 查看GPU相关信息 软硬件架构基础 物理层(物理结构) 逻辑层(kernel组织) 物理层和逻辑层的总结 参考 并行计算概述 所谓并行计算的概念定义 同时多个计算资源一起工作(逻辑 ...
- CUDA C 编程指导(二):CUDA编程模型详解
CUDA编程模型详解 本文以vectorAdd为例,通过描述C在CUDA中的使用(vectorAdd这个例子可以在CUDA sample中找到.)来介绍CUDA编程模型的主要概念.CUDA C的进一步 ...
- cuda C 编程权威指南 Grossman 第2章 CUDA编程模型
2.1 CUDA编程模型概述 CUDA编程模型提供了一个计算机架构抽象作为应用程序和其可用硬件之间的桥梁. 通信抽象是程序与编程模型实现之间的分界线,它通过专业的硬件原语和操作系统的编译器或库来实现. ...
- (CUDA 编程1).CUDA 线程执行模型分析(一)招兵 ------ GPU的革命
(CUDA 编程1).CUDA 线程执行模型分析(一)招兵 ------ GPU的革命 作者:赵开勇 来源:http://www.hpctech.com/2009/0818/198.html 序:或许 ...
- Nvidia CUDA初级教程6 CUDA编程一
Nvidia CUDA初级教程6 CUDA编程一 视频:https://www.bilibili.com/video/BV1kx411m7Fk?p=7 讲师:周斌 GPU架构概览 GPU特别使用于: ...
- CUDA编程之快速入门-----GPU加速原理和编程实现
转载:https://www.cnblogs.com/skyfsm/p/9673960.html CUDA(Compute Unified Device Architecture)的中文全称为计算统一 ...
- 2023年的深度学习入门指南(10) - CUDA编程基础
2023年的深度学习入门指南(10) - CUDA编程基础 上一篇我们走马观花地看了下SIMD和GPGPU的编程.不过线条太粗了,在开发大模型时遇到问题了肯定还会晕. 所以我们还是需要深入到CUDA中 ...
最新文章
- 027_Badge标记
- 工作33:page值不能修改
- python写exploit采集器
- Linux进程间通信的方法和示例
- 使用gdb进行调试入门篇
- numpy缩放图片/调整图片大小
- 上瘾啦,又用 Python 制作销售数据可视化看板
- 利用python-pptx包批量修改ppt格式
- css固定定位的代码,CSS——相对定位、绝对定位、固定定位(示例代码)
- MT【337】糖水不等式
- 比较精确的计算农历节气的java源码
- efci 计算机网络,数值型关联规则挖掘在网络入侵检测系统中的应用研究
- 程序员计算机常用快捷键,19个程序员都爱不释手的键盘快捷键,快来看看你知道几个又用过几个吧!...
- PHP语言之面向对象编程
- 阿里java面试复盘 | 三面解说(已通过)
- 数据结构《职工管理系统》
- 魔力宝贝手机版服务器暂时无法登陆,《魔力宝贝手机版》服务器全面开启!
- 微信小程序H5射击游戏唤境制作教程分享
- 7.Linux文本查看(cat more head tail)详解
- Foxbase按條件刪除記錄
热门文章
- 【计算机毕业设计】546在线答疑系统文件
- 使用了未经检查或不安全的操作_【最详细】瓦斯检查员安全操作技术规程
- 有了ERP,还缺什么?
- 高速工业相机在流水线中的应用
- ElasticSearch——IK分词器的下载及使用
- 多种解决:“Word无法启动转换器mswrd632.wpc”方法
- 会计行业被计算机取代马云,会计从业取消 财务机器人上线 再不考下中级会计职称真的要被淘汰了...
- 【办公类-】周计划-洗牌提取《集体运动》名称
- [窗口操作] - 获取窗口菜单信息
- HDFS学习笔记 【Namenode/DN管理】