mirror of
https://github.com/deepseek-ai/DeepEP.git
synced 2026-11-05 00:47:32 +00:00
[PR #692] Fix JIT failure on SM100+ with CUDA <= 13.0: use 64-bit size operand for st.bulk #710
Labels
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
deepseek-ai/DeepEP#710
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/deepseek-ai/DeepEP/pull/692
Author: @MengYu10151
Created: 7/20/2026
Status: 🔄 Open
Base:
main← Head:fix-st-bulk-size-operand📝 Commits (1)
747ea8eFix JIT failure on SM100+ with CUDA <= 13.0: use 64-bit size operand for st.bulk📊 Changes
1 file changed (+1 additions, -1 deletions)
View changed files
📝
deep_ep/include/deep_ep/common/ptx.cuh(+1 -1)📄 Description
Summary
st_bulk()indeep_ep/include/deep_ep/common/ptx.cuhpasses thest.bulksize operand in a 32-bit register ("r"constraint). The PTX ISA defines this operand as.u64— the 32-bit form only became legal in PTX ISA 9.0 and is first implemented in ptxas 13.1 (its own diagnostic states:Feature 'st.bulk with 32-bit size argument' requires PTX ISA .version 9.0 or later).As a result, on CUDA 12.8–13.0 toolchains, runtime JIT compilation of
dispatch_copy_epiloguefails on SM100-family GPUs wheneverdispatch(..., do_expand=True, do_zero_padding=True)is used. This is not a rare parameter combination: the standard test suitetests/elastic/test_ep.pyexercises it in its default flow, so on a clean SM100-family environment (no JIT cache) with CUDA <= 13.0 the first test run fails:This is likely invisible in environments already on CUDA 13.1+.
Changes
One line: pass the size as a 64-bit operand (
"l"constraint), which is accepted by every toolkit version.Verification
Verified on 8x B300 (sm_103) with
tests/elastic/test_ep.py --test-first-only(EP_DISABLE_GIN=1), and by directly compiling the JIT-generateddispatch_copy_epilogue_impl<true, true, true, ...>kernel across toolkits:"r"(before)"l"(after)Arguments mismatch for instruction 'st.bulk'Arguments mismatch for instruction 'mov'— runtime JIT failure on all ranks, test abortsNo behavior or performance change where both forms compile: with CUDA 13.1 the generated SASS for the affected kernel is byte-identical before/after (
cuobjdump -sassdiff is empty, identical register/shared-memory usage), and an 8-GPU A/B run shows identical dispatch bandwidth and passing correctness checks.To pin down the exact trigger condition, all 8
<kDoExpand, kCachedMode, kDoZeroPadding>template combinations ofdispatch_copy_epilogue_implwere compiled with CUDA 13.0 against the unfixed header: only the two instantiations withkDoExpand && kDoZeroPadding(<true, false, true>and<true, true, true>) fail; every other combination compiles fine, since thest_bulk()call sits behindif constexpr (kDoZeroPadding and kDoExpand).🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.