CUDA基础

来源:互联网 发布:underscore.js源码分析 编辑:程序博客网 时间:2024/05/18 12:35

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直接访问