硬件资源
在硬件上,GPU的资源有SP和SM。
- SP:最基本的处理单元,streaming processor,也称为CUDA core。最后具体的指令和任务都是在SP上处理的。GPU进行并行计算,也就是很多个SP同时做处理。我们所说的几百核心的GPU值指的都是SP的数量;
- SM:多个SP加上其他的一些资源组成一个streaming multiprocessor。也叫GPU大核,其他资源如:warp scheduler,register,shared memory等。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个,Turing架构是64个。相同架构的GPU包含的SM数量则根据GPU的中高低端来定。下图是Turing架构的SM。
软件资源
从软件上看,即GPU的线程模型,可以分为Grid、Block、Thread和Warp,其中前三个用下面的图表示非常的直观。
- Thread:一个CUDA的并行程序会被以许多个threads来执行
- Block:数个threads会被群组成一个block,同一个block中的threads可以同步,也可以通过shared memory通信
- Grid:多个blocks则会再构成Grid
- Warp:GPU执行程序时的调度单位,同一个warp里的线程执行相同的指令,即SIMT。
举一个比较形象的例子,把GPU当做一个学校,学校里面有不同的年纪(Grid),每个年纪有几个班(Block),每个班都有很多的学生(Thread),平时干值日要分不同的组(Warp),目前又给Warp中,有32个线程,即一个班中32个同学为一组一起干值日。
存储资源
每一个Thread都有自己的local memory
和resigters
,即每个同学都可以把自己的东西放到自己的课桌上;每一个Block有shared memory
,这个Block中的所有Thread都可以访问,即每个班所在的教室里的走道、讲台等,是这个班里同学们的公共区域;Grid之间会有Global memory
和Cache
,所有的Grid都可以访问,即学校里的操场、餐厅等,是全校同学的公共区域。
GPU模型总结
我们把GPU跟一个学校对应起来,学校里有教学楼、操场、食堂,还有老师和学生们;很快有领导来检查,因此这个学校的学生们要完成打扫除的工作。
软件资源包括Thread、Warp、Block和Grid,硬件资源包括SP和SM。
软件资源和硬件资源的最小单位我们都认为是学生,即一个Thread对应一个SP(SP可以分为更小的ALU等,我们这里先不考虑)。
Block对应的是班级,Warp是班级里的不同小组,每个小组有32个学生;SM是教学楼的一个楼层,一个楼层上可以有多个班级;一个Grid是一个年级,年级和楼层并没有确定的对应关系。
每个学生都有个课桌 ,放自己的物品,不能让别人用,表示每个Thread都有自己的空间(local memory + registers);
每个班级在一个教室里,教室里的有公共的空间(走道、讲台等),所有同学都可以停留,表示一个Block中有shared memory,这个Block中的Thread都可以访问;
学校里的公共区域,比如操场、食堂等,所有同学都可以去运动、吃饭,表示GPU中有一些公共的存储空间供所有的Grid访问。
虽然GPU是并行运行,但也并不是我们理想中所有的Thread一起工作,在打扫卫生时,并不是所有学生一起干活,一个楼层同一时刻只能有一组32个学生(即一个Warp)干活,其他的学生都处于等待状态。