CUDA入门
一、CUDA来源
2006年,NVIDIA公司发布了CUDA,CUDA是建立在NVIDIA的CPUs上的一个通用并行计算平台和编程模型,基于CUDA编程可以利用GPUs的并行计算引擎来更加高效的解决比较复杂的计算难题。当前,GPU最成功的一个应用就是深度学习领域,基于GPU 的并行计算已经成为训练深度学习模型的标配。
GPU并不是一个独立运行的计算平台,而是需要和CPU协同工作,可以看成是CPU的协处理器,因此在说GPU并行计算时,实际上指的是基于CPU+GPU的异构计算架构。在异构计算架构中,GPU与CPU通过PCle总线连接在一起来协同工作,CPU所在位置为主机端(host),GPU所在的位置为设备端(device),具体如下图:
从图中可以看出,GPU包含更多的运算核心,特别适合数据并行的计算密集型任务,例如大型矩阵运算,而CPU的运算核心较少,但是可以实现复杂的逻辑运算,因此适合控制密集型任务。CPU上的线程是重量级的,上下文切换开销大,但GPU存在很多核心,线程是轻量级的,因此CPU+GPU的异构计算平台可以优势互补,CPU负责处理逻辑复杂的串行程序,而GPU重点处理数据密集型的并行计算程序,从而发挥最大的功效。
基于GPU编程可以构建基于GPU计算的应用程序。CUDA提供了对其它编程语言的支持,如C/C++,Python,Fortran语言。
二、CUDA编程--硬件基础
1.硬件上 SP (streamingProcess)、SM(streming multiprocesor)
SP:最基本的处理单元,即: CUDA core,CUDA core是NVIDIA在推出全新的Fermi架构后才出现的名词。CUDA core 为以前所说的 流处理器。但是有所区别,具体的指令和任务都是在SP上处理的。GPU进行并行计算,也就是多个SP同时做处理。
SM:多个SP加上其他的一些资源组成一个SM,即:GPU大核,其他的的资源:warpscheduler,register,sharedmemory等。SM可以看做是GPU的心脏(对比CPU核心),register和sharedmemory是SM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的threads,因此,这些有限的资源就使每个SM中的active warps有非常严格的限制。同时也限制并行能力。
注:每个SM包含的SP数根据GPU架构而不同,Ferm架构GF100是32,GF10X是48个,Kepler架构是192个,Maxwell都是128个。相同架构的GPU包含的SM数量则根据GPU的中高低端来定。
2. 软件上:thread、block、grid、warp
thread: 一个CDUDA的并行程序会被许多个threads来执行。
block: 数个threads会被群组成一个block,同一个block中的threads可以同步,也可以通过sharedmemory进行通信。
grid: 多个blocks构成grid.
warp:GPU执行程序时的调度单位,,目前CUDA的warp的大小为32,同在一个warp的线程,以不同数据资源执行相同的指令,这就是所谓的SIMT-Single InstructionMultiple Thread.
3. 硬件映射
NVIDIA把32个threads组成一个warp,warp是调度和运行的基本单元。warp中所有threads并行的执行相同的指令,warp具有挂起、就绪、执行状态,由SM的硬件warpscheduler负责调度,达到隐藏延迟的作用,容忍长延迟操作,例如:浮点算术以及分支指令,大量的warp使得硬件可以在任意时间点找到一个可调度的warp.
由于每个SM上的硬件资源是有限的,所以每个SM上同时可以驻扎的block数量和thread数量是有限的,相关限制可以在相关的手册中查询。例如:GT200和G80的每个SM包含8个流处理器,有30个SM对于GT200,SM最多驻扎8个block,每个SM最多驻扎1024个thread,GT200至多驻留30720线程。
好的执行配置:每个SM中的线程数达到容量最大值且对于长延迟操作可调度最大数量的warps.
一个SP可以执行一个thread,在GPU中可以同时(同一时钟周期内)执行的thread数量为总的sp数量,也就是总的CUDA核数量分。
Tesla的SM: