Skip to content

gpu-compute: stop decoding instructions after stopFetch - #1

Open
Basemism wants to merge 1 commit into
stagingfrom
staging-basem/gpu-fetch-stop
Open

gpu-compute: stop decoding instructions after stopFetch#1
Basemism wants to merge 1 commit into
stagingfrom
staging-basem/gpu-fetch-stop

Conversation

@Basemism

@Basemism Basemism commented Sep 2, 2026

Copy link
Copy Markdown

Fetch has two steps: request/cache instruction bytes, then decode buffered bytes into the wavefront instruction buffer. Wavefront::stopFetch() already treated branches, returns, and s_endpgm as boundaries, but decodeInsts() checked it
only when scheduling future fetch requests. Its inner loop continued consuming bytes already buffered after a boundary.

When s_endpgm and following bytes occupied the same fetched region, gem5 decoded those following bytes under the ending kernel's wavefront. Constructing the following instruction immediately mapped its operands against that kernel's
valid reservation and produced a false panic. The instruction would never have executed: s_endpgm erases later buffered instructions and terminates the wave.

Fix:
Honor Wavefront::stopFetch() before decoding either a split instruction or additional instructions from the fetch buffer. This prevents the decoder from continuing to populate the instruction buffer after the wavefront has entered a state that blocks further fetch and decode work.

Honor Wavefront::stopFetch() before decoding either a split instruction or
additional instructions from the fetch buffer. This prevents the decoder from
continuing to populate the instruction buffer after the wavefront has entered
a state that blocks further fetch and decode work.
@Basemism
Basemism requested review from TomXia, mattsinc and v-ramadas and a lite review from Copilot September 2, 2026 10:28
@Basemism Basemism self-assigned this Sep 2, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The new stopFetch() usage in the while condition can introduce avoidable O(n²) behavior in a hot decode loop due to repeated full scans of the instruction buffer.

Pull request overview

This PR fixes a GPU fetch/decode boundary bug in the shader instruction fetch unit: once a wavefront has buffered a control-flow/end-of-kernel instruction (e.g., s_endpgm), decoding now stops immediately instead of continuing to consume already-fetched bytes and populating the instruction buffer with instructions that should never execute.

Changes:

  • Gate FetchBufDesc::decodeInsts() so it does not decode split or subsequent instructions after Wavefront::stopFetch() becomes true.
  • Prevent decoding of post-s_endpgm bytes that can incorrectly map operands and trigger false panics.
File summaries
File Description
src/gpu-compute/fetch_unit.cc Stops decode from consuming buffered bytes past branch/return/end-of-kernel boundaries by honoring Wavefront::stopFetch() during decode.
Review details

Suppressed comments (1)

src/gpu-compute/fetch_unit.cc:597

  • wavefront->stopFetch() is an O(n) scan over instructionBuffer (see Wavefront::stopFetch()), and calling it in the while condition can make decodeInsts() potentially O(n^2) per buffer fill (one full scan per decoded instruction). You can keep the same correctness behavior while avoiding repeated scans by checking stopFetch() once up-front, then breaking based on the newly-decoded instruction being a branch/return/end-of-kernel.
           hasFetchDataToProcess() && !wavefront->stopFetch()) {
        if (splitDecode()) {
            decodeSplitInst();
        } else {
            TheGpuISA::MachInst mach_inst =
  • Files reviewed: 1/1 changed files
  • Comments generated: 0
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants