gqa(adr): ADR-0065 review fixes — KERNEL phase/repetition split, auto-bind conflict + MATH-TCM invariants, FIFO conservatism note, logical_bytes per-op summation
ADR-0065 review fixes: - D3 semantics clarified: position determines *phase* (pre-loop / head / in-accumulation / per-output-tile / post-loop), scope determines *repetition*. KERNEL = "once per CompositeCmd invocation", not "once per kernel launch" — removes ambiguity around softmax_merge's KERNEL scope at different positions before/after GEMM. - D4 MATH-TCM invariant: Phase 1 limits DMA auto-insertion to GEMM operands and head outputs; MATH operand with space="hbm" raises validation error at TLContext emit. Catches kernel misuse early; a MATH-with-HBM path is future work (explicit tl.load + MATH composite). - D6 #6 NEW: auto-bind conflict — explicit GEMM `a=` + prologue primary_out simultaneously → validation error (prevents "which value wins" ambiguity). - D6 #7 NEW: MATH operand TCM-only restatement. - Consequences/Negative: strict-FIFO conservatism note — safe but may under-expose composite-level overlap when handle-sharing composites could in principle run in parallel. - Test Requirements #10, #11: auto-bind conflict + MATH-HBM validation error tests. ADR-0064 Revision 2 clarification: - D2 counting rule: per-op summation, no deduplication. Same handle appearing in multiple OpSpecs or in rw_handles is counted independently — matches HW reality (each descriptor field is a distinct address slot, rw_handles is separate metadata block). Example walked through (mul_bcast with O in src_a + out + rw_handles). DDD-0065 follow-on: - §3.2: new test file test_tl_composite_validation.py covers auto-bind conflict, MATH-TCM, GEMM-count invariants. - §4.3: phase vs repetition split aligned with ADR-0065 D3. - §6 lowering pipeline: step 5 adds auto-bind conflict check; step 8 NEW — operand space validation; step 9 (size cap); step 10 (emit). - §8 strict-FIFO conservatism note: explains why next-tile #1 cross-tile pipelining still works under FIFO (no rw overlap), and where the conservatism would hurt (future handle-sharing recipes). - §10 verification: invariant-guard tests (auto-bind conflict, MATH TCM, per-op summation accuracy). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -150,6 +150,19 @@ def _extra_bytes(v) -> int:
|
||||
(Identical rule for `DmaReadCmd`, `MathCmd`, etc. — one property per
|
||||
dataclass, ~3 lines each.)
|
||||
|
||||
**Counting rule — per-op summation, no deduplication.** Each
|
||||
`TensorHandle` reference inside an `OpSpec` is counted independently,
|
||||
even when the same handle appears in multiple OpSpecs or in
|
||||
`rw_handles`. The `rw_handles` block is metadata for cross-composite
|
||||
hazard tracking (ADR-0065 D6.3) and is counted separately from
|
||||
operand references in `ops`. There is no deduplication. This matches
|
||||
HW reality: the descriptor encodes each operand slot as an independent
|
||||
address field, and the dispatcher tracks `rw_handles` as a distinct
|
||||
metadata block. Example: `OpSpec(kind="mul_bcast", operands={"src_a":
|
||||
O, "src_b": corr}, out=O)` counts handle `O` *twice* (once for
|
||||
`src_a`, once for `out`); if `O` is also in the enclosing
|
||||
CompositeCmd's `rw_handles`, it is counted a third time.
|
||||
|
||||
### D3. Defaults — anchored on a typical composite ≈ 43 ns
|
||||
|
||||
Anchor: a **single-OpSpec composite for a DMA-staged GEMM path** —
|
||||
|
||||
Reference in New Issue
Block a user