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