round 38 track a: qsa caches and mtp prefill #

shipped #

patch: /tmp/astra_r38_qsa/astra_r38_qsa.patch (not applied to vendor).

  • metal/src/engine/window.cpp: absent STRATA_METAL_MTP_PREFILL_TAIL, prefill now uses STRATA_METAL_MTP_WIN clamped to [64, 2050], default 256. explicit prefill overrides still have only the existing lower bound of 64. initialization stays function-local/static. kept inside the assigned prefill boundary rather than introducing a shared helper outside ownership.
  • metal/tests/qsa_parity.cpp: adds nt=3 to the existing --ab decode suite, retaining 1/2/4/8 and prompt 1984/2048.
  • no shader change retained. both proposed caches were bitwise exact but failed the performance gate. qsa_score is already fully unrolled; multi-token reuse was not implemented or claimed measured.

experiment #

apple m5, isolated /tmp/astra_r38_qsa/strata, baseline shaders frozen under ref/. no server requests, no model loads, no full-model benchmark. gpu runs serialized. each test invocation finished below 15 seconds (slowest 14.432 seconds); cold compile limit 20 seconds was available. source fingerprints: sha256.json.

built with:

cmake -S /tmp/astra_r38_qsa/strata/metal -B /tmp/astra_r38_qsa/strata/build-metal -G Ninja
cmake --build /tmp/astra_r38_qsa/strata/build-metal --target qsa_parity qsa_prompt_parity -j 4

baseline self-comparison: baseline.log, full-buffer memcmp pass; top-k ratio 1.0050 at p=3000, nt=3.

candidates (snapshots retained):

  1. contiguous.metal: eight keys per thread for nb<=8192, contiguous block assignment shared across four radix and two emit passes. fallback preserved.
  2. strided.metal: eight coalesced/strided radix keys for nb<=8192 plus eight emit keys reused between the emit passes. fallback preserved.

paired qsa_parity --ab /tmp/astra_r38_qsa/ref P ran for P=3000,10180,30000; each includes nt=1,2,3,4,8 and prep-only prompt nt=1984,2048. all full-output-buffer memcmp comparisons passed for both variants.

median paired top-k candidate/reference ratios (nt=1 / 3 / 4):

candidate p=3000 p=10180 p=30000
contiguous 1.0413 / 1.0301 / 0.9616 1.0421 / 1.0464 / 1.0355 0.9902 / 0.9950 / 0.9948
strided + emit 1.0772 / 1.0766 / 1.0757 1.1299 / 1.0872 / 1.1191 1.0639 / 1.0510 / 1.0639

reject both: contiguous regresses at 10180; strided regresses at both 10180 and 30000. no confirmation run needed to ship a rejected variant. timings elsewhere varied with device state, so tiny gains are not evidence of a win. no claim that fewer source-level loads imply faster execution. detailed stage timings: contiguous-ab-{P}.log, strided-ab-{P}.log.

final verification #

all commands exited 0:

  • qsa_parity P, P=3000,10180,30000: standard cpu-reference tolerances pass (final-parity-{P}.log).
  • qsa_prompt_parity: all standard tolerance checks pass; qcurh and qsa_flash fusion memcmp pass (final-prompt-parity.log). standard fp16-vs-fp32 attention checks are tolerance checks, not bitwise equality.
  • qsa_parity --ab /tmp/astra_r38_qsa/ref P: all full-buffer memcmp checks pass, including nt=1,3,4, for all three contexts (final-ab-{P}.log). final shaders are identical to baseline; timings here are self-comparison noise, not a performance claim.
  • qsa_prompt_parity --ab T P /tmp/astra_r38_qsa/ref/qsa_prompt.metal /tmp/astra_r38_qsa/ref/qsa.metal 3: nine combinations, T=1,3,4 and P=3000,10180,30000, all memcmp pass (final-prompt-ab-{P}-{T}.log). this suite covers prompt prep/score, not qsa_topk2.
  • exact extracted prefill initializer compiled with c++ -std=c++17; nine separate-process env checks pass: unset=256, win512=512, win1024=1024, win1=64, win9999=2050, invalid win=64, win1024+tail512=512, tail1=64, tail4096=4096. source/log: tail_policy.cpp, tail-policy.log. this is a policy-expression test, not model integration.
  • git -C vendor/strata apply --check /tmp/astra_r38_qsa/astra_r38_qsa.patch: exit 0.

final review: reviewed the complete two-file diff with view_diff using a scratch baseline repo. no tracked vendor files edited. host engine/model integration not built or exercised; isolated cmake built only the two standalone parity targets. all evidence paths not otherwise qualified are under /tmp/astra_r38_qsa/.