参考: CUDA 编程入门(2):CUDA 编程模型 - 知乎 (zhihu.com)
CUDA 调度模型
Block 调度
Block 对应的物理硬件概念是 SM,也就是说 SM 负责 block 中线程的执行,SM 会为每个 block 分配需求的资源,比如寄存器,共享内存等,由于 SM 自身资源有限,因此它被分配到的 block 数量也是有限的,这取决于 block 中线程的资源需求。当所有的 SM 都饱和之后,剩下的 blocks 将会被暂时挂起,直到有 block 完成执行任务。
Warp 调度
每个 SM 中有 4 个处理块,每个处理块都有一个独立的 Warp Scheduler,Warp Scheduler 负责调度分配到当前处理块上的 warp,所有这些 warp 构成一个叫做 Active Warps 的集合,调度器在每个时钟周期都会检查这些 warp 是否准备好执行指令,已经准备好的 warp 又构成一个叫做 Eligible Warps 的集合,然后调度器会从这些 warp 里面选择一个 warp 出来发送指令,这个 warp 又被称为 Issued Warp。
Thread 调度
同一个 block 上的所有 thread 会被分配到同一个 SM 上执行,每个 block 都有一个共享内存区域,可以被其中的所有线程访问。block 中的线程通过 __syncthreads()
来同步,从而可以协作完成任务。
同一个 warp 上的 32 个线程通过 SIMT 方式执行任务,也就是说,一条指令会被同时发送到 warp 中的所有 thread 执行,因此这些 thread 之间是必然同步的。当因为存在条件判断导致同 warp 内的 thread 执行的指令不一样时,warp 调度器会分成两个 pass 来执行指令,第一个 pass 执行 if 条件语句,不满足 if 条件的 thread 将不起作用。
参考
- Wen-mei W. Hwu, David B. Kirk, Izzat El Hajj. Programming massively parallel processors: a hands-on approach[M]. Morgan kaufmann, 2022