执行摘要
本PR将MoE等相关kernel中用于网格同步的PTX内联汇编替换为CUDA运行时函数,并基于token数引入PDL启用启发式(阈值16)。改动影响7个.cu文件,代码量变动小,主要提升可读性和跨架构兼容性。
功能与动机
原始代码在NVIDIA SM90+(如H100)上使用内联PTX汇编griddepcontrol.wait和griddepcontrol.launch_dependents管理kernel间的依赖。PTX汇编晦涩难懂,且可能与未来架构不兼容。使用CUDA官方提供的cudaGridDependencySynchronize和cudaTriggerProgrammaticLaunchCompletion函数替换后,代码更简洁、可维护,且仍能发挥PDL的性能优势。
实现拆解
- 阈值定义:在
grouped_topk_kernels.cu中新增PDLEnableTokens = 16,用于判断是否对小batch启用PDL。
- PTX替换:在全部7个.cu文件中,将所有
griddepcontrol.wait替换为cudaGridDependencySynchronize(),griddepcontrol.launch_dependents替换为cudaTriggerProgrammaticLaunchCompletion()。
- 调用者适配:在
invokeNoAuxTc和grouped_topk函数中,根据阈值计算pdl_flag,并设置launch attribute为cudaLaunchAttributeProgrammaticDependencySynchronize。
- 签名调整:将
enable_pdl参数改为const bool,增强安全性。
其他文件仅做PTX替换,PDL启用由调用方通过attribute控制。
csrc/libtorch_stable/moe/grouped_topk_kernels.cu
核心文件,新增PDL阈值常量,并修改了grouped_topk_fused_kernel内核中的PTX替换,同时在invokeNoAuxTc和grouped_topk中添加了PDL启用逻辑。
// 经验值:小 batch 时启用 PDL
static constexpr int PDLEnableTokens = 16;
// 在 grouped_topk_fused_kernel 内核开始处
#if (defined(__CUDA_ARCH__) && (__CUDA_ARCH__ >= 900))
cudaGridDependencySynchronize(); // 替代 PTX: griddepcontrol.wait
#endif
// ... 核心 top-k 选择逻辑 ...
// 内核结束处
#if (defined(__CUDA_ARCH__) && (__CUDA_ARCH__ >= 900))
cudaTriggerProgrammaticLaunchCompletion(); // 替代 PTX: griddepcontrol.launch_dependents
#endif
// 在 grouped_topk 函数中,根据 token 数决定是否启用 PDL
const bool pdl_flag = num_tokens <= vllm::moe::PDLEnableTokens;
// 设置 launch attribute
cudaLaunchConfig_t config;
config.stream = stream;
cudaLaunchAttribute attrs[1];
if (pdl_flag) {
attrs[0].id = cudaLaunchAttributeProgrammaticDependencySynchronize;
attrs[0].val.programmaticDependencySynchronize = 1;
config.attrs = attrs;
config.numAttrs = 1;
} else {
config.attrs = nullptr;
config.numAttrs = 0;
}
评论区精华
审核人mgoin表示:“简单的性能和验证测试会不错,但这样已经很合理了。”没有其他实质性讨论。
风险与影响
- 兼容性风险:
cudaGridDependencySynchronize和cudaTriggerProgrammaticLaunchCompletion仅在CUDA 11.0+且SM>=90时可用。条件编译确保旧路径不变。
- 性能不确定性:
PDLEnableTokens=16为经验值,可能不是所有场景最优。建议在H100上进行详细bench。
- 影响范围:仅影响启用PDL的kernel(MoE路由、Minimax reduce),用户无感知。
关联脉络
本PR是kernel清理系列的一部分,与近期MoE路由优化(如#45723)和MXFP8内核优化(#47229)无直接关联,但降低了将来修改这些kernel的门槛。
参与讨论