CUDA线程模型
线程模型(软件角度)
kernel在device上执行时实际上是启动很多线程,一个kernel所启动的所有线程称为一个网格(grid
),同一个网格上的线程共享相同的全局内存空间,grid
是线程结构的第一层次,而grid又可以分为很多线程块(block
),一个线程块里面包含很多线程,这是第二层次。
-
Thread
:线程,并行的基本单位;
-
Thread Block
:线程块,互相合作的线程组,线程块有如下几个特点:- 允许彼此同步;
- 可以通过共享内存快速交换数据;
- 可以以1维、2维或3维组织(一般为3维);
- 每一个
block
和每个thread
都有自己的ID(blockIdx
和threadIdx
),我们通过相应的索引找到相应的线程块和线程。
-
Grid
:一组线程块- 可以以1维、2维或3维组织(一般为2维);
- 共享全局内存;
grid
和block
都是定义为dim3
类型的变量,dim3
可以看成是包含三个无符号整数(x, y, z)
成员的结构体变量,在定义时,缺省值初始化为1;dim3
仅为host端可见,其对应的device端类型为uint3
。
-
Warp
:GPU执行程序时调度和运行的单位(是SM
的基本执行单元),目前cuda的warp的大小为32;同在一个warp的线程,以不同数据资源执行相同的指令,这就是所谓SIMT
(Single Instruction Multiple Threads
,单指令多线程)。
-
Kernel
:在GPU上执行的核心程序,这个kernel函数是运行在某个Grid上的。One kernel <==> One Grid
流处理器(硬件角度)
-
SP(streaming processor)
:也称CUDA core
。最基本的处理单元,具体的指令和任务都是在SP上处理的。一个SP可以执行一个thread;
-
SM(streaming multiprocessor)
:也叫GPU大核,由多个SP加上其他资源(如:warp scheduler
,register
,shared memory
等)组成。block在SM上执行。- SM可以看做GPU的心脏(对比CPU核心),
register
和shared memory
是SM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的threads。因此,这些有限的资源就使每个SM中active warps
有非常严格的限制,也就限制了并行能力; - 每个SM包含的SP数量依据GPU架构而不同,Fermi架构GF100是32个,GF10X是48个,Kepler架构都是192个,Maxwell架构都是128个;
- SM上并不是所有的thread能够在同一时刻执行。Nvidia把32个threads组成一个warp,warp是调度和运行的基本单元。warp中所有threads并行的执行相同的指令。一个warp需要占用一个SM运行,多个warps需要轮流进入SM。由SM的硬件warp scheduler负责调度。目前每个warp包含32个threads(Nvidia保留修改数量的权利)。所以,一个GPU上resident thread最多只有
SM * warp
个。 - block一旦被分配好SM,该block就会一直驻留在该SM中,直到执行结束。一个SM可以同时拥有多个blocks,但需要序列执行。
- SM可以看做GPU的心脏(对比CPU核心),
对应关系&硬件结构
本文含有隐藏内容,请 开通VIP 后查看