文章目录

  • CUDA
    • GPU并行化的工作流程:
    • 修饰符
      • `__global__`
      • `__host__`
      • `__device__`
    • 内存分配

CUDA

随着显卡的发展,GPU越来越强大,而且GPU为显示图像做了优化。在计算上已经超越了通用的CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像计算以外的目的。

host 指代CPU及其内存,
device指代GPU及其内存。

CUDA程序中既包含host程序,又包含device程序,它们分别在CPU和GPU上运行。同时,host与device之间可以进行通信,它们之间可以进行数据拷贝。

GPU并行化的工作流程:

CPU发送一种称为kernel的函数到GPU。
GPU同时运行该函数的多个版本,称为threads。thread可以组合成block,一个kernel里的所有thread称为一个grid。

threads :thread的不同版本
block : 多个thread组成
grid:一个kernel里的所有thread

修饰符

__host__ 修饰符
__global__ 修饰符
__device__ 修饰符


__global__

__global__CUDA C/C++的函数修饰符,表示该函数为一个kernel函数,且

  1. 该函数会在GPU(device)上执行。
  2. 必须返回void
  3. 由主机(host)代码调用。
  4. 只能被CPU调用。

在调用kernel函数时,函数名后的<<<b, t>>>

  • b代表block的数目。
  • t代表每个block中thread的数目。
//kernel函数需要运行在4个block上,每个block有2个thread
__global__ void myKernel() {// ...
}void main()
{int block,thread;block=4;thread=2;myKernel<<<block,thread>>>();
}

__host__

  • 运行在CPU上,每次调用运行一次。
  • 只能被CPU调用。
  • 所有未显式标明函数前置修饰符的函数均为host函数。

__device__

  • 运行在GPU上,每次调用运行一次。
  • 只能被GPU调用。
#include <stdio.h>__device__ int dev1() {}
__device__ int dev2() {}
__global__ void run10Times() {//your code heredev1();dev2();//end of your code
}int main() {run10Times<<<2, 5>>>();printf("Hello, World!\n");return 0;
}

内存分配

cudaMalloc 分配设备上的内存
cudaMemcpy 将不同内存段的数据进行拷贝
cudaFree 释放先前在设备上申请的内存空间

__host__ cudaError_t cudaMalloc (void **devPtr, size_t size)/*该函数主要用来分配设备上的内存(即显存中的内存)。该函数被声明为了__host__,即表示被host所调用,即在cpu中执行的代码所调用。返回值:为cudaError_t类型,实质为cudaError的枚举类型,其中定义了一系列的错误代码。如果函数调用成功,则返回cudaSuccess。第一个参数,void ** 类型,devPtr:用于接受该函数所分配的内存地址。第二个参数,size_t类型,size:指定分配内存的大小,单位为字节。*/ __host__ cudaError_t cudaMemcpy (void *dst, const void *src, size_t count, enum cudaMemcpyKind kind)/*该函数主要用于将不同内存段的数据进行拷贝,内存可用是设备内存,也可用是主机内存第一个参数,void*类型,dst:为目的内存地址第二个参数,const void *类型,src:源内存地址第三个参数,size_t类型,count:将要进行拷贝的字节大小第四个参数,enum cudaMemcpyKind类型,kind:拷贝的类型,决定拷贝的方向。cudaMemcpyKind类型如下:cudaMemcpyHostToHost, cudaMemcpyHostToDevice, cudaMemcpyDeviceToHost, cudaMemcpyDeviceToDevice, cudaMemcpyDefault。*/ __host__ cudaError_t cudaFree (void* devPtr)/*该函数用来释放先前在设备上申请的内存空间(通过cudaMalloc、cudaMallocPitch等函数),注意,不能释放通过标准库函数malloc进行申请的内存。返回值:为错误代码的类型值。第一个参数,void**类型,devPtr:指向需要释放的设备内存地址。*/

cudaMemcpyKind类型如下:
cudaMemcpyHostToHost,
cudaMemcpyHostToDevice,
cudaMemcpyDeviceToHost,
cudaMemcpyDeviceToDevice,
cudaMemcpyDefault。

#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>
#include <cuda_runtime.h> __global__ void colonel(int *a_d){//your code here*a_d = 2;//end of your code
}int main(){int a = 0, *a_d;cudaMalloc((void**) &a_d, sizeof(int));cudaMemcpy(a_d, &a, sizeof(int), cudaMemcpyHostToDevice);colonel<<<1, 1>>>(a_d); cudaMemcpy(&a, a_d, sizeof(int), cudaMemcpyDeviceToHost);printf("a = %d\n", a);cudaFree(a_d);
}

