@@ -23,9 +23,10 @@ ties differently from on-device CMSIS-NN, so it is not used as a baseline. All
2323boards build at ` -O2 ` ; each runs at its rated clock, verified per run by a clock
2424guard in ` results.py ` . Latency is the median of 30 runs (DWT cycle counter on
2525M7/M4, hardware ` time_us ` on M33). RAM is the activation working set: TiGrIS
26- ` sram_peak ` (fast-arena peak + slow-pool spill + scratch + tensor table) against
27- TFLM ` arena_used ` ; weights live in flash and are excluded, as is stack. Captured
28- remotely on a SiliconRig hardware-in-the-loop lab via ` scripts/run_all.sh ` .
26+ ` sram_peak ` (fast-arena peak + slow-pool spill + scratch + tensor table +
27+ executor workspace) against TFLM ` arena_used ` ; weights live in flash and are
28+ excluded, as is stack. Captured remotely on a SiliconRig hardware-in-the-loop
29+ lab via ` scripts/run_all.sh ` .
2930
3031For each TiGrIS cell, CMake runs `tigris codegen <plan > --backend
3132{cmsis-nn|reference} --format core`. The generated, backend-specific deployment
@@ -46,44 +47,42 @@ int8 weights plus biases, measured from the committed plans.
4647
4748| Framework | Kernel | Latency | Cycles | RAM (work. set) | Flash (firmware) |
4849| ---| ---| ---| ---| ---| ---|
49- | TiGrIS | cmsis_nn | 11.21 ms | 5.38 M | 16.8 KB | 108 KB |
50- | TFLM | cmsis_nn | 12.80 ms | 6.14 M | 22.2 KB | 166 KB |
51- | TiGrIS | s8_ref | 63.12 ms | 30.30 M | 16.7 KB | 84 KB |
50+ | TiGrIS | cmsis_nn | 11.14 ms | 5.35 M | 25.5 KB | 118 KB |
51+ | TFLM | cmsis_nn | 12.80 ms | 6.14 M | 22.2 KB | 176 KB |
52+ | TiGrIS | s8_ref | 81.96 ms | 39.34 M | 25.3 KB | 93 KB |
5253
5354** Anomaly detection:**
5455
5556| Framework | Kernel | Latency | Cycles | RAM (work. set) | Flash (firmware) |
5657| ---| ---| ---| ---| ---| ---|
57- | TiGrIS | cmsis_nn | 1.19 ms | 569 K | 2.7 KB | 361 KB |
58- | TFLM | cmsis_nn | 1.16 ms | 558 K | 15.5 KB | 408 KB |
59- | TiGrIS | s8_ref | 3.02 ms | 1.45 M | 2.7 KB | 337 KB |
58+ | TiGrIS | cmsis_nn | 1.19 ms | 570 K | 11.6 KB | 370 KB |
59+ | TFLM | cmsis_nn | 1.16 ms | 558 K | 15.5 KB | 417 KB |
60+ | TiGrIS | s8_ref | 3.05 ms | 1.46 M | 11.4 KB | 346 KB |
6061
6162** Timeseries:**
6263
6364| Framework | Kernel | Latency | Cycles | RAM (work. set) | Flash (firmware) |
6465| ---| ---| ---| ---| ---| ---|
65- | TiGrIS | cmsis_nn | 0.306 ms | 147 K | 1.9 KB | 77 KB |
66- | TFLM | cmsis_nn | 0.345 ms | 166 K | 2.9 KB | 135 KB |
67- | TiGrIS | s8_ref | 1.13 ms | 544 K | 2.0 KB | 53 KB |
66+ | TiGrIS | cmsis_nn | 0.298 ms | 143 K | 11.4 KB | 87 KB |
67+ | TFLM | cmsis_nn | 0.345 ms | 166 K | 2.9 KB | 145 KB |
68+ | TiGrIS | s8_ref | 1.61 ms | 774 K | 10.7 KB | 62 KB |
6869
6970- Output is bit-exact device-to-device: every (model, framework, kernel) cell
7071 emits the identical INT8 vector (max abs diff 0), checked by
7172 ` scripts/validate_accuracy.py ` .
72- - CMSIS-NN vs the portable reference kernels (same model, both ` -O2 ` ): 5.6x
73- (DS-CNN) / 2.5x (AD) / 3.7x (TS) on the M7.
73+ - CMSIS-NN vs the portable reference kernels (same model, both ` -O2 ` ): 7.4x
74+ (DS-CNN) / 2.6x (AD) / 5.4x (TS) on the M7.
7475- Cycles are clock-independent; ms is at 480 MHz.
75- - Latency, cycles, and RAM come from the tracked ` results/summary.json ` . The
76- flash column is a build-time ` arm-none-eabi-size ` measurement that
77- ` summary.json ` does not carry, so it is not refreshed by a rerun; these values
78- are from the 2026-06-27 rig build and predate the codegen-core harness.
76+ - Latency, cycles, RAM, and firmware sizes come from the same tracked,
77+ provenance-bearing run in ` results/summary.json ` .
7978
8079## NUCLEO-F446RE (Cortex-M4F @ 180 MHz)
8180
8281| Model | TiGrIS cmsis | TFLM cmsis | TiGrIS s8 | RAM (TiGrIS / TFLM) |
8382| ---| ---| ---| ---| ---|
84- | TS | 1.56 ms | 1.80 ms | 11.00 ms | 1.9 / 2.9 KB |
85- | AD | 4.97 ms | 4.82 ms | 15.11 ms | 2.7 / 15.5 KB |
86- | DS-CNN | 59.90 ms | 68.19 ms | 513.20 ms | 16.8 / 22.2 KB |
83+ | TS | 1.56 ms | 1.80 ms | 8.41 ms | 11.4 / 2.9 KB |
84+ | AD | 4.97 ms | 4.82 ms | 16.53 ms | 11.6 / 15.5 KB |
85+ | DS-CNN | 63.53 ms | 68.19 ms | 467.58 ms | 25.5 / 22.2 KB |
8786
8887Output is byte-identical to the H753 (same weights, two architectures). The
8988128 KB SRAM holds every model.
@@ -96,11 +95,11 @@ byte-identical to the H753 and F446. Weights are read from QSPI flash via XIP.
9695
9796| Model | TiGrIS cmsis | TiGrIS s8 | RAM |
9897| ---| ---| ---| ---|
99- | TS | 2.73 ms | 9.02 ms | 1.9 KB |
100- | AD | 35.08 ms | 44.52 ms | 2.7 KB |
101- | DS-CNN | 62.94 ms | 412.77 ms | 16.8 KB |
98+ | TS | 2.68 ms | 8.37 ms | 11.4 KB |
99+ | AD | 35.01 ms | 44.56 ms | 11.6 KB |
100+ | DS-CNN | 67.83 ms | 412.06 ms | 25.5 KB |
102101
103- The FC-heavy AD is slower here (35.08 ms vs 4.97 ms on the F446): each of its
102+ The FC-heavy AD is slower here (35.01 ms vs 4.97 ms on the F446): each of its
104103265 KB of weights is read once per inference from XIP flash with no reuse, so it
105104is QSPI-bandwidth-bound. The conv models reuse weights across spatial positions
106105and stay fast.
@@ -109,39 +108,41 @@ and stay fast.
109108
110109MobileNetV2 (alpha 0.35, 224x224, INT8, 591 KB weights, 52 convs with
111110inverted-residual ADD skips) has a naive activation peak of 735 KB, larger than
112- any of these boards' SRAM. TiGrIS tiles it to a 300 KB working set (129 KB fast +
113- 172 KB slow-pool spill, 2 tiled stages), with bit-exact output across boards.
111+ any of these boards' SRAM. TiGrIS tiles it to a 307.7 KB working set (127.1 KB
112+ fast + 171.5 KB slow-pool spill + 9.1 KB scratch/runtime metadata, 2 tiled
113+ stages), with bit-exact output across boards.
114114
115115| Board (SRAM) | TiGrIS (tiled) | TFLM (no tiling) |
116116| ---| ---| ---|
117- | H753ZI (512 KB) | runs, 1.24 s, 300 KB | OOM at AllocateTensors |
118- | RP2350 (520 KB) | runs, 6.55 s, 300 KB | n/a (no M33 lib) |
117+ | H753ZI (512 KB) | runs, 1.43 s, 307.7 KB | OOM at AllocateTensors |
118+ | RP2350 (520 KB) | runs, 7.03 s, 307.7 KB | n/a (no M33 lib) |
119119| F446RE (128 KB) | does not fit | does not fit |
120120
121121- On the H753, TFLM given a 480 KB arena (nearly all of the 512 KB SRAM) fails
122122 ` AllocateTensors ` with ` ARENA_TOO_SMALL ` : with no tiling it needs the full
123123 735 KB. TiGrIS runs the identical model on the same board.
124124- The F446 cannot hold MobileNetV2: the 591 KB weight blob exceeds its 512 KB
125125 flash, and the 300 KB tiled working set exceeds its 128 KB SRAM.
126- - RP2350 is ~ 5.3x slower than the H753 on this model (XIP-bound: 591 KB of
126+ - RP2350 is ~ 4.9x slower than the H753 on this model (XIP-bound: 591 KB of
127127 weights streamed from QSPI flash each inference, plus the lower clock).
128128
129129## Reproduce
130130
131131` SRIG_API_KEY=... ./scripts/run_all.sh ` builds every cell, flashes and captures
132132on the SiliconRig lab, aggregates, and runs the parity gate. Raw serial logs land
133133in ` results/raw/ ` (gitignored); the tracked artifact is ` results/summary.json ` ,
134- which carries each cell's numbers and ` OUTPUT_I8 ` vector. See ` BUILD.md ` for the
135- build knobs and a locally-attached-board (no-rig) path.
134+ which carries each cell's numbers, ` OUTPUT_I8 ` vector, and deduplicated execution
135+ provenance. See ` BUILD.md ` for the build knobs and a locally-attached-board
136+ (no-rig) path.
136137
137138` results/provenance.json ` binds that summary and its collector/validator to
138- SHA-256 digests, records the paths and hashes of all 27 source captures, and
139- distinguishes declared dependency pins from unavailable execution provenance.
140- The captures are not shipped in a clone, but their hashes are retained so an
141- obtained capture set can be checked. Fields marked ` unknown ` are intentionally
142- unresolved rather than reconstructed from commit dates or current sibling
143- checkouts . Host validation always checks tracked artifact/tool hashes and also
144- checks source-capture hashes when those gitignored files are present. When the
145- complete capture set is available, it reruns the collector in a temporary
146- directory and requires byte-identical ` summary.json ` output; a clean clone
147- skips that reconstruction and does not report it as verified.
139+ SHA-256 digests and records the paths and hashes of all 27 source captures. The
140+ summary embeds the actual compiler, runtime, TFLM, CMSIS and SDK revisions;
141+ tool and Python-environment versions; build invocations; model and firmware
142+ hashes/sizes; capture timestamps; and SiliconRig board identities. The captures
143+ are not shipped in a clone, but their hashes are retained so an obtained capture
144+ set can be checked . Host validation always checks tracked artifact/tool hashes
145+ and also checks source-capture hashes when those gitignored files are present.
146+ When the complete capture set is available, it reruns the collector in a
147+ temporary directory and requires byte-identical ` summary.json ` output; a clean
148+ clone skips that reconstruction and does not report it as verified.
0 commit comments