深入理解请参考:CUDA by Example: An Introduction to General-Purpose GPU Programming
1.CUDA是什么?
CUDA,Compute Unified Device Architecture的简称,由NVIDIA公司创立的基于他们公司生产的图形处理器GPUs(Graphics Processing Units,可以通俗的理解为显卡)的一个并行计算平台和编程模型。
通过CUDA,GPUs可以很方便地被用来进行通用计算(有点像在CPU中进行的数值计算。。)。在没有CUDA前,GPUs一般只用来进行图形渲染(如通过OpenGL,DirectX等接口)。开发人员可以通过调用CUDA的API,来进行并行编程,达到高性能计算目的。
NVIDIA公司为了吸引更多的开发人员,对CUDA进行了编程语言扩展,如CUDA C/C++,CUDA Fortran语言。注意CUDA C/C++可以看作一个新的编程语言,因为NVIDIA配置了相应的编译器nvcc,CUDA Fortran一样。更多信息可以参考文献。
2.CUDA C的理解
简单的认为C语言工作的对象是CPU和内存条(下文称为主机内存),那么CUDA C工作的的对象就是GPU及GPU上的内存(下文称为设备内存),且充分利用了GPU多核的优势及降低了并行编程的难度。
过程:一般通过C语言把数据从外界读入,再分配数据,给CUDA C,以便在GPU上计算,然后再把计算结果返回给C语言,以便进一步工作,如进一步处理及显示,或重复此过程。
3. 深入概念理解
主机:将CPU及系统的内存(内存条)称为主机。
设备:将GPU及GPU本身的显示内存称为设备。
线程(Thread):一般通过GPU的一个核进行处理。(可以表示成一维,二维,三维)。
线程块(Block):
1. 由多个线程组成(可以表示成一维,二维,三维。。)。
2. 各block是并行执行的,block间无法通信,也没有执行顺序。
3. 注意线程块的数量限制为不超过65535(硬件限制)。
线程格(Grid):
每个线程格Grid由若干个线程块(block)组成(可以表示成一维,二维,三维等),而每个线程块block又由若干个线程(thread)组成。
线程束:
在CUDA架构中,线程束是指一个包含32个线程的集合,这个线程集合被“编织在一起”并且“步调一致”的形式执行。在程序中的每一行,线程束中的每个线程都将在不同数据上执行相同的命令。
核函数(Kernel):
1. 在GPU上执行的函数通常称为核函数。
2. 一般通过标识符__global__修饰,调用通过<<<参数1,参数2>>>,用于说明内核函数中的线程数量,以及线程是如何组织的。
3. 以线程格(Grid)的形式组织.
4. 是以block为单位执行的。
5. 能在主机端代码中调用。
6. 调用时必须声明内核函数的执行参数。
7. 编程时,必须先为kernel函数中用到的数组或变量分配好足够的空间,再调用kernel函数,否则在GPU计算时会发生错误,例如越界或报错,甚至导致蓝屏和死机。
更多的gpu编程详见下方keyword:
dim3结构类型定义;函数修饰符(__global__/__device__);常用的GPU内存函数 cudaMemcpy()/cudaMalloc()/cudaFree();cuda内存分类(全局内存、共享内存、常量内存、纹理内存、固定内存);
常用线程操作函数__syncthreads();时间测量性能的用途和形式;CUDA流是如何实现并发?
Refer:
最新评论