CUDA简要理解

深入理解请参考: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:

http://cist.buct.edu.cn/staff/zheng/gpgpu/

http://blog.csdn.net/zkl99999/article/details/50708184

原文地址:https://www.cnblogs.com/AngelaSunny/p/7845587.html