细化分析还是蛮重要的,这样才能细化优化,从而达到更好的优化效果
文章目录
前言
SM内部对于BLOCK的分配有多方面维度
一、单个SM能支持的最大线程数
- 每个 SM 有一个最大线程数限制。例如,在 H100 这种基于 Hopper 架构 的 GPU 中,单个 SM 可以支持最多 2048 个线程。
- 每个 block 的线程数会占用 SM 中的线程资源。例如,如果你的 block 使用 256 个线程,则一个 SM 最多可以调度 2048 ÷ 256 = 8 个 block。
二、每个 SM 的共享内存
- 每个 SM 具有一定量的 共享内存(shared memory)。在 H100 中,每个 SM 具有 164 KB 的共享内存可供分配给 block 使用。
- 每个 block 使用的共享内存量会影响 SM 能调度多少个 block。如果某个 block 使用了 20 KB 的共享内存,理论上 SM 最多可以调度 164 KB ÷ 20 KB = 8 个 block。
如果某个 block 使用了更多的共享内存,那么 SM 能调度的 block 数量就会减少。
三、寄存器数
- 每个 SM 拥有一定数量的 寄存器,并且这些寄存器会在 block 间分配。H100 每个 SM 拥有 256 KB 的寄存器。
- 每个线程使用的寄存器数量会决定 block 占用的寄存器资源。例如,如果每个线程使用 64 个寄存器,且每个 block 有 256 个线程,则每个 block 占用的寄存器为 256 × 64 = 16 KB。
SM 会根据剩余的寄存器数量决定可以调度的 block 数量。
四、每个 SM 可以同时管理的最大 block 数
H100 每个 SM 可以同时管理的 block 数量上限为 32 个 block。这是一个固定的硬件限制。即使所有其他资源(如共享内存、线程和寄存器)都足够用,一个 SM 同时调度的 block 数最多也不能超过 32 个。
五、每个SM可以同时管理的最多warp数量
Warp 是实际执行的最小单元,每个 warp 包含 32 个线程。SM 通过调度 warp 来执行 block。
H100 的每个 SM 可以同时管理 64 个 warp。因此,block 中的线程数会影响 warp 的分配情况。假设一个 block 有 256 个线程,那么每个 block 使用的 warp 数为 256 ÷ 32 = 8 个 warp。如果 SM 的最大 warp 数为 64 个,那么 SM 最多可以管理64 ÷ 8 = 8 个 block。
六、调度和管理
应该区分一下调度和管理,
一个SM最多可以同时管理64个warp,可以同时调度4个warp。
七、warp管理
warp管理是一个广义的概念,它涵盖了如何创建、调度、执行和管理 Warps 的整个生命周期。
7.1. Warp 生成与分配
Warp 生成(Warp Creation):当一个线程块(Thread Block)被分配到一个 Streaming Multiprocessor (SM) 时,硬件会将线程块中的线程分成多个 Warp。每个 Warp 通常包含 32 个线程(在 NVIDIA 架构中)。这一步涉及将线程分组并创建相应的 Warp。
Warp 分配:一旦 Warp 被创建,它们会被分配到 Warp Pool 中等待执行,或者直接进入调度队列。这个过程涉及将 Warp 与 SM 上的资源(如寄存器、共享内存)进行绑定。
7.2. Warp Pool 和 Warp 调度
Warp Pool:Warp Pool 实际上是用于管理所有分配到 Streaming Multiprocessor (SM) 的 Warp,无论它们处于什么状态。它是一个动态的池子,负责管理这些 Warp 的状态和分配。这部分通常由硬件调度器来管理,确保 Warp Pool 中的 Warps 随时可以被调度。
Warp 调度(Warp Scheduling):每个 SM 内部有一个或多个 Warp 调度器,负责从 Warp Pool 中选择合适的 Warp 来执行。调度器依据 Warp 的状态(如是否等待数据或内存、是否有可执行指令等)来决定哪个 Warp 被优先执行。
7.3. Warp 上下文管理
寄存器上下文管理:每个 Warp 的线程都有各自的寄存器状态,Warp 管理需要维护这些寄存器的上下文(如程序计数器、寄存器值等),以便在 Warp 切换或等待时能够快速恢复。
上下文切换:当某个 Warp 需要等待(如等待内存访问完成)时,硬件可以进行上下文切换,将执行切换到另一个 Warp。这种切换在 GPU 中是非常快速的,因为 Warp 上下文(如寄存器、程序计数器)是硬件直接管理的。
7.4. Warp 执行与指令发射
指令发射(Instruction Issuance):一旦 Warp 被调度执行,硬件会从 Warp 中选择指令并将其发送到相应的执行单元(如整数单元、浮点单元等)。这是 Warp 管理的核心部分,确保 Warp 中的所有线程都执行相同的指令。
指令级并行(ILP, Instruction-Level Parallelism):在执行过程中,硬件可以动态分析 Warp 内的指令,尝试利用指令间的并行性(如并行执行不同的指令)。
7.5. Warp 的分支管理与收敛
分支发散管理(Branch Divergence Management):当 Warp 中的线程遇到条件分支时,可能会进入不同的控制流路径。Warp 管理中的分支发散单元负责跟踪每个线程的执行路径,并确保 Warp 中不同路径的线程都能正确执行。
分支收敛(Branch Convergence):当所有线程完成各自的分支执行后,Warp 管理需要将这些线程重新汇聚到同一条执行路径上,减少发散带来的执行单元浪费。
7.6. Warp 结束与资源回收
Warp 结束:当一个 Warp 中的所有线程都完成了它们的计算,Warp 管理器会将该 Warp 标记为完成,并释放它所占用的硬件资源(如寄存器、共享内存等)。
资源回收(Resource Reclamation):释放的资源会被重新分配给新的 Warp 或者用于已经等待的 Warp。硬件会自动管理这些资源的回收与再利用,确保 SM 资源得到最大化利用。
总结
单从warp层面来看,warp其实是体现了SIMT,单指令,多个线程来执行;
往warp里面看,不同的线程执行各自不同的数据,但都在一个warp里面,所以执行的是一条命令,所以,这里是体现了SIMD。