Skip to content

rational: the construct ratchet leg carries its input fixture, as the siblings' do - #78

Merged
tap merged 1 commit into
mainfrom
claude/sample-rate-solutions-comparison-mqc190
Oct 10, 2026
Merged

tap merged 1 commit into
mainfrom
claude/sample-rate-solutions-comparison-mqc190

Conversation

@tap

@tap tap commented Oct 10, 2026

Copy link
Copy Markdown
Owner

What this changes

The follow-up noted on #77. rational's construct_q15_eco ratchet leg becomes the Q15 by-4 chain's workload with its stream removed — the chain built, the same 0.25 s input fixture its streaming workload synthesizes, then one 32-frame block — the shape async's construct_q15 and bridge's construct_*_q15_eco have had since #73. Its three baselines are re-recorded; the README table is regenerated; PLAN.md's hand-kept table carries the row and its provenance.

Why

Until now rational's leg was construction alone (two designs and tables, then four zero frames), so down2_down2_q15_eco minus it was the streaming loop plus the fixture, where the siblings' differences are the loop alone. On the M33 the fixture's 12,000 libm sin() calls are soft-double and dominate: with the fixture in the leg, the by-4 chain's streaming loop is a first-class number on every target, read the same way across the family.

Verification

  • Re-recorded on all three targets (arm-none-eabi-gcc 13.2.1, CodeLinaro 19.1.5, QEMU 8.2.2 with tools/qemu_insn_plugin built from the tree): M33 777,433 → 26,810,642, M55 34,522 → 1,567,568, Hexagon 193,048 → 8,341,715 — 43 % / 5.6 % / 38 % of the chain workload's total, leaving the streaming loop at 372 / 277 / 145 instructions per stereo frame.
  • Nothing else moves: down2_down2_q15_eco re-measures identically on every target after the rebuild (the source file is shared by all fourteen binaries). The local harness reproduces the committed baselines to within +52…+545 instructions per workload; one M55 row, ratio23_q15_eco, has sat +1.9 % since the DspTap bumps after the 2026-10-02 record and is untouched here (within the gate, not this PR's).
  • Gates: the new leg compiles warning-free under clang and GCC at -Wconversion -Wsign-conversion -Werror for scenarios 11 and 8; clang-format clean; retired-words clean; update_icount_docs.py --engine rational idempotent.
  • Not run locally: the CI ratchet jobs themselves. They are the real gate for the three new baselines; the local counts are expected to land within a few hundred instructions of the runner's, as every other row does.

Notes for the reviewer

  • The old figures stay on record in PLAN.md: under a million instructions everywhere for the two designs and tables by themselves, which is why the comparison document's construction column for this engine is mostly fixture.
  • Checksum of the leg changes (71 → 78: it now includes the processed block's first sample); the ratchet gates counts, not checksums, outside --compare-json mode.
  • No contract change, no submodule pin moved, no notebooks affected.

🤖 Generated with Claude Code

https://claude.ai/code/session_01G3HxzEGiZp7jStoMuYNuBK


Generated by Claude Code

… siblings' do

rational's construct_q15_eco was construction alone — the Q15 by-4 chain's
two designs and tables, then four zero frames — while async's construct_q15
and bridge's construct_*_q15_eco (since the comparison freshness PR) are
their Q15 workloads with the stream removed: the converter built, the same
0.25 s input fixture synthesized, one block processed. The leg is now the
same shape here: down2_down2_q15_eco minus it is the streaming loop alone,
and the fixture's libm sin() — soft-double on the M33 — sits in the leg,
not in the difference.

Re-recorded on all three targets (arm-none-eabi-gcc 13.2.1, CodeLinaro
19.1.5, qemu 8.2.2 with the tree's plugin): M33 777,433 -> 26,810,642,
M55 34,522 -> 1,567,568, Hexagon 193,048 -> 8,341,715 — 43 % / 5.6 % /
38 % of the chain's total, leaving the streaming loop at 372 / 277 / 145
instructions per stereo frame. The chain workload itself re-measures
identically on every target. The local harness reproduces the committed
baselines to within +52..+545 instructions per workload (one M55 row,
ratio23_q15_eco, sits +1.9 % since the DspTap bumps after the 2026-10-02
record; untouched here). README table regenerated; PLAN.md's hand-kept
table carries the row and the provenance.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3HxzEGiZp7jStoMuYNuBK
@tap
tap merged commit c120bc9 into main Oct 10, 2026
30 checks passed
@tap
tap deleted the claude/sample-rate-solutions-comparison-mqc190 branch October 10, 2026 16:53
tap pushed a commit that referenced this pull request Oct 10, 2026
The comparison plan (#73, #75, #76, #77) and its follow-up (#78) closed;
this is the plan for what the family's plans and ledgers still carry
open, sequenced into twelve weeks in three blocks, with "production-ready"
defined as a thirteen-row checklist per engine so the verdict can be
checked rather than believed.

Drafted and then audited by two independent adversarial reviews (one
against the trees' facts and settled decisions, one against engineering
judgement). The audit changed the draft materially: the book's bridge
chapters are done (#68), so they are off the list; rational has no
cross-engine validation by design (scipy and decimate.h are its legs);
TSan runs async only; four host compilers and three QEMU targets, not the
draft's counts; the +1.9 % M55 ratio23_q15_eco drift is ab8fea3's stated
move, not a DspTap bump, and the chain rows sit +926/+1,102; the hardware
block never ran bridge or rational on silicon; nothing builds with
-fno-exceptions; TSan has never seen the converter with two threads; no
footprint, stack or worst-single-call figure exists; Setup 1's "< 1 ppm"
criterion tests the counting, not the servo, and cheap USB dongles may not
own a crystal; the timestamp servo is a four-to-five-week extension, not an
overload, and must not be frozen in the release that adds it; "C ABIs
frozen" needs a reconciled NULL model, an extension rule, SOVERSION and a
compat test. Section 7 holds the six decisions the maintainer takes before
week 1, each with a recommendation.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3HxzEGiZp7jStoMuYNuBK
tap pushed a commit that referenced this pull request Oct 10, 2026
The comparison plan (#73, #75, #76, #77) and its follow-up (#78) closed;
this is the plan for what the family's plans and ledgers still carry
open, sequenced into twelve weeks in three blocks, with "production-ready"
defined as a thirteen-row checklist per engine so the verdict can be
checked rather than believed.

Drafted and then audited by two independent adversarial reviews (one
against the trees' facts and settled decisions, one against engineering
judgement). The audit changed the draft materially: the book's bridge
chapters are done (#68), so they are off the list; rational has no
cross-engine validation by design (scipy and decimate.h are its legs);
TSan runs async only; four host compilers and three QEMU targets, not the
draft's counts; the +1.9 % M55 ratio23_q15_eco drift is ab8fea3's stated
move, not a DspTap bump, and the chain rows sit +926/+1,102; the hardware
block never ran bridge or rational on silicon; nothing builds with
-fno-exceptions; TSan has never seen the converter with two threads; no
footprint, stack or worst-single-call figure exists; Setup 1's "< 1 ppm"
criterion tests the counting, not the servo, and cheap USB dongles may not
own a crystal; the timestamp servo is a four-to-five-week extension, not an
overload, and must not be frozen in the release that adds it; "C ABIs
frozen" needs a reconciled NULL model, an extension rule, SOVERSION and a
compat test. Section 7 holds the six decisions the maintainer takes before
week 1, each with a recommendation.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3HxzEGiZp7jStoMuYNuBK
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