Prhub

#31754 Fix unnecessary gather/scatter on CPU for non-contiguous Mamba statepool

原始 PR 作者 yanbing-j 合并时间 2026-07-23 09:08 文件变更 1 提交数 1 评论 1 代码增减 +7 / -2

执行摘要

CPU 上跳过 Mamba 状态池冗余 gather/scatter

PR body 说明,在 CPU 上使用 AMX 时,Mamba 状态池可能非连续,导致 needs_state_gather 为真,触发 gather 和 scatter 操作,增加每次 prefill step 的开销。而 CPU 内核(causal_conv1d_fwd_cpu, chunk_gated_delta_rule_cpu)使用标准索引 C++ 操作,能正确处理非连续内存布局,无需该保护。

值得合并,逻辑清晰且风险低。建议后续补充针对 CPU 上非连续 Mamba 状态池的测试用例,以保障回归检测。

讨论亮点

无讨论。PR 获得唯一审核人 mingfeima 直接批准,未产生讨论。

实现拆解

python/sglang/srt/layers/attention/linear/gdn_backend.pyforward_extend 方法中,修改了 needs_state_gather 布尔表达式的条件,添加了 (not is_cpu()) 子句,使得在 CPU 上即使状态池非连续也不会触发 gather/scatter 路径,直接传递原始张量给内核。同时更新了相关注释以解释 CPU 内核的兼容性。

文件 模块 状态 重要度
python/sglang/srt/layers/attention/linear/gdn_backend.py 注意力层 modified 5.71

关键符号

forward_extend

关键源码片段

python/sglang/srt/layers/attention/linear/gdn_backend.py core-logic

核心变更文件,修改 `needs_state_gather` 条件以跳过 CPU 上的 gather/scatter。

# python/sglang/srt/layers/attention/linear/gdn_backend.py (lines 487-494)
# 判断是否需要 gather/scatter 保护。
# 仅在非 verify 模式、非 CPU、且状态池非连续时才需要。
# CPU 内核(causal_conv1d_fwd_cpu, chunk_gated_delta_rule_cpu)能直接处理非连续池,
# 因此跳过 gather/scatter 可消除不必要的内存拷贝开销。
needs_state_gather = (
    (not is_target_verify)
    and (not is_cpu()) # 新增 : CPU 上跳过此保护
    and (not conv_states.is_contiguous() or not ssm_states.is_contiguous())
)

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险较低。变更只影响 CPU 路径,且 CPU 内核已通过标准索引方式正确处理非连续输入,回归风险小。但缺乏针对该场景的专用测试覆盖,未来若 CPU 内核实现修改可能引入回归。

影响范围较小:仅影响 Intel CPU 后端上使用 Mamba 状态池且池布局非连续的场景(如 AMX 加速),可消除每次 prefill 的 gather/scatter 开销,提升性能。对 CUDA 后端无影响。

缺少非连续池状态的 CPU 测试

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论