Repository navigation
llama.cpp: pin e6c80014e, a fused HIP matcher can claim the node it is rooted at (#679) - #2315
Conversation
…s rooted at (engine #679) e7796262e -> e6c80014e is one commit, llama.cpp #332: hip_declare_tensor_claim / hip_tensor_claimed, consulted by device_supports_op. With the private add-on (gpu-kernels #69) the QSA indexer's f16 gather now reaches hip.qsa_pool_blocks in Flash-Next decode. At 18.8k: 74 -> 50 splits per step, 0 tensors copied into CPU splits (12 x 4.85 MB before), greedy text identical. Without an add-on registration, every supports_op answer is unchanged. Pinned tree's own suite (gfx1151, e6c80014e, no add-on): hrx-backend-test host 85/85, device 13/13. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT: READY at e538cd6
The pin carries both fixes its own PR needed, and I checked that at the pin rather than by ancestry -- which for this fork is the only check that means anything, since it re-applies commits.
$ git rev-list --count e7796262e..e6c80014e (in the fork)
1
$ git log --oneline e7796262e..e6c80014e
e6c80014e hrx: a fused HIP matcher can claim the node it is rooted at (engine #679) (#332)
And the content I asked for on #332 is in the pinned tree, not merely in the PR that produced it:
| what | at e6c80014e |
|---|---|
GGML_HRX_HIP_TENSOR_CLAIM |
ggml-hrx.cpp:1, hip-capabilities.h:4 (the #if and the #ifndef guard) |
| the #389 arm | tests/hrx-backend-test.cpp:16 (GGML_STATUS_SUCCESS), 13 hits for hip_tensor_claim |
So the dead #define and the unarmed graph-level constraint are both closed at this pin -- a bump that landed the earlier 9b61cf9/755da13 shape instead would have carried a switch nothing read.
The registry line is load-bearing and I ran its negative control on this head:
$ python3 tools/registry_build.py --check-pins # registry set back to e7796262e, gitlink at e6c80014e
registry/architectures.json: llama.cpp (hrx) recorded at e7796262e, pinned at e6c80014e
a pin moved without regenerating the registry … rc=1
and the tree as pushed passes (records the committed pins, rc 0). Same check that ties the two lines together; nothing else in the tree names either sha except the historical sentence in docs/hrx.md.
The per-step table is the right way to present this, because the numbers are the PR's reason to exist and they are all downstream of the placement:
| per decode step | before | after |
|---|---|---|
qsa_pool_blocks MATCHED cache=f16 |
0 | 64 |
| scheduler splits | 74 | 50 |
| tensors copied into CPU splits | 12 × 4.85 MB | 0 |
| greedy text | – | md5 identical, fusion on vs off |
And the honest line at the end is the one I would keep: "Decode tok/s is not claimed: one clean pair (off 8.79 / on 12.24 t/s) is not a row (see #679)." A 39 % single pair next to a 24-split reduction is exactly the number that would get quoted as a win, and it is labelled as not being one.
Noted, not blocking: "the engine's own ctest at this pin" was not run because there is no checkout and disk is under the floor -- the diff is two lines in one registry entry plus a gitlink, and the pinned tree's own suite (85/85 host, 13/13 device) is the check that matters for a pin. If a later lane runs the engine ctest at this pin, registry_pins and npu_pack_import_test are the two rows I would expect to be sensitive; neither is touched by #332.
Not run: the device tier and the paired add-on run (yours).
|
VERDICT: READY at The PR moves the pin What makes the mechanism sound, checked in the implementation:
One note, not a blocker: table overflow is handled with |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at e538cd6: READY
This is the pin I predicted one bump ago, and it carries both halves of #332 — verified in the submodule's clone, which is the lesson from my last pin review.
e6c80014eexists and is onorigin/1bit/hrx-vulkan-patched.- Forward, not a rewind:
e7796262e(the pin #2312 merged) is an ancestor. I checked this inside the llama.cpp clone this time — asking the engine repo answers "not an ancestor" for a commit it does not hold, which is a false negative that reads exactly like the danger the check exists for. - By content, which is what actually decides: the pinned
hip-capabilities.hcontainsHipTensorClaim/declare_tensor_claim(2 matches) and theHIP_TENSOR_CLAIMenv gate (4 matches). So the claim registry and the switch that gates its consult both arrive, which is more than the registry alone — the gate is what makes the mechanism bisectable on a box where a fused claim misbehaves. registry/architectures.jsonchanges the pin line.
Sequencing, so nobody has to reconstruct it later: #2312 was pinned at e7796262e and merged; this is the next link. The registry lands with the gate, so #332 needs no further bump. What is not here is the consumer side — the QSA gather claim lives in gpu-kernels#69, which is a different repo and lands separately; this pin makes it possible, not live.
One note for whoever watches the pair: a claim is only honest if a dispatch takes it (the invariant #332's header states — "a claimed node no dispatch takes fails the whole graph"). The pinned tree is the capability; the dispatch that honours it is a kernel PR. Two repos, one property.
What
Moves the llama.cpp (hrx) pin
e7796262e→e6c80014e:third_party/llama.cppgitlink +registry/architectures.json, the same two files as #2312. Refs #679.The range is one commit, llama.cpp #332:
hip_declare_tensor_claim/hip_tensor_claimed, consulted bydevice_supports_op.supports_opjudged that node alone and sent it to the CPU.supports_opanswer is unchanged.Why it matters
With the private add-on (gpu-kernels #69,
hip.qsa_pool_blockson the default f16 indexer cache), Flash-Next decode at 18,782 tokens:e7796262ee6c80014e+ #69qsa_pool_blocks MATCHED cache=f16cache_idx_k_l*Verified at this pin
e6c80014e, no add-on):hrx-backend-testhost 85/85, device 13/13, includinghip_tensor_claimand its scheduler arms.6a8922eon top:ggml-hrx-qsa-pool-checkf16 and f32 at the 18.8k shape, 0 of 606,208 differ; the odd-stride arm refuses.Decode tok/s is not claimed: one clean pair (off 8.79 / on 12.24 t/s) is not a row (see #679).
🤖 Generated with Claude Code