首页 > 编程语言 >【转载】CUDA编程学习记录 C++

【转载】CUDA编程学习记录 C++

时间:2023-11-02 11:12:51浏览次数:42  
标签:__ 编程 C++ host 线程 CUDA device block 内存

参考 Yuezero 的 CUDA编程基础(https://blog.csdn.net/weixin_54338498/article/details/127947551)

CUDA 编程模型

host 指代 CPU及其内存,包含host程序
device 指代 GPU及其内存,包含device程序

经典CUDA程序的执行流程如下:

  1. 分配host内存,并进行数据初始化;
  2. 分配device内存,并从host将数据拷贝到device上;
  3. 调用CUDA的核函数在device上完成指定的运算;
  4. 将device上的运算结果拷贝到host上;
  5. 释放device和host上分配的内存

线程层次结构

kernel在device上执行时实际上是启动很多线程,一个kernel所启动的所有线程称为一个网格grid,同一个网格上的线程共享相同的全局内存空间,grid是线程结构的第一层次,而网格又可以分为很多线程块block,一个线程块里面包含很多线程,这是第二个层次
tu1

核函数

使用__global__ 声明

__global__ 返回值类型 核函数名(形参列表){
	...
}

·在调用时需要用<<<grid, block>>>来指定kernel要执行的线程数量,grid是网格块数,block是每块的线程数。grid和block都是定义为dim3类型的变量,dim3可以看成是包含三个无符号整数(x,y,z)成员的结构体变量,在定义时,xyz的缺省值初始化为1。 因此grid和block可以灵活地定义为1-dim,2-dim以及3-dim结构。

dim3 grid(3, 2);//一个grid包含6个block
dim3 block(5, 3);//每个block包含15个线程
核函数名<<<grid,block>>>(实参列表)

线程

·在CUDA中,每一个线程都要执行核函数,并且每个线程会分配一个唯一的线程号thread ID,这个ID值可以通过核函数的内置变量threadIdx来获得。
因此一个线程需要两个内置的坐标变量(blockIdx,threadIdx)来唯一标识,它们都是dim3类型变量,其中blockIdx指明线程所在grid中的位置,而threaIdx指明线程所在block中的位置。
如上图中Thread(2,0)表示出来则是:

blockIdx.x = 1;
blockIdx.y = 1;
threadIdx.x = 2;
threadIdx.y = 0;

block组织结构

通过线程的内置变量blockDim来获取。它可以获取线程块各个维度的大小
同样,gridDim,用于获取网格各个维度大小。
grid的内置变量:x,y,z,gridDim
block的内置变量:x,y,z,blockDim

host和device函数区分

由于GPU实际上是异构模型,区别host和device上的函数,主要的三个函数类型限定词如下:

  • global:在device上执行,从host中调用(一些特定的GPU也可以从device上调用),返回类型必须是void,不支持可变参数参数,不能成为类成员函数。注意用__global__定义的kernel是异步的,这意味着host不会等待kernel执行完就执行下一步。
  • device:在device上执行,单仅可以从device中调用,不可以和__global__同时用。
  • host:在host上执行,仅可以从host上调用,一般省略不写,不可以和__global__同时用,但可和__device__,此时函数会在device和host都编译。

内存模型

CUDA的内存模型:每个线程有自己的私有本地内存(Local Memory),而每个线程块有包含共享内存(Shared Memory),可以被线程块中所有线程共享,其生命周期与线程块一致。此外,所有的线程都可以访问全局内存(Global Memory)。还可以访问一些只读内存块:常量内存(Constant Memory)和纹理内存(Texture Memory)
tu2

标签:__,编程,C++,host,线程,CUDA,device,block,内存
From: https://www.cnblogs.com/kirito-chen/p/17804676.html

相关文章

  • 如何查看windows的CUDA版本
    打开CMD命令行窗口,输入nvcc--version nvcc--versionnvcc:NVIDIA(R)CudacompilerdriverCopyright(c)2005-2020NVIDIACorporationBuiltonWed_Jul_22_19:09:35_Pacific_Daylight_Time_2020Cudacompilationtools,release11.0,V11.0.221Buildcuda_11.0_bu.relgpu_......
  • centos 7 下通过 conda 安装 cuda pytorch
    先查看自己的linux上显卡型号:#lspci|grep-invidia04:00.0VGAcompatiblecontroller:NVIDIACorporationGP102[GeForceGTX1080Ti](reva1)04:00.1Audiodevice:NVIDIACorporationGP102HDMIAudioController(reva1)查看是否有程序占用(如果存在占用,请停掉该程序......
  • 字符与数字的相互转换C++
    一、字符转数字char类型字符转换为数字,其实是转换为ASCII码值有两种方式:1.强制类型转换,结果为对应的ASCII码值charv1='a';charv2='z';charv3='1';charv4='9';intnum1=(int)v1;intnum2=(int)v2;intnum3=(int)v3;intnum4=(int)v4;printf......
  • (三)C#编程基础复习——数据类型
    C#语言中内置了一些基本的数据类型,数据类型用来指定程序中变量可以存储的数据的类型,C#中的数据类型可以大致分为三类:值类型(Valuetypes);引类型(Referencestypes);指针类型(Pointertypes);一、值类型值类型顾名思义就是有带数值的类型,C#中的值类型有非常多,值类型变量声明后,不......
  • 如何用c++开发远程协助软件,端对端的技术
     标题:使用C++开发远程协助软件的步骤与技巧摘要:随着科技的不断发展,远程协助软件在各个领域得到了广泛的应用。本文将介绍如何使用C++语言来开发一款简单的远程协助软件,并将重点放在基本功能的实现以及关键技术的解释上。关键词:C++、远程协助软件、网络通信、图形用户界面、安......
  • Tensorflow2.X+cuda+cudnn配置指南(RTX4060+win11+Anaconda3)
    【背景】前段时间要做一个python语音识别模型,需要tf进行训练,考虑到有GPU就不用限制在CPU上了,所以尝试配置Tensorflow.系统配置为:RTX4060+win11+Anaconda3,使用python3.10配置完成。【补充建议:使用虚拟环境进行版本管理,我用anaconda创建了一个名为tf2,python=3.10的虚拟环境】......
  • 模拟实现.net中的Task机制:探索异步编程的奥秘
    .net中使用Task可以方便地编写异步程序,为了更好地理解Task及其调度机制,接下来模拟Task的实现,目的是搞清楚:Task是什么Task是如何被调度的基本的Task模拟实现从最基本的Task用法开始Task.Run(Actionaction)这个命令的作用是将action作为一项任务提交给调度器,调度器会安排......
  • 系统编程:控制文件I/O的内核缓冲之sync(),fsync()和fdatasync()
        通过系统编程:从write()和fwrite()谈开来我们知道了系统调用和glibc库函数为了提升性能而设立的缓冲区,那么,什么情况下数据会从上一次缓冲区刷新到下一层存储介质(可能是缓冲区,也可能是永久存储介质)呢?fflush()库函数提供了强制将stdio库函数缓冲区数据刷新到内核缓冲......
  • Json数据文件处理中遇到的一些问题总结(C++)
    一、海量数据处理的方法总结参考CSDN技术贴:海量数据处理方法C++面试必备-海量数据处理二、快速Json文件解析的库字节-json快速解析库三、无锁队列C++无锁队列四、C++打包静态库静态库和动态库Linux-(C/C++)生成并使用静态库/动态库c/c++依赖静态库、动态库符号问题在远......
  • C++类&对象
    C++类&对象C++在C语言的基础上增加了面向对象编程,C++支持面向对象程序设计。类是C++的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。C++类定义定义一个类,......