CUDA软件抽象与硬件抽象
之前我们了解了许多概念,比如SM、计算网格、线程块等等,但这些包含对软件部分的抽象和对硬件部分的抽象,下面我们来分别对这些层次的抽象进行具体的描述。
硬件抽象
硬件抽象包括SM(流多处理器,大核心)、SP(流处理器,小核心)。SP是GPU最基本的处理单元,也称为CUDA core,每个SM中包含几十或者上百个CUDA核心。
其中,SP是执行每个线程的单元,一个SP对应一个线程。每个SP有自己的寄存器和局部内存,可以看作是微型CPU。
而SM则是多个SP聚合在一起,并且有负责管理线程调度的单元,和共享内存等。
可以用下面这个例子来进行类比:
将GPU比作教学楼,那么SM就是教学楼中的每一个楼层,有着一些共享设施(wrap调度器、共享内存等);而SP就是每一间教室里的学生,有着自己的课桌和其他资源(寄存器、局部内存、运算器等);而每间教室则可以看成是对SP进行的一个分组(线程束),活动(计算)都是以班级为单位整体进行的(即单指令多线程)。
软件抽象
软件抽象包括计算网格、线程块、线程束、线程。
计算网格是用于对计算任务的抽象,其大小限制为(
线程块也是用于对计算任务的抽象,线程块大小最大为1024。同一线程块的线程(线程束)将会被分配到同一个SM上。线程块是SM级别的基本调度单位。
线程束,线程束就是软件抽象与硬件抽象的桥梁,与硬件中的线程束相对应,线程束大小为32。每个线程束中的线程是通过单指令多线程来执行的,所以每个线程做的工作是一样的。线程束是ALU级别的基本调度单位。
线程,线程是执行具体计算的东西,但是线程不会被单个调度,都是以线程束为整体进行调度的。
可以用下面这个例子来进行类比:
将GPU所有的计算资源看作学校,那么计算网格就是学校里面的年级,有时候不同年级也会出现在同一层楼中(一个SM可以对应多个线程块,但这里稍微有些差异,因为一个线程块只能对应一个SM);线程块对应的是班级,一个班级的所有人肯定是在一层楼中的(对应线程块上所有线程束在同一个SM上),且班级一般都是一样大的(最大线程数相同);线程束是班级里面划分的小组,一般收作业都是每个小组一起交(线程束统一被调度,且任务相同);线程则对应个人。
执行计算过程
有了软件抽象和硬件抽象,下面我们就来考虑具体的任务是怎么被执行的。
虽然GPU是并行运行,但也并不是我们理想中所有的线程一起工作。下面我们还是以例子来进行说明。
当学校组织全校大扫除时(计算任务),首先会按照年级来为各年级(SM)下达指令(计算网格),然后每个年级再为每个班级(线程块)分配包干区(线程块分配),在打扫卫生时,并不是所有学生一起干活,学生经过老师(这里我们理解为线程束调度器)安排后,分为一组一组的小组(线程束),每一个小组都只会做一件一样的事情,如果有人先做完了或者不需要做,那么他也会在旁边等他的组员,处于等待状态,直到小组内所有组员工作完成;另外,由于工具是有限的(计算资源有限),所以可能会存在一部分小组暂时干不了活(没有足够资源调度),且某个小组干完活之后送还工具是需要时间的(调度耗时)。