CUDA的硬件架构
CUDA core:最基本的处理单元,在AMD被称为streaming processor。最后具体的指令和任务都是在CUDA core上处理的。GPU进行并行计算,也就是很多个CUDA core同时做处理。
SM:多个CUDA core加上其他的一些资源组成一个streaming multiprocessor。也叫GPU大核,其他资源如:warp scheduler,register,shared memory等。register和shared memory是SM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的threads。因此,这些有限的资源就使每个SM中active warps有非常严格的限制,也就限制了并行能力
可以使用cudaGetDeviceProperties查看SM和CUDA core的个数
我的显卡是GTX950m,有5个Mutiprocessors(SM,也称GPU大核),每个SM有128个CUDA core(SP),总计5*128=640个CUDA core。
CUDA编程模型
CUDA的编程模型包括以下几个概念:
thread:一个CUDA的并行程序会被以许多个threads来执行。
block:多个threads组成一个block,同一个block中的threads可以同步,也可以通过shared memory通信。
grid:多个blocks构成grid。
warp:每32个线程组成一个warp,warp是GPU执行程序时的调度单位,同在一个warp的线程,以不同数据资源执行相同的指令,这就是所谓 SIMT。
每个块的线程数是有限制的,因为一个块的所有线程都驻留在同一个处理器核心上,并且必须共享该核心的有限内存资源。
我的显卡允许每个线程块中最多1024个线程,每个SM中最多2048个线程。
There is a limit to the number of threads per block, since all threads
of a block are expected to reside on the same processor core and must
share the limited memory resources of that core. On current GPUs, a
thread block may contain up to 1024 threads.
联系起来看
GPU中每个SM都设计成支持数以百计的线程并行执行,并且每个GPU都包含了多个SM,所以GPU支持成百上千的线程并行执行。
当一个kernel启动后,thread会被分配到这些SM中执行。大量的thread可能会被分配到不同的SM,同一个block中的threads必然在同一个SM中并行(SIMT)执行。每个thread拥有它自己的程序计数器和状态寄存器,并且用该线程自己的数据执行指令,这就是所谓的Single Instruction Multiple Thread。
一个CUDA core可以执行一个thread,但是实际上并不是所有的thread能够在同一时刻执行。Nvidia把32个threads组成一个warp,warp是调度和运行的基本单元。warp中所有threads并行的执行相同的指令。一个warp需要占用一个SM运行,多个warps需要轮流进入SM。由SM的硬件warp scheduler负责调度。因此,一个GPU上resident thread最多只有 SM*warp个。