CUDA GPU编程相关推荐

  1. GPU 编程入门到精通(一)之 CUDA 环境安装

    GPU 编程入门到精通(一)之 CUDA 环境安装 标签: cudagpunvidia GPU 编程入门到精通(一)之 CUDA 环境安装 标签: cudagpunvidia 2014-04-11 2 ...

  2. CUDA 编程上手指南:CUDA C 编程及 GPU 基本知识

    作者丨科技猛兽 编辑丨极市平台 本文原创首发于极市平台,转载请获得授权并标明出处. 推荐大家关注极市平台公众号,每天都会更新最新的计算机视觉论文解读.综述盘点.调参攻略.面试经验等干货~ 目录 1 C ...

  3. c cuda 指定gpu_《CUDA C编程权威指南》——1.3 用GPU输出Hello World-阿里云开发者社区...

    本节书摘来自华章计算机<CUDA C编程权威指南>一书中的第1章,第1.3节,作者 [美] 马克斯·格罗斯曼(Max Grossman),译 颜成钢 殷建 李亮,更多章节内容可以访问云栖社 ...

  4. GPU加速(一)CUDA C编程及GPU基本知识

    前 言 笔记来自深蓝学院<CUDA入门与深度神经网络加速> 补充:线程与线程 线程是进程中执行运算(CPU调度)的最小单位.同一类线程共享代码和数据空间:进程是资源分配的最小单位.每个进程 ...

  5. CUDA下的GPU编程入门--第一个CUDA程序

    CUDA是NVIDIA公司开发的一个用于GPU编程的开源框架,用于将GPU用于更广泛的数学计算,充当cpu的功能,所以只能在nvidia的GPU下实现,如果你的GPU不是nvidia的,赶紧去换一个吧 ...

  6. GPU编程自学2 —— CUDA环境配置

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

  7. CUDA (一):CUDA C 编程及 GPU 基本知识

    目录 1 CPU 和 GPU 的基础知识 2 CUDA 编程的重要概念 3 并行计算向量相加 4 实践 4.1 向量相加 CUDA 代码 4.2 实践向量相加 5 给大家的一点参考资料 1 CPU 和 ...

  8. 推荐书籍:CUDA并行程序设计:GPU编程指南

    过去的五年中,计算领域目睹了英伟达(NVIDIA)公司带来的变革.随后的几年,英伟达公司异军突起,逐渐成长为最知名的游戏硬件制造商之一.计算统一设备架构(Compute Unified Device ...

  9. NVIDIA GPU编程系列课程(CUDA编程)

    NVIDIA网站有一部分GPU编程系列的课程,具体的课程地址为: https://www.nvidia.cn/developer/online-training/community-training/ ...

最新文章

  1. hust1350Trie【字典树+dfs || 字典树 + LCA】
  2. dockerfile构建nginx服务
  3. what you should do if you want to exercise?
  4. 再赠邓超明(帮别人名字作诗)
  5. 2022中国私域流量管理研究报告
  6. 服务器与虚拟技术,云服务器与虚拟化服务器的区别
  7. 我就是认真:Linux SWAP 深度解读(必须收藏)
  8. python相关性系数显著性检验_线性回归模型中系数趋势显著性的Statsmodels-Wald检验...
  9. 重启计算机突然断网,今天电脑总是突然断网,怎么回事
  10. java毕业设计总结
  11. jvm full gc到底是啥意思
  12. Linux QT无法切换中文输入法
  13. size balanced tree (平衡二叉树) ----- 傻X树----陈启峰论文
  14. [旋转卡壳]最大土地面积 AcWing2617
  15. 精彩揭秘,一个高大上的机器人自动化工厂需要哪些标配?
  16. 逻辑运算符 与、或、非
  17. 客制化 GH60 XD60 像 Poker 一样的 60% 机械键盘 (2) 采购以及组装
  18. JavaScript的三个主要组成部分
  19. 分布式数字身份项目——微软DID
  20. HCIE安全笔试-H12-731 V2.0 判断题争议辨析

热门文章

  1. 数学分析中的基本定理
  2. Hello World!!!
  3. [卷积核]空洞卷积(转)
  4. JS中同名函数有效执行顺序
  5. git提交远程报错[rejected] master - master (fetch first)
  6. DOM操作 append prependTo after before
  7. CXF整合Spring开发WebService
  8. 教你做炫酷的蜂巢式图片墙
  9. IC卡设备驱动模块的代码
  10. android-pageviewer实现linearlayout的切换