CUDA学习笔记——一些基本概念

来源:互联网 发布:卫生部数据标准 编辑:程序博客网 时间:2024/05/17 23:19

学习CUDA编程过程中的一些笔记,记录一些学习的情况吧。一般情况是记录学习过程中自己的理解,而不是准确的公认的定义或公式,即在“学习笔记”中,我只记录我理解并消化了的东西,那些我没有理解的想作为今后学习的内容大概会放在其他记录中。学习笔记中的内容有时候有可能不是那么准确,不过随着学习的深入我的理解应该会越来越深刻吧。提前在这里进行说明,之后就不在文中进行具体解释了。

这篇文章主要是一些CUDA的基本概念,牵扯到的具体内容不过多叙述。

【什么是CUDA】现在一说到GPU编程,许多人想到的就是CUDA,网上搜索也能搜到一大堆CUDA相关的信息。它是英伟达(NVIDIA)出品的一种GPU。GPU跟CPU相比有一个很明显的优势,那就是GPU并行运算能力超强,对于处理大量数据的运算有很大帮助。运算速度大概能比CPU快好几倍吧。而CUDA和其他GPU相比,有一个特点是CUDA支持C语言编程,这对接下来的学习很有帮助。不过由于GPU和CPU之间的信息传递需要时间,所以个人认为如果不是加速十分明显的情况在CPU上计算为好。

【HOST】主机。CPU端。

【DEVICE】设备。GPU端。

【Thread】线程。有个说法是一个core对应一个Thread。不过我的理解是,Thread是CUDA工作的一个最小单位。Thread有一维、二维、三维之说。

【Block】。一个Block由若干个Thread组成。Block有一维、二维、三维之说。

【Grid】。一个Grid由若干个Block组成。

【Warp】线程束。这是一个很形象的说法。加入把Thread比作条,那么Warp就是一把Thread一起。Warp中的Thread数是32(32个thread为一组),同一个warp中的thread会以不同的数据,执行同样的指令。

【SP】SP即(Streaming Processor),是最基本的处理单元。

【SM】SM是(Streaming Multiprocessor),由个SP附加一些其他单元组成的。

关于SP、SM、Thread、Block等的关系参考的博客CUDA 的Threading:Block 和Grid 的设定与Warp

【Kernel】核函数。Device上执行的函数。编程时,必须先为Kernel中的数组或变量分配好空间。HOST调用时,采用kernel_fun<<<Dg,Db,Ns,S>>>(param lists)这样的形式。其中,Dg是定义grid的维度和尺寸,Db是定义block的维度和尺寸,Ns是每个block除了静态分配的Shared Memory以外,最多动态分配Shared Memory的大小(单位byte),S是cudaStream_t类型,表示核函数处在哪个流中,param lists是参数列表。Dg和Db都是dim3类型。

【dim3】基于unit3定义的矢量类型。unit3有三个数据成员:unsigned int x,unsigned int y,unsigned int z

【内建变量】threadIdx:获取线程ID,如果是一维Threaad那么threadIdx.x,二维threadIdx.y,三维threadIdx.z。blockIdx,同样有blockIdx.x,blockIdx.y,blockIdx.z。blockDim,block的维度,即对应Thread的长度,有blockDim.x,blockDim.y,blockDim.z。gridDim,grid的维度,有gridDim.x,gridDim.y,gridDim.z。

【存储类型】寄存器:核函数内定义。__global__:全局内存,在主机函数中开辟和释放。__shared__:共享存储,每个block内共享这个存储。__constant__:常量存储,只读,定义在函数之外,作用域整个文件。__texture__:纹理存储,只读,内存不连续(暂时不是很了解)。

【函数修饰符】修饰函数的。__global__:kernel从HOST调用。__device__:kernel从Device调用(可以被__global__修饰的函数调用,也可以被__device__修饰的函数调用)。__host__:主机函数,供主机函数调用。

【内存函数】常用的有三个。cudaError_t cudaMalloc(void **devPtr, size_t size),在device上分配内存。cudaError_t cudaFree(void **devPtr),释放device的内存,与cudaMalloc对应。cudaError_t cudaMemcpy(void **dst, const void *src, size_t count, cudaMemcpyKind kind),拷贝存储数据,可以把Host的数据拷贝到Device上,也可以把Device上的数据拷贝到Host上。

【原子性】如果执行操作的步骤不能再分解为更小的步骤,那么这样的操作被称为原子操作。调用函数形如AtomicXXX()。

---------------

cuda的概念之类还有很多,目前我学习并有一定理解的大概就以上这些,先把它们记下来。

0 0
原创粉丝点击