Prhub

#24130 fix(sgl-kernel): sm90 compile flashmla failed

原始 PR 作者 imp2002 合并时间 2026-05-15 16:42 文件变更 2 提交数 2 评论 2 代码增减 +28 / -16

执行摘要

修复 FlashMLA 在 Hopper GPU 上编译失败的架构条件问题

关闭 issue #24126:在 H20 GPU 上使用 CUDA 12.8 编译 sgl-kernel 时,FlashMLA 因 Blackwell SM100 源码文件被无条件编译而失败,而 SM100 gencode 仅在 CUDA_VERSION > 12.8 时添加,导致工具链不兼容。

值得精读,特别是对 sgl-kernel 的 CMake 架构和多架构条件编译感兴趣的开发者。该 PR 展示了一个清晰的 CMake + C++ 条件编译的协作模式,可作为类似问题的参考。

讨论亮点

Review 评论中,gemini-code-assist[bot] 指出仅排除 SM100 源文件会导致链接错误,因为 flashmla_extension.cc 仍然引用了 FMHACutlassSM100FwdRun 符号。建议在 CMake 中添加编译定义并更新 C++ 源码以条件注册。该建议被采纳,最终提交中已在 C++ 文件中加入 #ifdef FLASHMLA_ENABLE_SM100

实现拆解

  1. CMake 变量引入:在 sgl-kernel/cmake/flashmla.cmake 中新增 set(FLASHMLA_ENABLE_SM100 OFF) 作为默认值。
  2. 条件启用:在 CUDA 版本大于 12.8 时,将 FLASHMLA_ENABLE_SM100 设置为 ON,并添加 SM100 gencode 标志。
  3. 源文件条件编译:将所有 SM100 相关的源文件(如 csrc/sm100/prefill/dense/fmha_cutlass_fwd_sm100.cu 等)包裹在 if(FLASHMLA_ENABLE_SM100) 块中,仅当开关开启时添加到编译列表。
  4. C++ 注册适配:在 sgl-kernel/csrc/flashmla_extension.cc 中,为依赖 SM100 内核符号的 dense_prefill_fwd 注册添加 #ifdef FLASHMLA_ENABLE_SM100 预处理指令,避免链接错误。
文件 模块 状态 重要度
sgl-kernel/cmake/flashmla.cmake 构建系统 modified 4.8
sgl-kernel/csrc/flashmla_extension.cc 内核注册 modified 4.72

关键源码片段

sgl-kernel/cmake/flashmla.cmake core-logic

核心构建配置变更,引入 FLASHMLA_ENABLE_SM100 开关并条件化 SM100 源文件编译。

# 在 sgl-kernel/cmake/flashmla.cmake 中
# 默认关闭 SM100 编译,避免在 Hopper GPU 上编译 Blackwell 源码
set(FLASHMLA_ENABLE_SM100 OFF)if(${CUDA_VERSION} VERSION_GREATER 12.8)
  list(APPEND FLASHMLA_CUDA_FLAGS "-gencode=arch=compute_100a,code=sm_100a")
  set(FLASHMLA_ENABLE_SM100 ON)
endif()# ... 其他源文件 ...# 仅当 SM100 启用时添加相关源文件
if(FLASHMLA_ENABLE_SM100)
  list(APPEND FlashMLA_SOURCES
    ${repo-flashmla_SOURCE_DIR}/csrc/sm100/prefill/dense/fmha_cutlass_fwd_sm100.cu
    ${repo-flashmla_SOURCE_DIR}/csrc/sm100/prefill/dense/fmha_cutlass_bwd_sm100.cu
    # ... 其他 SM100 源文件 ...
  )
endif()
sgl-kernel/csrc/flashmla_extension.cc core-logic

C++ 注册代码需条件编译以避免链接未定义符号。

// sgl-kernel/csrc/flashmla_extension.cc 中的 TORCH_LIBRARY_FRAGMENT 片段
// 仅在 SM100 启用时注册 sm100 内核,避免链接错误
#ifdef FLASHMLA_ENABLE_SM100
  m.def(
      "dense_prefill_fwd(Tensor workspace_buffer, Tensor q, Tensor k, Tensor v, Tensor cumulative_seqlen_q, Tensor "
      "cumulative_seqlen_kv, Tensor o, Tensor lse, int mask_mode_code, float softmax_scale, int max_seqlen_q, int "
      "max_seqlen_kv, bool is_varlen) -> ()");
  m.impl("dense_prefill_fwd", torch::kCUDA, &FMHACutlassSM100FwdRun);
#endif

评论区精华

链接错误风险:仅排除源文件不够,C++ 注册也需条件化 正确性

gemini-code-assist[bot] 指出:排除 SM100 源文件后,flashmla_extension.cc 仍引用 FMHACutlassSM100FwdRun,会导致链接错误。建议增加编译定义并包裹注册代码。

结论:采纳建议:在 flashmla_extension.cc 中添加 #ifdef FLASHMLA_ENABLE_SM100 保护 dense_prefill_fwd 注册。 · 已解决

风险与影响

低风险。变更仅影响构建时的架构选择逻辑,不涉及运行时内核或数学运算。主要风险是若 CMake 变量 FLASHMLA_ENABLE_SM100 在其他 CMakeLists 中被意外覆盖可能导致不一致,但当前仅在 flashmla.cmake 内部使用。无回归风险。

影响范围限于使用 Hopper GPU(如 H20)且 CUDA 版本为 12.8 的用户,修复后能够成功编译 sgl-kernel。对 Blackwell 用户无影响。无功能或性能影响。

构建系统变更

关联 Issue

#24126 [Bug] sgl-kernel fails to compile FlashAttention on CUDA 12.8 with H20

完整报告

参与讨论