1. 设备的计算能力:设备计算能力的版本描述了一种GPU对CUDA功能的支持程度,版本号用两位小数表示,如1.3硬件,小数点的前一位表示设备的核心架构,小数点后一位表示更加细微的进步。
2. CUDA的安装和编译:需要下载相应显卡版本的驱动、CUDA工具包和CUDA SDK包。
3. CUDA的编程模型:CUDA模型将CPU作为主机(Host),GPU作为设备(Device),cpu和gpu协同进行异构运算,cpu负责逻辑性强的事务处理和串行运算,而GPU负责执行高度线程化的并行处理任务。运行在GPU上的CUDA并行计算函数称为kernel(内核函数),该kernel函数存在两个层次的并行,Grid中的block间的并行和block中的thread间并行。kernel函数通过 __global__标识符定义,如__global__ void myKernel(float *A){},在调用的使用则使用myKernel<<<1,N>>>(A)形式对myKernel内核函数进行调用,其中<<<>>>运算符中是内核函数的执行参数,用于说明执行内核函数的线程数量以及线程是如何进行组织的,1表示grid中只有一个block,每个block中有N个thread。小括号中的史书则是函数的参数。
4. 线程的结构:CUDA有很强的扩展能力,一个程序编译一次后,可以在拥有不同核心数量的硬件上准确运行。为此,CUDA将计算任务映射为大量可以并行执行的线程,并有硬件动态调度和执行这些线程。kernel以线程网格(Grid)的形式组织,每个线程网格由若干个线程块(block)组成,每个线程块又有若干个线程(thread)组成。实际上,kernel是以block为单位执行的,grid只是为了表示可以被并行执行的的block集合。值得注意的是,各block是并行执行的,但是block之间是无法通信的,也没有执行顺序。
5. CUDA C语言:
函数类型限定符:__device__ , __host__, __golbal__
变量类型限定符:__device__, __shared__, __constant__
内建矢量类型: char4, unshort3, double2, dim3
四个内建变量:blockIdx, threadIdx, gridDim, blockDim
kernel执行运算符:<<<>>>,用于指定线程网格和线程块的维度
一些函数:memory fence函数,同步函数,数学函数,纹理函数,测时函数,原子函数,warp vote函数
6. dim3是基于uint3定义的矢量类型,相当于由三个unsigned int组成的结构体。CUDA的内建变量threadIdx和blockIdx均是dim3类型。
7. CUDA存储器模型
如图
图中所示,每一个线程拥有自己的私有存储器Registers和Local Memory; 每一个线程块拥有一块shared memory; grid中的所有线程可以访问Global Memory、Constant Memory和Texture Memory.
下表为每种存储器的详细说明:
存储器 | 位置 | 拥有缓存 | 访问权限 | 变量生存周期 | 特点 |
Register | GPU片内 | N/A | Device 可读/写 | 与thread相同 | 极低延迟 |
Local memory | 板载显存 | 无 | Device 可读/写 | 与thread相同 | 访问速度慢 |
Shared memory | GPU片内 | N/A | Device 可读/写 | 与thread相同 | 线程间通信最小延迟 |
Constant memory | 板载显存 | 有 | Device可读,host可读/写 | 可在程序中保持 | 存储需要频繁访问的参数 |
Texture memory | 板载显存 | 有 | Device可读,host可读/写 | 可在程序中保持 |
|
Global memory | 板载显存 | 无 | Device可读/写,host可读/写 | 可在程序中保持 | 高带宽,高延迟 |
Host memory | Host内存 | 无 | host可读/写 | 可在程序中保持 |
|
Pinned memory | Host内存 | 无 | host可读/写 | 可在程序中保持 | 可通过zero-copy功能映射到设备地址空间,从GPU直接访问 |