From 8ea807a4b55224d9d1d96b0a1f99874b2098643f Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 2 Oct 2026 19:51:11 +0000 Subject: [PATCH] Bump DspTap to the Helium Q15 dot; re-record the M55 baselines The pin moves to tap/DspTap#53, whose Q15 dot_row, accumulate_row and dot_row_reversed reduce eight lanes per VMLALDAVA on Helium cores. Before it, arm-none-eabi-gcc 13 left them one scalar SMLALBB per tap. The kernel is bit-exact by construction, so no output bit moves and every battery passes on every leg. Only the M55 Q15 counts move, all improvements beyond the ratchet's tolerance, so they are re-recorded with the README tables regenerated: - bridge Q15: -55 to -62 % (up_q15_eco 44.56 M -> 19.10 M) - async Q15 pipelines: -21 % and -42 % - rational Q15: -21 to -48 % (up3 74.87 M -> 51.16 M) Every float and Q31 count, and every M33 and Hexagon count, is unchanged. rational/PLAN.md records that the M6 finding (Q15 no faster than float on the M55) is resolved: Q15 is now 19 to 32 % under float there. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_015VR1VC4SDGxHZQQsQvPBaA --- async/README.md | 4 ++-- async/bench/baselines.json | 4 ++-- bridge/README.md | 8 ++++---- bridge/bench/baselines.json | 8 ++++---- rational/PLAN.md | 30 +++++++++++++++++++----------- rational/README.md | 12 ++++++------ rational/bench/baselines.json | 12 ++++++------ submodules/dsptap | 2 +- 8 files changed, 44 insertions(+), 36 deletions(-) diff --git a/async/README.md b/async/README.md index 01e27c3..76e1405 100644 --- a/async/README.md +++ b/async/README.md @@ -331,9 +331,9 @@ Executed instructions per fixed workload (`async/bench/icount/`), measured under | `kernel_float` | 2,427,595,993 | 109,298,076 | 422,160,541 | | `kernel_q15` | 1,123,119,218 | 192,431,957 | 187,429,187 | | `kernel_q31` | 1,169,957,251 | 221,164,795 | 194,964,122 | -| `pipeline12_q15` | 1,498,750,507 | 398,227,192 | 463,498,599 | +| `pipeline12_q15` | 1,498,750,507 | 231,525,615 | 463,498,599 | | `pipeline_float` | 2,391,686,215 | 102,590,477 | 419,186,490 | -| `pipeline_q15` | 1,020,281,310 | 137,792,386 | 204,476,476 | +| `pipeline_q15` | 1,020,281,310 | 109,235,651 | 204,476,476 | | `pipeline_q31` | 1,102,554,828 | 173,088,119 | 205,223,931 | diff --git a/async/bench/baselines.json b/async/bench/baselines.json index 465c03b..70abb6c 100644 --- a/async/bench/baselines.json +++ b/async/bench/baselines.json @@ -21,9 +21,9 @@ "kernel_float": 109298076, "kernel_q15": 192431957, "kernel_q31": 221164795, - "pipeline12_q15": 398227192, + "pipeline12_q15": 231525615, "pipeline_float": 102590477, - "pipeline_q15": 137792386, + "pipeline_q15": 109235651, "pipeline_q31": 173088119 } } diff --git a/bridge/README.md b/bridge/README.md index fbb29c4..ec0e0bc 100644 --- a/bridge/README.md +++ b/bridge/README.md @@ -154,13 +154,13 @@ Executed instructions per fixed workload (`bridge/bench/icount/`), measured unde |---|---:|---:|---:| | `down_float_eco` | 1,720,707,553 | 73,794,800 | 304,636,182 | | `down_float_tr` | 5,473,297,976 | 214,977,684 | 944,365,072 | -| `down_q15_eco` | 173,755,176 | 57,208,782 | 45,676,947 | -| `down_q15_se` | 130,967,926 | 46,983,269 | 33,235,098 | +| `down_q15_eco` | 173,755,176 | 22,404,812 | 45,676,947 | +| `down_q15_se` | 130,967,926 | 17,749,381 | 33,235,098 | | `down_q31_eco` | 244,985,862 | 96,697,327 | 45,622,550 | | `up_float_eco` | 1,231,730,349 | 55,451,902 | 220,214,287 | | `up_float_tr` | 3,110,380,470 | 126,303,581 | 533,810,335 | -| `up_q15_eco` | 133,914,472 | 44,556,679 | 35,990,378 | -| `up_q15_se` | 103,390,933 | 39,050,794 | 27,424,077 | +| `up_q15_eco` | 133,914,472 | 19,095,905 | 35,990,378 | +| `up_q15_se` | 103,390,933 | 17,493,186 | 27,424,077 | | `up_q31_eco` | 184,954,171 | 72,647,042 | 36,007,820 | diff --git a/bridge/bench/baselines.json b/bridge/bench/baselines.json index 4d55d4c..2fea9ad 100644 --- a/bridge/bench/baselines.json +++ b/bridge/bench/baselines.json @@ -26,13 +26,13 @@ "m55": { "down_float_eco": 73794800, "down_float_tr": 214977684, - "down_q15_eco": 57208782, - "down_q15_se": 46983269, + "down_q15_eco": 22404812, + "down_q15_se": 17749381, "down_q31_eco": 96697327, "up_float_eco": 55451902, "up_float_tr": 126303581, - "up_q15_eco": 44556679, - "up_q15_se": 39050794, + "up_q15_eco": 19095905, + "up_q15_se": 17493186, "up_q31_eco": 72647042 } } diff --git a/rational/PLAN.md b/rational/PLAN.md index f15dc1d..0eb8057 100644 --- a/rational/PLAN.md +++ b/rational/PLAN.md @@ -906,19 +906,27 @@ plugin, `bench/baselines.json`; the README carries the full table): | Workload | Cortex-M33 | Cortex-M55 | Hexagon | |---|---:|---:|---:| | `down2_float_eco` | 366,459,700 | 24,577,869 | 72,734,422 | -| `down2_q15_eco` | 47,494,712 | 25,070,113 | 18,554,089 | +| `down2_q15_eco` | 47,494,712 | 19,806,582 | 18,554,089 | | `up2_float_eco` | 732,658,864 | 43,442,565 | 137,930,738 | -| `up2_q15_eco` | 67,354,778 | 47,493,112 | 28,133,275 | +| `up2_q15_eco` | 67,354,778 | 34,150,590 | 28,133,275 | | `up3_float_eco` | 1,407,620,075 | 75,330,937 | 254,903,952 | -| `up3_q15_eco` | 92,695,694 | 74,874,023 | 39,793,932 | -| `construct_q15_eco` | 774,741 | 33,682 | 183,854 | - -One finding, recorded for the codegen levers: on the M55, Q15 is not yet -faster than float (↓2 25.07 M against 24.58 M, ↑2 47.49 M against -43.44 M), where on the M33 it executes 7.7–15× fewer instructions and on Hexagon -3.9–6.4× fewer (the ↓2, ↑2 and ↑3 pairs). -The Q15 dot is the generic scalar kernel; an MVE dual-MAC Q15 kernel is a -lever after M6, with the sparse rows and the symmetry-halved table, each +| `up3_q15_eco` | 92,695,694 | 51,156,121 | 39,793,932 | +| `construct_q15_eco` | 774,741 | 33,098 | 183,854 | + +One finding, recorded for the codegen levers, and the first lever it +pulled: at M6, Q15 on the M55 was no faster than float (↓2 25.07 M against +24.58 M, ↑2 47.49 M against 43.44 M), where on the M33 it executes 7.7–15× +fewer instructions and on Hexagon 3.9–6.4× fewer (the ↓2, ↑2 and ↑3 +pairs). The cause was the substrate's Q15 dot: arm-none-eabi-gcc 13 left it +one scalar SMLALBB per tap on Helium. DspTap's Helium Q15 kernel +(tap/DspTap#53: eight lanes per VMLALDAVA, bit-exact) took the M55 Q15 rows +above to the counts shown — ↓2 −21 %, ↑2 −28 %, ↑3 −32 %, the by-4 chain +−48 % — with every output bit, every float and Q31 count and every M33 and +Hexagon count unchanged (bridge's Q15 workloads fell 55–62 % and async's +Q15 pipelines 21–42 % on the same pin). Q15 is now 19 % (↓2) to 32 % (↑3) +under float on the M55; what remains per output is the stage's own +bookkeeping around the dot. The sparse rows, the symmetry-halved table and +the Q15 decimators' per-branch quantization are the levers still open, each measured against these baselines. **Order and gating.** M0 lands in DspTap and the family bumps its pin diff --git a/rational/README.md b/rational/README.md index cc3c139..d743ec1 100644 --- a/rational/README.md +++ b/rational/README.md @@ -172,16 +172,16 @@ Executed instructions per fixed workload (`rational/bench/icount/`), measured un | Workload | Cortex-M33 | Cortex-M55 | Hexagon | |---|---:|---:|---:| -| `construct_q15_eco` | 774,741 | 33,682 | 183,854 | -| `down2_down2_q15_eco` | 62,508,360 | 54,506,280 | 22,251,668 | +| `construct_q15_eco` | 774,741 | 33,098 | 183,854 | +| `down2_down2_q15_eco` | 62,508,360 | 28,178,778 | 22,251,668 | | `down2_float_eco` | 366,459,700 | 24,577,869 | 72,734,422 | | `down2_float_tr` | 955,278,690 | 47,997,517 | 174,664,319 | -| `down2_q15_eco` | 47,494,712 | 25,070,113 | 18,554,089 | +| `down2_q15_eco` | 47,494,712 | 19,806,582 | 18,554,089 | | `down3_float_eco` | 476,573,580 | 31,908,454 | 90,345,997 | -| `down3_q15_eco` | 51,977,458 | 28,017,447 | 19,350,211 | +| `down3_q15_eco` | 51,977,458 | 21,227,446 | 19,350,211 | | `up2_float_eco` | 732,658,864 | 43,442,565 | 137,930,738 | | `up2_float_tr` | 1,961,674,119 | 89,901,988 | 340,655,706 | -| `up2_q15_eco` | 67,354,778 | 47,493,112 | 28,133,275 | +| `up2_q15_eco` | 67,354,778 | 34,150,590 | 28,133,275 | | `up3_float_eco` | 1,407,620,075 | 75,330,937 | 254,903,952 | -| `up3_q15_eco` | 92,695,694 | 74,874,023 | 39,793,932 | +| `up3_q15_eco` | 92,695,694 | 51,156,121 | 39,793,932 | diff --git a/rational/bench/baselines.json b/rational/bench/baselines.json index be3fa4a..119093d 100644 --- a/rational/bench/baselines.json +++ b/rational/bench/baselines.json @@ -28,17 +28,17 @@ "up3_q15_eco": 92695694 }, "m55": { - "construct_q15_eco": 33682, - "down2_down2_q15_eco": 54506280, + "construct_q15_eco": 33098, + "down2_down2_q15_eco": 28178778, "down2_float_eco": 24577869, "down2_float_tr": 47997517, - "down2_q15_eco": 25070113, + "down2_q15_eco": 19806582, "down3_float_eco": 31908454, - "down3_q15_eco": 28017447, + "down3_q15_eco": 21227446, "up2_float_eco": 43442565, "up2_float_tr": 89901988, - "up2_q15_eco": 47493112, + "up2_q15_eco": 34150590, "up3_float_eco": 75330937, - "up3_q15_eco": 74874023 + "up3_q15_eco": 51156121 } } diff --git a/submodules/dsptap b/submodules/dsptap index 537ab30..d646905 160000 --- a/submodules/dsptap +++ b/submodules/dsptap @@ -1 +1 @@ -Subproject commit 537ab30d31d3ab640e5ccccd1d9562b713b8a339 +Subproject commit d646905a47aa11ca9d1bcbcd36a28081cce8c4dc