The Horace experiment: the same matmul draws 38 to 63 W depending on the data
Horace He's post "Strangely, Matrix Multiplications on GPUs Run Faster When Given 'Predictable' Data!" (April 2024) found that an A100 multiplies matrices of zeros about 15% faster than random ones (295 against 257 TFLOPS): predictable data flips fewer transistors, draws less power, and a power-limited GPU then clocks higher. On this chip the whole chain can be taken apart, because the RTL (the Verilog source) of its core family's multiply-add unit is open. At the same clock and the same 9.2 TFLOPS, a matmul on aifoundry2's card draws 38 W on zeros, 47 W on ones and 63 W on random values (the other cards' watts are in the figures below). It heats the die roughly in proportion to the watts above idle (12 and 30 W): 27 and 76 thousandths of a degree per trillion FLOPs on ones and random values. Zeros, 2 W above idle, move the whole-degree reading by at most one step, so their rise is not resolved (section 1). It follows the sparse compute report, whose first two runs, on aifoundry3, found that zeros save most of the tensor unit's power but no cycles.
Simulating that RTL (core-et's Erbium branch: the same Minion core lineage in a later configuration, not the taped-out netlist) on the operands the card ran explains the watts: register bits clocked and nets toggled predict the board power of 14 patterns to 0.5 W rms in aifoundry2's session of 21 September, each predicted by a fit that left it out (0.9 to 1.0 W on each card's patterns of 26 September). A thermal network fitted to the same session then turns watts into the temperature curve to about 0.3 °C rms, which is what the sensor's rounding to whole degrees alone would leave. Horace's speed effect itself needs a die cool enough for the governor to raise the clock; section 6 shows it in a demonstration of seven runs on aifoundry2, the only card measured here whose governor raised the clock.
Run for minutes instead of seconds, only zeros hold a steady temperature at full load (aifoundry2, one four-hour session): random data takes the die from 80 to 90 °C in 19 to 26 s (four runs), ones in about two minutes (three runs). A three-line model (flip rates to watts, leakage that grows with temperature, a thermal network) predicts those times from the flip counts, on runs it was not fitted to, to within a quarter; at ten minutes it runs a few degrees hot near the card's flip budget. It priced 14 structured matrices, from Hadamard to kaleidoscope, before they ran. On two more cards the power model needs at most one scale factor, which a random-data run calibrates: 0.88 to 0.99 as registered, 0.93 to 1.00 at the same die temperature; whether aifoundry3's is the card or its cooler die the check could not say (section 10). The thermal network is aifoundry2's alone: no other card's cooling over minutes was measured.
Terms used on this page
The compute cores of the ET-SoC-1 (Esperanto's RISC-V accelerator, now open-sourced by AI Foundry) are minions, each with two hardware threads (harts) and a tensor unit whose matrix multiply-add instruction is TensorFMA (one fp32 op multiplies 16×16×16 tiles: 4,096 multiply-adds); 32 minions form a shire. The service processor is the on-die management core whose firmware reads the sensors and runs the clock governor (600, 700 or 800 MHz). aifoundry2 and aifoundry3 are lab machines with one card each; aifoundry1 holds two, of which card 1 (aifoundry1-c1) was measured (card 0 could not hold a load then; a broken fan, replaced on 2 October). More in the hub's glossary.
1. Same FLOPs, different heat
All 1,024 minions (the chip's compute cores, 32 to a shire; the chip has 1,088 in 34 shires, and the two not used here
are the master and spare shires) each run one 16×16×16 fp32 TensorFMA (the tensor unit's matrix multiply-add)
over and over, on operands held in the L1 scratchpad (3 KB of each minion's 4 KB data cache). Every pattern takes 546.0
cycles per op at 600 MHz, so every run does the same 9.18 × 10¹² FLOPs per second, 6.7 × 10¹³ in its 7.3 s. Only the values
in A and B differ. Six patterns ran five times each; eight more ran twice each for the model in
section 3. Sections 1 to 9 are aifoundry2's card; section 10 repeats these 7 s runs on
aifoundry3 and aifoundry1-c1, and where another card's values differ the text gives them.
Heating per FLOP: the chart, table, and how small rises were measured
aifoundry2, launched at 81 °C. The rises of the three coolest patterns are not resolved by the whole-degree sensor, which moves by at most one step during their runs (0.3 to 0.8 °C by the thermal network); see section 4. The pJ columns divide each run's mean power over the whole 7 s by the FLOP rate; the W column is the launch-temperature value.
The four findings, with every number
- The runs cluster by kind, tightly. Random normal draws 63.40 W with a run-to-run spread of 0.08 W over five different random matrices; zeros 38.29 ± 0.03 W; ones 46.73 ± 0.07 W. The rises of those three repeat to 0.03 °C (on aifoundry3 to 0.05 to 0.2 °C). They form three groups, 7 to 15 W apart on both cards (aifoundry2 and aifoundry3, 20–22 September): zeros alone, 2 W above idle; ones, π and the half-zero random matrix within a watt of each other (46 to 47 W, +1.7 to +1.8 °C); random uniform and random normal within about 2 W (61.3 against 63.4 W, a gap aifoundry2 resolves and aifoundry3 does not).
- Heating per FLOP follows power over idle, roughly, not total power. Just before each launch the idle card draws 36.3 W and the die is in balance. Averaged over the run, including the leakage its own heating adds, zeros add 2.0 W to that; the reading moves by at most one step, so the rise is only bounded (below about 1 °C; the recovered curve and the thermal network put it at 0.1 to 0.3 °C, 1 to 5 m°C per 10¹² FLOPs). Ones add 11.6 W: 27 m°C. Random normal adds 30.4 W: 76 m°C. (At the launch temperature the three add 2.0, 10.5 and 27.1 W; aifoundry3, idling at 25.1 W, adds 1.9, 9.7 and 24.9 W at its launch temperature and 2.0, 10.4 and 27.2 W over its runs: 21 and 70 m°C for ones and random normal.) The proportion is not exact: the ratio of the last two rises, 2.85, exceeds the ratio of the added watts, 2.63 (3.29 against 2.61 on aifoundry3), so random data heat 8% (aifoundry2) and 26% (aifoundry3) more per board watt than ones; section 4 compares the two run by run.
- In energy, averaged over the 7 s run, a FLOP costs 4.2 pJ of board energy on zeros, 5.2 pJ on ones and 7.3 pJ on random normal (3.0, 3.9 and 5.7 pJ on aifoundry3, whose idle is lower). Over the idle card those are 0.2, 1.3 and 3.3 pJ: the data decides a factor of 15 (14 on aifoundry3). The run average includes the leakage the run's own heating adds (66.7 W mean for random normal); at the launch temperature random normal is 63.4 W ÷ 9.18 TFLOPS = 6.9 pJ per FLOP (aifoundry3: 50.0 W, 5.4 pJ).
- Which bits are random matters. Random signs alone (±1) and random exponents alone cost about the same, 51.4 and 52.6 W; random mantissas alone 60.4 W, and all three together 63.4 W. One random operand with the other held at 1 costs 54.3 W when A is the random one and 57.9 W when B is. Section 3 shows why. The three-card check repeated these with four runs each on 26 September: the steps from ones to random signs, from signs to random mantissas and from mantissas to random normal held on aifoundry2 (+5.0, +8.8 and +3.0 W) and aifoundry3 (+4.8, +8.2 and +2.8 W) and read the same on aifoundry1-c1 (+5.1, +9.4 and +3.2 W), and B random cost 3.7, 3.4 and 3.8 W more than A random.
- The rails agree on where it goes. Late in the run random normal is 29.6 W above zeros on the board. The minion-core rail's own sensor accounts for 21.5 W of that and the SRAM and mesh rails for 1.0 W between them, about what a die 5 °C hotter adds to their leakage. The remaining 7 W is on no rail sensor, consistent with conversion loss in the regulators, which grows with the current. On aifoundry3 the same difference is 25.9 W: 20.5 W on the minion rail, 0.5 W on the SRAM and mesh rails, 4.9 W on no sensor.
2. Strict temperature control
Two things make temperature a confound on this card. Power at the same work rises with die temperature through leakage: about 0.8 W per °C on the board while a hot pattern runs, measured from the drift of power within the hot 7 s runs (82–86 °C; measured the same way on 26 September, 0.80 W/°C [0.59, 1.00] on aifoundry2 and 0.80 [0.75, 0.85] on aifoundry1-c1, but 0.38 [0.29, 0.48] on aifoundry3, whose runs start at 57 °C; over minutes of a long matmul the check's busy slope is steeper, 1.0 [0.7, 1.4] W/°C on aifoundry2 at 81 to 97 °C, 1.1 [1.0, 1.2] on aifoundry1-c1 and 0.6 [0.5, 0.7] on aifoundry3); the idle law's slope is 0.65 W/°C at 80 °C (section 8). And on aifoundry2 the firmware's clock governor has a 65 °C threshold: below it a busy card is clocked up to 800 MHz at 0.62 V, above it the card is held at 600 MHz and 0.52 V (section 6). So every run starts from the same thermal state, well above that threshold:
The protocol steps, the checks, and the sensor's quantisation
- Heat. If the die is below 84 °C, 2 s bursts of random-data matmul bring it there.
- Cool along the same curve. The card idles until the mean of the 34 minion-shire sensors first reads 80 °C. Approached from above, that reading is an edge, not a range: the kernel launches within a second of the 81→80 step.
- Run one pattern for 7 s, with 10 Hz telemetry throughout. Each process holds the card for under 10 s.
The control held (the checks are under Method): every sample read 600 MHz and 516–518 mV; at the launches the die was at °C in the sensor's units with W idle, and random normal repeated across the hour's five blocks to W and °C (standard deviations).
The limit that remains is the sensor: it reports whole degrees. A run's rise read off the sensor is good to about half a degree, so the rises in this report are de-quantised: for each run, one number (the heating power) is fitted so that the thermal network of section 4, started from the launch state and rounded like the sensor, reproduces the run's readings. The times at which the reading steps from one degree to the next carry the information. Power needs none of this: it reads in 10 mW steps.
3. From flips to watts
The power differences come mostly from the fused multiply-add units, eight per minion, one per vector lane: the minion
rail carries 73% of the difference between random data and zeros on aifoundry2 and 79% on aifoundry3. The
open RTL of this core family (core-et, Erbium branch at b38a1a3, a later configuration of the same Minion core
lineage) includes that unit (txfma_top, seven pipeline stages) and
the control around it. rtl-sim/fma_toggle runs eight copies under Verilator on the exact operand tiles the card
ran (the host dumps them), in the order the tensor state machine issues them: for each row of B, for each row of A, two
micro-ops of eight c = a·b + c; 512 micro-ops per op. Every result is checked: all 8,192 multiply-adds of two
random-data ops match software bit for bit. Three things in the RTL decide the activity:
- Zero gating. On an accumulate pass,
vpu_ctrl.vwithholds the valid bit from a lane whose A or B operand word is zero (ex_fma_gate_mask; the manual's pseudo-code says the same,if (a != 0 && b != 0)). The unit's pipeline registers are enabled by their stage's valid bit, so a gated lane clocks no register and flips no net. That is the zeros case: in the simulation nothing in the unit moves, and a zeros matmul costs only about 2 W over idle (aifoundry2 and aifoundry3, 20–22 September; 1.9, 0.8 and 1.2 W on aifoundry2, aifoundry3 and aifoundry1-c1 on 26 September). - Clocked registers. A valid multiply-add clocks about 600 register bits per lane on its way down the pipe, whether or not the data changed. That is what a constant costs: ones and π clock the registers and toggle almost nothing. (The checkerboard keeps a quarter of its lanes: a product needs both operands nonzero.)
- Data toggles. Random operands flip about 87 million counted nets per op, 85% of them in the multiplier tree (Booth encoders, carry-save adders, 4:2 compressors). Sign-only or exponent-only randomness leaves that tree still and moves only the exponent path, the aligner and the adder.
Counts per op, and the model's form
The table gives the counts per op for one minion, from the card's own tiles. The model is their weighted sum, with one non-negative energy per kind of event, fitted to the 14 measured powers:
board W = constant + e₁ · register bits clocked + e₂ · toggles in the multiplier tree + e₃ · toggles in the rest of the unit + e₄ · operand-word toggles outside the unit
Fitted coefficients (refit in section 8 — use those values)
Section 8 refits these energies on five hours of data; use its values for prediction.
All 31 patterns, broken down by kind of flip
The fit in detail: accuracy, clocking, and the odd orderings explained
- It fits to 0.3 W and predicts to 0.5 W on this session. Fitted to all 14 patterns the rms error is 0.32 W over a 25 W range. Refitted 14 times with one pattern left out, the left-out pattern is predicted to 0.50 W rms (the ticks above). The worst are zeros and random exponents (+0.9 W) and ternary (−0.8 W). Refitted on each card's runs of 26 September (the table's refit column: eight operand patterns and six structured matrices, four runs each), the same form fits to 0.69 to 0.76 W and predicts the left-out pattern to 0.9 to 1.0 W rms; the worst are the DFT pair (−2.4 to −2.6 W), random exponents (+1.4 to +1.6 W) and butterfly factors (+1.4 to +1.5 W).
- One energy per toggle does not work. With a single count of all net toggles the error is 2.1 W (2.5 W left out; on aifoundry3, refitted to its own eight patterns and each left out in turn, 2.4 W against 1.3 W for the split form): the multiplier tree holds 85% of the counted toggles of a random multiply and little of its energy. Counted separately, a toggle in the tree costs 0.03 fJ and one in the rest of the unit 0.8 fJ (0.03 to 0.04 and 0.56 to 0.60 fJ in each card's refit of 26 September). The count is of named RTL nets. The tree is thousands of one-bit compressor cells whose short local nets are each counted at two or three levels of the hierarchy; the rest of the unit is wide buses, shifters and pipeline registers driving long wires. At 0.52 V, 0.8 fJ per toggle is about 6 fF of switched capacitance (4 to 5 fF at the refits' values and each card's voltage).
- Clocking is the cost of a constant. 2.47 million register bits clocked per op at 2.96 fJ each is 8.2 W; ones measure 8.4 W over zeros (7.8 W on aifoundry3). The figure includes the clock network behind the registers and the write-back of each result, which scale with it.
- It explains the odd orderings. A random with B = 1 flips 38 million tree nets per op, and A = 1 with B random only 13 million, yet the second draws 3.6 W more (3.4 to 3.8 W on each of three cards on 26 September): it moves 10.1 million nets in the rest of the unit against 5.9 million, and twice as many operand-word bits. Random signs or exponents leave the tree still (under 0.4 million toggles) and cost 5 to 6 W over ones (random signs 4.8 to 5.1 W on three cards on 26 September), all of it in the rest of the unit. A half-zero random matrix gates three quarters of its multiply-adds and still costs within about a watt of ones (0.6 W less on aifoundry2, 0.3 W less on aifoundry3): by the model, because the quarter that runs is fully random.
A test made before the pattern had ever run
A first test before the fact is above. Six of the patterns were invented for this session, and their power was written
down before any of them had run on aifoundry2 under the power sampler
(docs/reports/data/2026-09-21-horace-aifoundry2/predictions_before.json, 06:50 on 21 September; the first of
them ran at 06:59). The predictions came from models fitted to the 20 September data, nine patterns with no single
random field and no single random operand among them, and from tiles drawn in software. The two model forms that split the
toggles were right to 1.3 W rms. The two that do not were wrong by 2.7 and 4.2 W, and by 7.3 W on the pattern that separates
them best. This comparison was then used to choose the model form, so it is not a clean test of the final model;
section 9's structured matrices, priced with the final form before they
ran, are.
4. From watts to degrees
The die's temperature follows power through a thermal network. A Foster chain (RC stages in series) with time constants fixed on a grid from 1.5 s to 1,000 s was fitted to the whole hour: board power in, sensor reading out, resistances held non-negative. On aifoundry2 two stages carry everything this session can see.
The network's stages, and how well it reproduces the hour
A watt added to the board raises the sensor by 0.10 °C within a couple of seconds (the 1.5 s stage, presumably die and spreader) and by another 0.12 °C over the next half minute (the 10 s stage, presumably package and heatsink base). That is 0.06 °C per W after 1 s, 0.12 after 3 s and 0.16 after 7 s; aifoundry3's own network, fitted the same way to its 13-minute session, needs more stages and gives 0.07 after 1 s and 0.18 after 7 s. The slower stages get nothing only because this protocol holds the hour's average power constant; the model of section 8, fitted to the long runs of section 7 (aifoundry2, one session), which do not, puts °C per W in stages of 60 s and longer ( °C per W in all). The in-sample residual over the hour is 0.28 °C rms, which is what rounding to whole degrees alone would leave (0.29 °C; aifoundry3's own network reaches 0.29 °C on its session too); driven by the measured power over five hours, section 8's model follows the sensor to 0.63 °C.
With both steps in hand, the chain runs from the RTL to the thermometer with no measurement of the run in between. For each run the network starts from the state the hour's measured power had left it in at launch. From there it is driven by the activity model's power for that pattern (from the fit that left that pattern out), plus 0.81 W for every degree the simulated die has gained: leakage, measured from the drift of power within the hot runs.
Activity-to-heating scatter, RTL alone
Three independent estimates of the heating power, compared
The ring uses no electrical measurement at all: it is the heating power recovered from the whole-degree steps alone (section 2). For the patterns that heat the die by more than a degree, this thermal estimate agrees with the electrical one to W rms, with a slope of between them (on aifoundry3, with its own network, 2.6 W rms and a slope of 0.93, the thermal estimate reading about a tenth low): the temperature rise is roughly proportional to the power, and the power follows the counted flips. Roughly: random data heat more per board watt than ones (section 1). The three coolest patterns, whose rise the sensor does not resolve, are left out.
5. Where the model is off, and why
- Most of the power is not flips of this computation. Of random normal's 63.4 W, 38.6 W is the model's constant: what the card draws at 80 °C with every multiply-add gated (each card's refit of 26 September puts it at 38.3 W on aifoundry2, 51.3 W on aifoundry1-c1 at the same temperature and 26.6 W on aifoundry3 at 55.8 °C). Idle is 36.3 W of it: leakage, always-on clocks, DDR, PCIe and regulator losses. The other 2 W is what a fully gated tensor op costs (the zeros of section 3); by the RTL, it is the 1,024 tensor state machines stepping through gated micro-ops.
- Register clocking is switching that the data does not control, except by being zero (section 3's constant). "Proportional to flips" holds only once clock edges delivered to registers count as flips.
- A counted toggle is not a fixed charge. The fitted energies differ 25-fold between the multiplier tree and the rest of the unit. RTL net counts stand in for capacitance only within blocks of similar structure; a netlist with extracted capacitances would replace three fitted numbers with none. The zero-delay simulation also has no glitches. Real carry-save trees glitch, more so on random data, and the fitted energies absorb the average.
- Leakage feeds back. On aifoundry2 (21 September) random normal reads 65.8 W in seconds 1 to 3 and 68.0 W in the last two seconds of the same run: + W as its own heating lifts the reading another °C between those windows ( °C over the whole run). The model's watts are at the launch temperature, and the chain adds 0.81 W per simulated degree. Without that term it would under-predict the hot patterns' rise by about a tenth.
- The sensor. One whole-degree number stands for the mean of 34 sensors. The launch temperature is known to a few tenths of a degree in absolute terms, the same for every run, which matters only for the three coolest patterns. The hot spots are the multiply-add units, not the sensors, so the junctions that leak are presumably hotter than the reading. The sensors' peak-hold high puts the hottest of the 34 at 2–4 °C above their mean at each rise (the spatial brief), but nothing on the card measures a junction inside a shire.
- Board power is not die power. Of the 7 W of random normal's excess that is on no rail sensor (section 1), by the later attribution (Limits of observability, §4.2) about 4.4 W of that is consistent with regulator delivery loss, which would never reach the die, and the rest is not attributed. The network was fitted to board power, so it absorbs whatever does not heat the die as fewer °C per W. It would not transfer to a workload that loads a different rail.
- What is left, on aifoundry2. Power: 0.5 W rms out of sample, 0.9 W at worst (section 3). Rise: 0.33 °C rms from the RTL alone against 0.30 °C from the measured power, both fit residuals of this session (aifoundry3, with its own refit and network: 0.35 against 0.32 °C). So almost all of the temperature error belongs to the thermal step and the sensor, not to the flips.
6. The speed effect on a cool die: a demonstration
This section is one card, aifoundry2, and seven runs on the morning of 21 September: two of zeros, two of ones and three of random normal, in two short sessions. On aifoundry2 the firmware's governor steps the clock down while the whole-degree die reading is above 65 °C or board power is above 65 W (its TDP setting, the board power limit), so it holds 600 MHz at 0.52 V on a hot die and lifts a cooler busy card to 700–800 MHz (The DVFS loop and its leakage, §1–§2). Every run on 20 September started above 72 °C, so the thermal test held 600 MHz throughout, even at 70 W. After the night of 20–21 September idle the die read 62 °C, and the same kernels behaved differently:
The seven runs, as a table and in words
- Zeros keep the fast clock for nearly the whole run (both runs): 800 MHz from about a second after launch for 5 to 6 s, at 39 W, with the die at 64 to 66 °C after 7 s. The governor only starts stepping down in the last second. 11.4 and 11.8 TFLOPS.
- Random normal loses it within a second. At 800 MHz and 0.62 V it draws up to 88 W for an instant, the die passes 65 °C in half a second, and the governor steps down to 700 and then 600 MHz. 9.3 TFLOPS in all three runs, at 55 W: the die is 15 °C cooler than in section 1, which is worth 10 W of leakage.
- Ones hover at the threshold (two runs): up to 800 MHz, down at 66 °C, up again as the die falls back to 65 °C. 9.7 TFLOPS.
So in these seven runs predictable data did run faster: 25% for zeros against random values, where Horace measured 15% on an A100. With two zeros runs against three random ones that is a demonstration, not an established effect, though the clock record shows the mechanism in every run. The reason is the one he gave: fewer flips, less power, and a governor that then allows a higher clock. Here the limit that bites first is thermal rather than electrical, and it only applies to a die that starts below 65 °C. A card that has been busy idles above that (72 °C on 20 September; the runs of section 1 were held at 80 °C), runs everything at 600 MHz, and shows the effect as heat instead of speed. Nor are the seven runs a controlled experiment: their start temperatures differ by up to 2 °C, and a die that has just run does not return to 62 °C for hours. aifoundry3 cannot show the effect at all (its clock is pinned: section 10). Nor can aifoundry1-c1, although it has aifoundry2's governor settings (65 W, 65 °C): its governor does not raise the clock. The three-card check ran it cool, busy and under 65 W in 9,461 samples (die at 64 °C or less, board at 45–65 W), where aifoundry2's governor steps up, and it read 600 MHz in all 318,667, as did the service processor's own minimum and maximum of the clock, which a statistics reset does not clear.
7. Minutes instead of seconds
Seven seconds show the first two stages of the heating. To see the rest, the same patterns ran on aifoundry2 as single processes for up to ten minutes each, in one session on 21 September, from the same start: heat to 84 °C if below, idle until the sensor first reads 80 °C, launch. Most configurations ran once; the counts are given below. A run ends early when the die's mean reading reaches 90 °C, which keeps it inside what this card had already seen (on 20 September the mean reading had reached 90 °C and the hottest sensor 93 °C, at up to 70 W; the three-card check of 26 September later held it at a mean of up to 103 °C with nothing on the card acting: Power and temperature, §2). 29 runs took four hours, because after a hot run the die needs up to seven minutes to get back to 80 °C. Some runs used fewer minions per shire, which scales the flip rate without changing the flips themselves (and the switching power only roughly in proportion: per active minion it is about 5% higher on 1,024 minions than on 256 in the ablation session of 21 September, and 9, 24 and 25% higher on aifoundry2, aifoundry3 and aifoundry1-c1 in the three-card check of 26 September).
Every long run, as a table
One row per run, aifoundry2, 21 September. The first run (zeros, at the start of the session, with no telemetry before it to set the model's state) and the last two (after the cooling changed) are not in the fit. For runs stopped at the cap, the measured end is the 90 °C reading that stopped them; for ten-minute runs it is the mean reading over the last few seconds.
All five findings, run by run, with every number
- At full load only zeros hold a steady temperature. Random normal reaches 90 °C in 19 to 26 s (four runs); in one run each, random uniform in 22 s, random mantissas in 24 s, random signs in 53 s, π in 104 s and the half-zero random matrix in 107 s. Ones take 107 to 167 s (three runs). Zeros (three runs) cool the die to 76 to 78 °C over ten minutes, by the model because the heatsink is still shedding the heat of the run before. The checkerboard and the 75%-zero random matrix (one run each in the fit) last the ten minutes but are at 87 °C and rising.
- Fewer minions buy time, far more than in proportion (one run at each count, two at 256). Removing a quarter of the flips (768 minions) stretches random normal from 19–26 s to 35 s; removing half (512 minions) to 84 s; three quarters (256 minions) to 276 and 315 s, more than ten times as long; on 128 minions it sits at 81 to 82 °C for the whole ten minutes. Near the flip budget of section 8, each watt removed buys more time than the last.
- Equal flip power, similar curves. By the flip counts of section 3, ones on all 1,024 minions switch 10.7 W and random normal on 384 minions 10.2 W. The first is all register clocking, the second mostly data toggles, and the times are consistent with equal heating: 107 to 167 s for ones (three runs) against 119 s for random normal on 384 minions (one run), with curves that overlap in the chart above.
- The same pattern does not always take the same time. Ones needed 107 s after a hot predecessor (one run) and 162 to 167 s after a ten-minute zeros run (two runs). Every run starts at the same die reading, but the heatsink behind it does not start in the same state, and over minutes that matters. The model below carries that state.
- During the 28th run, a single event, the card's cooling changed abruptly: under an unchanged workload (42.7 W at 84 °C, falling to 35.6 W as it cooled) the die fell from 84 to 72 °C in four minutes; presumably something changed the airflow in the lab. That run and the one after it are in the chart but not in the fits.
8. A model from flips to temperature
With the long runs the chain of sections 3 and 4 closes into one model that needs only the flip schedule. It is aifoundry2's model, fitted to that card's sessions of 21 September, and it has three lines:
The three-line model: equations, fitted energies, thermal stages, and how it was fitted
Four kinds of flip
| kind of flip | value | per |
|---|---|---|
| register clocking | 3.18 fJ | register bit clocked |
| multiplier tree | 0.025 fJ | net toggle in the tree |
| rest of the unit | 0.80 fJ | other net toggle |
| operand words | 15.5 fJ | operand-word bit toggled outside the unit |
| time constant | |
|---|---|
| 1.5 s | 0.106 |
| 4 s | 0.050 |
| 60 s | 0.234 |
| 150 s | 0.136 |
| 400 s | 0.860 |
| 2,500 s | 0.081 |
| sum | 1.47 |
It was fitted in three stages to every 10 Hz sample of five hours of aifoundry2's sessions of 21 September: the leakage to the idle samples (64–67 and 81–88 °C, none between; not re-tested, since the three-card check's long idle passes were not run), the flip energies to the busy samples, then the thermal network of section 4 with its slow stages now visible, the slowest pinned by one reading, 62 °C at 26.7 W, where this card had settled after the night of 20–21 September. The idle samples fix the leakage's slope, 0.65 W per °C at 80 °C, but not how idle power splits between the fixed part and the exponential: a temperature scale from 30 to 45 °C (36 °C above) fits as well, with 20 to 29 W of leakage at 80 °C. The flip energies are close to section 3's, and are the ones the predictor and the energy manual use. Each stage's residual and the controls on overfitting are in the knowledge base's thermal-model file.
Leakage against temperature, and degrees added per kind of flip
Leakage is what makes temperature so sensitive to flips here, whatever its share of the 36 W idle (above). Each degree adds W at 80 °C, and each watt adds °C through the network after ten minutes, °C once settled (the idle law's slope; section 2 sets it beside the busy drift). Closed on itself, that loop has a gain of at 80 °C: a watt of switching held for ten minutes raises the die by °C, not , and the gain passes one at 82 °C. The table turns that into degrees per kind of flip for the random fp32 matmul.
How well the model fits, and predicts, out of sample
How well it fits. For each long run the network is started in the state the measured history had left it in at launch, and then driven by the power line above, with the run's flip rates and its own simulated temperature; nothing measured during the run goes in. The dashed lines in the chart of section 7 are these curves. For the 19 runs that reached 90 °C the time is off by 12% in the median (23 s for 26 s measured, 122 for 119, 326 for 315); the worst is the half-zero random matrix, 157 s for 107 s. These are fit numbers: the network and the leakage were estimated from the same session.
How well it predicts. So every parameter was fitted again on the first 7,400 s of the long session (15 runs, plus
the 7-second session of section 2) and frozen, and the 12 later runs were predicted. Nothing is fitted on the held-out part:
the thermal state at each launch comes from an observer that has seen the telemetry up to that launch only
(tools/ettelem/validate_flip_model.py). The held-out runs include four patterns and two minion counts that the
thermal fit had never seen.
- Up to a few minutes it predicts as well as it fits: for the seven held-out runs that reached 90 °C the median error is 9% and the worst 23% (ones, 199 s for 162 s); six of the seven are within 20%.
- At ten minutes it runs hot, by 3.6 to 5.2 °C on the four runs near the flip budget (zeros +0.7 °C; 3.8 °C rms against 2.5 °C in the fit), and, as in the fit, it has the same two runs reaching 90 °C, now earlier (437 and 469 s), when they ended at 87 and 88 °C.
- The slow stages are not pinned down. Between the half fit and the full fit the fast stages and the leakage barely move (0.10 and 0.05 °C/W at 1.5 and 4 s in both; 24.4 against 23.3 W of leakage at 80 °C), but the slow resistance moves between stages: 0.60 → 0.86 °C/W at 400 s, 0.38 → 0 at 1,000 s and 0 → 0.08 at 2,500 s (the table lists only the stages the full fit kept); the operand-word energy goes from 20 to 15.5 fJ. The telemetry is 140,000 samples but only 27 runs; that is the number that counts for the slow stages. The overnight idle point that anchors them is a single measurement, assumed to share this session's ambient.
- What does not work at all is letting the model run free for the whole four hours: with a loop gain of 0.95, a 1% error in leakage grows into degrees, and the simulated die drifts away within the hour. The model predicts minutes ahead from a known state.
Two more validation charts: the whole session, and predicted against measured run by run
The flip budget of this card. Setting the heat line to its steady state gives the curve above: for each switching power, the temperature at which the die would settle (solid) and the temperature above which it runs away (dashed). The two meet at +3.1 W of switching (2.6 W by the model fitted to the first half of the session), with the die at 82 °C: beyond that there is no equilibrium on this card's cooling, only a time to 90 °C. Single long runs agree: 2.7 W (ones on 256 minions) cooled, 3.4 W (random on 128 minions) sat at 81 to 82 °C for ten minutes, 4.2 W (the checkerboard) crept to 87 °C. In flips, 3.1 W is about 10¹⁵ clocked register bits per second, or a full-load random matmul 11% of the time.
The budget belongs to this card, this desktop chassis and that day's room. The model's ambient is 22.8 °C, and every degree warmer takes 0.68 W off the budget. On 22 September the same card idled at 73 °C instead. By these equations that is a room about 3.5 °C warmer, or airflow worse by the same measure, and a budget of 0.3 to 0.7 W; the ambient slider of the pricer in section 9 redraws the chart above for any room. Whether the flip energies belong to the chip design is the question of section 10: on three cards they carry over up to one scale factor per card, which the check could not separate from the die temperature. The idle law does not carry over: aifoundry1-c1 idles 7.6 to 13.4 W above it.
9. Custom workloads: structured matrices
A predictor for custom workloads. tools/ettelem/predict_heat.py wraps the three lines of
section 8: give it the A and B tiles of a workload (or a pattern name), the
number of active minions and a start temperature, and it replays the tiles through the RTL, counts the flips, and prints the
switching watts by kind of flip, the board power, the temperature after 10 s, 1 min and 10 min, the time to a cap, and the
duty cycle that would hold the start temperature. The matrices below test it.
How the structured matrices were made, and when the predictions were written down
The point of the model is to price a workload before running it. tools/ettelem/make_tiles.py generates
structured 16×16 operand pairs: Hadamard and DCT matrices, the cosine and sine halves of a DFT, butterfly factors and their
dense kaleidoscope products (the family that generalises the fast Fourier transform), identity, banded, block-diagonal,
triangular, rank-1, circulant and 4-bit quantised matrices, a weights-times-ReLU pair, and a matrix of negative zeros. Their
tiles went through the RTL bench and the three lines of section 8, and the
predictions were written down at 13:08 on 21 September
(docs/reports/data/2026-09-21-horace-aifoundry2/structured_predictions_before.json), before any of them had run.
Fourteen then ran twice each under the strict protocol of section 2.
All fourteen structured matrices, as a table
The last column is the raw whole-degree reading at the end of the run minus the launch temperature, not de-quantised like section 1's rises; differences under a degree are not resolved.
- Predicted to 0.9 W rms over a 25 W range, and ten of the fourteen to within 0.6 W (eleven within 0.75 W), from the tiles alone (aifoundry2, 21 September, two runs each). The three-card check re-ran six of them on 26 September, four runs each. On aifoundry2 Hadamard, butterfly and kaleidoscope came within 0.5 W of their first values (−0.1, 0.0 and −0.5 W), though four runs are too few to confirm Hadamard and kaleidoscope to the registered ±1 W; on aifoundry3 they read 0.6 to 1.2 W below the model scaled by 0.924, that card's factor of 22 September (the registered test).
- Structure in the values buys nothing. Kaleidoscope products, the DCT, circulant and rank-1 matrices are dense, and they cost what random normal costs (63 to 64 W): their mantissa bits are just as busy. Re-run on three cards, kaleidoscope products again cost what random normal costs: 63.5 against 63.6 W on aifoundry2, 50.3 against 50.4 W on aifoundry3 and 77.8 against 77.9 W on aifoundry1-c1. The Hadamard matrix costs 50 W, close to random signs (1.8 to 2.1 W below them on each of the three cards): only the sign and the adder move.
- Structure in the zeros buys a lot. A pair of butterfly factors (two nonzeros per row, so 64 of 4,096 products survive the gating) costs 39.3 W, the identity 38.5 W, tridiagonal 40.2 W, 4×4 blocks 41.1 W, upper-triangular 44.4 W (the butterfly pair, re-run on three cards, costs 1.0, 0.9 and 1.0 W more than zeros on aifoundry2, aifoundry3 and aifoundry1-c1). The ReLU pair, random weights times half-zero activations, gates half its products and saves 11 of random data's 27.6 W over idle (random normal was rerun in the same 7 s session as the structured matrices; re-run on three cards, it saves 10.9 of 27.2 W on aifoundry2, 10.4 of 24.7 W on aifoundry3 and 11.5 of 27.8 W on aifoundry1-c1).
- Negative zero is not zero. The gating looks for the all-zero bit pattern, so a matrix of −0.0 clocks every register: 46.7 W, the same as ones, against 38.2 W for +0.0 (also rerun in that session). The model said 47.2 W. On 26 September −0.0 cost 8.4, 8.1 and 8.9 W more than +0.0 on aifoundry2, aifoundry3 and aifoundry1-c1, and within 0.2 W of ones on each; four runs confirm the equality with ones to ±1 W on aifoundry2 only (the intervals on the other two reach −1.1 and −1.4 W). In practice: mask with a select, not by multiplying by zero, because x · 0 is −0.0 for every negative x.
- The worst miss is the DFT pair, 2.8 W low, and it repeats: re-run on 26 September it read 2.7 W above the model on aifoundry2, 2.5 W above it on aifoundry1-c1 and 1.7 W above the model scaled by that 0.924 on aifoundry3. Its products cancel almost exactly; why that costs more than the counted toggles say is not known (glitching in near-cancelling sums, which a zero-delay simulation cannot see, is one candidate).
And the heat, not just the watts. Six of the structured matrices, with ones and random normal as references, then ran as long runs, one run each, in a separate afternoon session on aifoundry2 (section 7's protocol), with the model frozen as fitted that morning, before they existed on the card. Nothing was fitted on that session: the thermal state at each launch comes from the observer of section 8, from telemetry before the launch only. (The ones run opened the session, so the observer had fewer than three minutes of telemetry before it; it is not in the table.)
The six long runs, as a table
Four of the six times to 90 °C are within 3%, and the five-minute run's end temperature is off by 0.2 °C. The DFT pair is wrong by two thirds, because its watts are: 2.8 W missing out of 13 W of switching costs 47 s on a die this close to runaway. The ReLU pair is a third slow for a 1.2 W miss. Near the card's flip budget the time to a cap is a sensitive function of power, so a watt of model error matters; at full random load it does not (19.5 s predicted, 19.1 s measured). With the first-half model of section 8 instead, the same six come out at 7% in the median and 65% for the DFT pair.
Price a workload: an interactive flips → watts → degrees calculator
Price a workload: flips → watts → degrees
The same three lines, run in this page: choose a workload, how many minions run it, the die temperature at launch and the room. Left, its switching watts by kind of flip (section 8's energies); right, the die temperature it would reach from an idle die at the launch temperature. Where a measured long run of that workload exists, its sensor reading is drawn too.
On aifoundry2's held-out runs (one session): time to 90 °C % median error, % worst; ten-minute end temperatures 3.6–5.2 °C too hot near the budget; from a generic idle start it runs slow when the heatsink was left hot by the run before (section 7).
10. Other cards, and what transfers
Everything to this point is aifoundry2's card. Two more cards have run the same 7 s protocol. aifoundry3's ran it on 22 September, in one 13-minute session; on 26 September the three-card check re-ran eight of the operand patterns, four runs each, on aifoundry2, aifoundry3 and card 1 of aifoundry1 (aifoundry1-c1; card 0 was left out because its cooling could not hold a load then; its broken fan was replaced on 2 October). The two newcomers differ from aifoundry2 in useful ways. aifoundry3 idles cool (51 °C before its first session, against aifoundry2's 62 to 73 °C), too cool to hold at 80 °C between runs, so its runs launch at 55 to 58 °C; and it stays pinned at 600 MHz, because a boot service sets its TDP to 0 W at every boot, so the governor can only step down (The ET-SoC-1's DVFS loop, and the leakage). aifoundry1-c1 launches at aifoundry2's 80 °C, but runs older firmware (1.2.0 against 1.3.1), holds its minions at 498 mV under load against aifoundry2's 517 mV, and idles at 50 W against 36 W. Different silicon, heatsinks and firmware, with coefficients fitted entirely on aifoundry2, make this the strongest out-of-sample test of the power model.
The card, or its temperature? aifoundry3's factor could come from its silicon, package or regulator, or from the 23 °C cooler die its runs start from. The check tested this directly (V3-X5): each card ran fp32 uniform and random data at two launch temperatures about 7 °C apart (aifoundry2 at 83 and 77 °C, aifoundry1-c1 at 83 and 76 °C, aifoundry3 at 65 and 58 °C), three runs of each, and asked whether the switching power is the same at both, within ±0.5 W. On none of the three cards could that be shown, and the test did not find the cause either. On random normal the hotter launch switched more on aifoundry2, +1.2 W [+0.3, +2.1], and on aifoundry3, +2.0 W [+1.5, +2.5], as a temperature effect would; computed with each run's own launch temperature instead of the arm's registered one (a check that was not registered), both shrink to +0.7 W, with intervals that include zero. Uniform data could not be read on any card, nor anything on aifoundry1-c1: the idle power measured in the two seconds before a run, which is subtracted from it, moved. Uniform data ran first in every arm, straight after the preheat, and in the hot arms the preheat inflated the idle reading before it: 41 to 51 W on aifoundry2 and 37 to 39 W on aifoundry3, against 38 to 39 W and 29 to 34 W before their other hot runs. Hot uniform data therefore read 7 W lower than cool on both cards, which says nothing about the data; this, not the physics, is what failed the uniform half of the test. On aifoundry1-c1 the idle before a run ranged from 46 to 69 W over both arms, and its switching values scatter by up to 11 W, some below zero. The registered verdict is "not separated". A second test of the same question, on the energy catalogue (V3-CAT), found per-event energies rising with die temperature on both cards it was registered for, 0.48 %/°C [0.07, 0.90] on aifoundry2 and 0.30 %/°C [0.18, 0.42] on aifoundry3; and aifoundry1-c1, at aifoundry2's temperature, needs almost no factor. Temperature contributes, but how much of aifoundry3's deficit (10% below aifoundry2 in the same check) it accounts for is not established. Most of that 10% is the reduction, not the card (post-data note C2): the registered values move each run's power to a fixed reference (80.9 °C; 55.8 °C for aifoundry3) but subtract idle read at the run's actual launch (whole-degree readings averaging 80.2, 57.4 and 80.0 °C on these patterns). The references are thermal-model temperatures at launches made on a downward step of the reading, so the die at these launches was at the reading or up to 0.96 °C above it, and the reading cannot say which; over that range, at the same die temperature aifoundry3 switches 0.958–0.969 of aifoundry2 (3–4% less; aifoundry1-c1 1.004 against 1.009 registered), as the energy catalogue's independent ratio, 0.972, found.
The two-temperature test, drawn. Each card launched the same patterns at two temperatures about 7 °C apart.
The operating point does not explain aifoundry3's factor, and points the other way: under load it holds its minions at
522 mV against aifoundry2's 517 mV at the same 600 MHz, which by
The idle law transfers only in part. Fitted to aifoundry2's idle readings (section 8) and extrapolated 7 to 14 °C below that onto aifoundry3, which idled at 50 to 57 °C in its first session, it predicted that card's idle power to (the mean of the four temperature bins below) out of 25 W; over that card's 16 sessions the offset was +0.6 W on average (the DVFS report, §5). The offset depends on the split between fixed power and leakage, which the idle data leave open (section 8): across the splits that fit, that session's is 0.2 to 1.2 W.
The idle-power comparison, as a table
aifoundry3's first session, 22 September. The °C row is samples from the first s of the session, before any launch. With the idle rule the model was fitted with (samples at least 4.5 s from any launch, 600 MHz, 3 s smoothing, bins of 30 samples or more) only °C remain and the mean offset is W.
The check's idle cycles of 26 September (V3-IDLE: each card heated, then left to cool, three times) do not bear out a constant offset. aifoundry3 idles 0.7 to 0.8 W above the law from 54 to 67 °C and 1.8 W above it at 84 °C, 1.01 W [0.95, 1.07] over its bins, so the +0.6 W does not hold over that range. aifoundry1-c1, on its older firmware, idles 7.6 to 13.4 W above the law from 56 to 81 °C: the law does not describe it at all. aifoundry2 itself stayed within 0.1 W of its law from 68 to 82 °C.
Idle power minus aifoundry2's idle law, W, at every fifth whole degree each card visited (and its coolest and hottest), the mean over its cycles (the count in brackets); the last row is each card's mean over all its bins with its 99% interval. 26 September, three cycles per card (V3-IDLE items IDLE-a and IDLE-b).
What this means if you have more than one of these cards. The shape of the data-dependence — which operand patterns cost what, relative to each other — held on all three cards: the check's registered steps (ones over zeros, random over zeros, section 1's bit-field ladder and operand order) held on aifoundry2 and aifoundry3 and read within 1.4 W of aifoundry2's on aifoundry1-c1. The absolute scale (0.88 to 0.99 here as registered, 0.93 to 1.00 at the same die temperature over both readings above) and the idle power (25.8 to 50.1 W under these runs) belong to the card at its temperature. A single random-data matmul on a new card, at the temperature it will run at, calibrates the scale (to 0.8 W rms on the other patterns here), and its idle must be measured, because the idle law does not transfer; after that the power predictions of sections 3 and 9 apply to it. The heat predictions also need that card's own thermal network, fitted from long runs on it: aifoundry2's comes from one card in one chassis, and aifoundry3's own fit to its 13-minute session already needs more stages; no other card's cooling over minutes was measured.
11. Method
Method: protocol, evidence, kernel, telemetry, firmware, reproduce, data locations, and version history
- Evidence: sections 1 to 9 rest on aifoundry2's card, one session per experiment; section 10 repeats the 7 s runs on aifoundry3 (22 September) and, in the three-card check of 26 September, on aifoundry2, aifoundry3 and aifoundry1-c1 (V3-ABL-A: the operand patterns, structured matrices, precisions and minion counts, four runs each per card, each card's runs reduced as registered; V3-X5, the temperature arm; V3-IDLE, the idle cycles). The text says where a result holds on every card measured, gives each card's value where they differ, and gives the number of runs wherever it is fewer than three. The tests and intervals behind each statement are in the claims-check record.
- Protocol and checks on aifoundry2 (section 2): four burn-in cycles come first so that the heatsink reaches its periodic state. Patterns then run in shuffled blocks, one run of each per block, and the random patterns get new random tiles in every block: 46 measured runs and 4 burn-in cycles in 58 minutes. Heating and cooling to the launch point took 12 to 120 s (median 63 s), depending on what had run before. Every sample of every run reads 600 MHz and 516 to 518 mV on the die. The thermal network of section 4 puts the die at 80.96 °C (in the sensor's units) at the 46 launch instants, with a spread of 0.11 °C; idle power in the two seconds before launch was 36.29 W with a spread of 0.06 W. No drift over the hour: by block, random normal read 63.38, 63.42, 63.46, 63.25 and 63.49 W and rose 5.16, 5.16, 5.10, 5.15 and 5.17 °C; zeros read 38.25 to 38.32 W in all five. aifoundry3's session (section 10): 20 runs in three blocks in 13 minutes, launched at 55.8 °C. The check of 26 September reduced aifoundry2's and aifoundry1-c1's runs to 80.9 °C with 0.81 W/°C, and aifoundry3's to 55.8 °C with 0.55 W/°C although they launched at a 57.4 °C reading (its idle had risen to 55–57 °C after the host changes of 25 September; amendment A5 of the plan kept the reduction). Because the idle subtracted from each run is read at its actual launch, every card's switching values are off by the leakage slope times the gap between the die temperature at launch and the reference (post-data note C2). The die reading is in whole degrees: if each launch came on a downward step of it, as the references' launches did (die = reading + 0.96 °C), over the check's ablation runs aifoundry2's values read 0.15 W low, aifoundry1-c1's 0.05 W low and aifoundry3's 1.43 W low; if the reading is the die temperature, 0.62 W high, 0.73 W high and 0.91 W low. Section 10 gives the registered values and both readings.
- Kernel: hart 0 (the first of each minion's two hardware threads) of each of 1,024 minions repeats
TensorFMA32on one 16×16×16 tile pair held in the L1 scratchpad (4,096 multiply-adds per op, 546 cycles per op for every pattern). FLOPs count one multiply and one add per multiply-add; the rate includes the gaps between launches. - Telemetry:
tools/ettelemsamples board power (10 mW steps; while it samples at 10 Hz a new value arrives about every 156 ms on aifoundry2, 158 ms on aifoundry1-c1 and 263 ms on aifoundry3, where a slower single-command poll sees one every 224 ms: three passes per card, 26 September), the rail averages, the mean minion-shire temperature (whole degrees), clock and core voltage at 10 Hz. - Firmware: the governor of section 6 was read in the et-platform
source at
353f20e(thermal_pwr_mgmt.c); the cards' own trace strings match an older build (before et-platform commit60b40c10f, 24 September 2024). The cards' own build (BL2 0.20.0 of release 1.3.1, et-platformffca4cbb4) was read on 27 September: its thermal response is a blocking loop of steps about 0.4 s apart that also acts on an idle card, and a climb goes to the top point in one call (the DVFS report). - Power "at 80 °C": the mean over seconds 1–3 of a run, moved to the start temperature with the measured leakage slope and the temperature in that window. The correction is below 0.5 W for the cool patterns and about 2.4 W for random data (2.1 W in aifoundry2's repeat of 26 September, whose nine precision and data patterns matched the 21 September ablation session's within 2%).
- RTL activity:
rtl-sim/fma_toggle(its README lists what is and is not modelled). Counts are per op and per minion, averaged over the seeds the card ran and over two points of a launch (accumulators after 10³ and 4×10⁵ ops). - Thermal network: a Foster chain with fixed time constants and non-negative resistances, fitted by least squares to the whole session (board power in, sensor reading out), skipping the first 3 minutes.
- Long runs: one process per run with the host's
--budgetraised and--stop-fileas the cap: the runner touches the file when the sensor reads 90 °C (or board power 73 W, or telemetry goes stale) and the host stops between two 0.5 s launches. The 10-second etiquette limit was waived by the card's user for these sessions; between runs the runner waits while anyone else has the card open. - Flips-to-temperature model:
tools/ettelem/flip_thermal_model.py, fitted to the long session up to the cooling change, the strict session and the idle samples of the cool starts, with the overnight idle point as the anchor for the slowest stage (section 8). Per-run predictions start from the network state that the measured power history leaves at launch.tools/ettelem/validate_flip_model.pytests a frozen model on sessions or parts of sessions it was not fitted to, fitting nothing: it estimates the state at each launch causally and reports predicted against measured. - Predictor:
tools/ettelem/predict_heat.pyprices tiles (--tiles, replayed through the RTL bench, which needs Verilator:make -C rtl-sim/fma_toggle) or a committed pattern (--pattern) from a die at exactly 80.0 °C with a generic idle history, so it reads a little slow against section 9's launch-state predictions (kaleidoscope: 22 s from 80.9 °C, against 20 s predicted and 19 s measured). - Results are not checked for these patterns (random sums are not exact); the same kernel is checked exactly in its integer mode, and the RTL bench checks every multiply-add against software.
tools/ettelem/finish_horace.sh # every analysis, the model, the GIFs and both pages from the committed data; no card;
# needs node and mathjax-full (npm ci at the repo root)
python3 tools/ettelem/predict_heat.py --model docs/reports/data/2026-09-21-horace-aifoundry2/model.json \
--toggles docs/reports/data/2026-09-21-horace-aifoundry2/toggles_all.json --pattern randn
The commands that acquired each session on the card (strict runs, cool starts, long runs, ablations, the second card) are in the experiment register, sessions E9–E20.
Raw data: docs/reports/data/2026-09-21-horace-aifoundry2/ (runs, start records, compacted 10 Hz
telemetry, the operand tiles, activity counts, analyses, the model, its predictions made before the runs). The two earlier versions of this experiment (20 September: an
uncontrolled run, then runs each started at 80 °C) are in docs/reports/data/2026-09-20-power-aifoundry2/;
over the same seconds 1–3 the 80 °C-start runs agree with these to within 0.4 W, and the uncontrolled run only after
correcting for its hotter die. Section 10:
docs/reports/data/2026-09-22-horace-aifoundry3/ (runs, starts, telemetry, tiles; cards.json, and
transfer.json and leakage_crosscard.json, written by tools/ettelem/transfer_cards.py).
Versions. 20 September: uncontrolled and 80 °C-start runs, which said the clock never moves (corrected in section 6). 21 September: strict protocol, RTL model, cool starts, long runs, structured matrices. 22 September: second card. 25 September: version 3, every claim checked against both cards (the cool-die speed effect a demonstration of seven runs; the leakage split a range). 26 September (version 4), the three-card check: section 10 rebuilt on three cards; the DFT pair's explanation withdrawn; the out-of-sample error on the check's patterns, 0.9 to 1.0 W, set beside 0.5 W; post-data note C2's two readings of the launch temperature. 27 September: the review's fixes (aifoundry3's clock set by a boot service, not its firmware) and charts. 28 September: aifoundry1-c1's governor never raised the clock; the idle law's 0.20 W rms is per sample; later, the review's cuts (the model's fit details now in the knowledge base). What each version changed in full: this page's history in the repository and 04-artifacts.md (A4).
12. Related reports
- Why is the ET-SoC-1 low power? — uses this model to split the card's watts term by term, and compares the energy per FLOP with an A100's.
- Sparsity on the ET-SoC-1 — the first sign, in two runs on 18 September on aifoundry3: power above idle falling from 17.3 to 2.4 W as A goes to zeros, with no cycles saved (re-measured on three cards on 26 September: 17.5 to 2.5 W on aifoundry2, 15.5 to 1.0 W on aifoundry3 and 17.3 to 1.4 W on aifoundry1-c1, savings of 86, 93 and 92%).
- The ET-SoC-1 energy manual — the flip energies of section 8 (its §3.2) and the idle law (§1) as tables, beside every other event energy.
- The DVFS loop and its leakage — the governor behind section 6, and why aifoundry3 never leaves 600 MHz.
- Power and temperature on the ET-SoC-1 card — the telemetry client used here, and the first thermal measurements.