叹滚滚长河东逝水
前言
从将抽象概念线程层次结构装载到具象的硬件层次结构的角度来思考和记忆
一、Warp 内部的并行性
-
并行级别:最高
-
并行策略:
Warp 是 CUDA 中最小的执行单元,通常由 32 个线程 组成。在硬件层面,warp 内的 32 个线程以 SIMD(Single Instruction, Multiple Data) 方式同步执行,也就是说,同一个 warp 中的所有线程在同一时钟周期内执行同一条指令。
并行性:在没有其他限制的情况下,warp 内的所有线程是同时并行执行的。这意味着,warp 内的并行性是最高的,理论上没有额外的延迟或调度开销。 -
优化点:
内存访问一致性:确保 warp 内所有线程的内存访问模式一致。例如,避免 bank 冲突、减少内存访问的分支发散(不同线程访问不同的数据路径)。
减少分支发散:当 warp 内线程执行不同的分支指令时,GPU 需要逐个执行这些分支指令,导致并行性下降。通过设计避免 warp 内部分支发散,可以提升 warp 内部的并行性。
二、Warp 之间的并行性
-
并行级别:次高
-
并行策略:
Warp 调度器:每个 SM(Streaming Multiprocessor) 可以同时调度多个 warp。在 H100 这样的现代架构中,每个 SM 配备 4 个 warp 调度器,可以在同一时钟周期内调度 4 个 warp。
并行性:不同的 warp 是独立的,它们的执行没有直接依赖关系。SM 会根据每个 warp 的状态(如是否等待内存、是否有空闲资源)来选择 warp 执行,这种调度使得 warp 之间的并行性较高。 -
限制因素:
资源竞争:不同 warp 之间可能会争抢共享的硬件资源(如共享内存、寄存器、执行单元)。如果多个 warp 访问相同的 bank 或占用过多共享内存,会导致一些 warp 的执行被延迟,从而降低并行性。
内存访问的串行化:即使在同一个时钟周期调度了多个 warp,如果这些 warp 访问了同一个共享内存 bank,访问可能会被串行化,导致部分 warp 需要等待。 -
优化点:
避免资源争用:合理规划和优化内存访问,避免不同 warp 同时访问同一共享内存 bank,减少冲突和等待。
提高 warp 利用率:通过优化核函数中的指令分配,确保 warp 的高效利用,避免 warp 被阻塞或等待资源。
三、SM 内部的并行性
-
并行级别:较高
-
并行策略:
SM 内部资源共享:一个 SM 是一个高度并行的计算单元,配备多种硬件资源,如共享内存、寄存器、执行单元(如 CUDA 核心、Tensor 核心等)。多个 warp 可以共享这些硬件资源,并行执行不同的任务。
调度与执行:在每个时钟周期内,SM 的 warp 调度器会选择可执行的 warp,分配给 SM 的执行单元。这种多 warp 并行执行的机制使得 SM 内部并行性较高。 -
限制因素:
资源限制:每个 SM 资源有限(如寄存器、共享内存),过多的 block 和 warp 会导致资源竞争,限制并行执行的数量。
执行单元的争用:不同的 warp 可能需要同时访问相同的执行单元或内存,这会导致资源争用和执行延迟,降低 SM 内部的并行性。 -
优化点:
合理使用共享内存和寄存器:控制每个 block 和 warp 对共享内存和寄存器的使用量,避免资源过度占用,从而提高 SM 内部的并行性。
平衡指令类型的执行:通过指令调度平衡,确保不同类型的指令(如整数运算、浮点运算)能够在 SM 内部的不同执行单元上并行执行,减少资源争用。
四、SM 之间的并行性
-
并行级别:较高
-
并行策略:
SM 之间的独立性:在 GPU 内,每个 SM 是独立的执行单元。多个 SM 可以同时并行执行不同的 block,每个 SM 执行的 block 之间没有直接的依赖关系,因此 SM 之间的并行性非常高。
GPU 全局调度:GPU 调度器负责将全局任务(block 和 grid)分配给不同的 SM,确保 GPU 内的所有 SM 能够并行执行各自的任务。 -
限制因素:
全局资源竞争:不同的 SM 之间可能会争夺全局资源(如 global memory 带宽)。如果所有 SM 同时进行大量内存访问,会导致带宽瓶颈,进而影响 SM 之间的并行性。
负载不均衡:如果某些 SM 负载较轻,而其他 SM 负载较重,可能导致整体并行性下降。因此,保持任务的均衡分配是提升 SM 之间并行性的关键。 -
优化点:
平衡 block 分配:确保 block 被均匀分配到多个 SM 上,避免某些 SM 负载过重,而其他 SM 处于空闲状态。
优化内存访问:通过优化全局内存的访问模式,减少全局带宽争用,提升 SM 之间的并行效率。
总结
warp之外,warp之间,block之间,可能还有许多优化空间,warp之内没什么优化空间了