GitHub ↗

Multiprocessors on the Grid VM: four scenarios

Four concrete ways to put more than one control unit on the 1 µm byte grid — a message-passing multicore, a SIMT lane array, a systolic coprocessor, and a static SPMD replica machine — judged for physical realism, scorability and expressivity, with animated examples of a parallel reduction and a parallel matrix multiply. Companion to The Grid VM: competition design. September 7, 2026.

1. The brief, and how this note was produced

The single-core machine is settled: a 2-D grid of byte cells at 1 µm pitch, one sequential control unit at the origin, 1 fJ for every byte moved one micron, signals at c/160, and three serial tapes carrying input, output and instructions. The design report shows what that machine leaves on the table: its sequential-time leaderboard measures tier-3 MNIST training in days, and the I/O-order note already remarked that nothing in the model rewards parallelism. The question here is how to add more than one control unit realistically — anchored to what silicon actually does and free of free lunches — while keeping the grid model: cells, distances, tapes, and cost as a static property of the submitted schedule.

Provenance. This note synthesizes a multi-agent design run of September 6–7, 2026: six independent designs from six architectural angles (a PECM-faithful shared grid, a tiled message-passing multicore, a SIMT lane array, a systolic mesh, an explicit memory hierarchy, and a minimal static-SPMD delta), each attacked by three adversarial reviewers (physical realism, scorability and exploits, expressivity and algorithm fit) who re-derived the designs' numbers independently; a synthesis into four scenarios; two skeptics instructed to refute the synthesis; and a revision. Twenty findings recurred across designs and were resolved once, the same way, for all four scenarios (§4). The animations in §11 are driven by event-level schedules whose energy and makespan counters were cross-checked against an independent Python simulator. Where a reviewer's recomputation overturned a design's number, the reviewer's value is used and the change is noted.

2. The settled single-core machine

Every scenario below must reduce to this machine at P = 1. The constants are the ones the competition design fixed; the multiprocessor extensions add to them and never change them.

QuantityValueReading
Cellone byte at a lattice site, 1 µm pitchbytes in nodes; multi-byte values are adjacent cells, little-endian
Movement1 fJ per byte per micron of Manhattan paththe only priced quantity; arithmetic is free (Dally: a 32-bit add is 20 fJ against 1.9 pJ to move its operands 1 mm)
Propagationc/160 = 1,874 µm/ns0.53 ns per millimetre (Dally's global-wire figure is 0.4 ns/mm, i.e. c/120)
Issue1 ns per instruction, no overlap with flight (time v1)decision D4; the critical-path reading is a separate division
Tapesinput at (−1,0), output at (1,0), instructions at (0,−1); memory above the originserial, data-independent order, blocking receive only; each byte crossing pays 1 µm plus Ein = Eout ≈ 5,000 fJ
Fetch4 fJ per static line + 1 fJ per issued instruction (schedule track)a loop buffer amortising fetch; unpriced instruction text is free ROM
Writesfree in v1 (D2)the write of one op is the read of the next; the constant absorbs the round trip
Areaorigin-anchored bounding square of touched cells, µm²union over mode arms
Languagerungs (a)–(e): straight-line, affine loops, static recursion, bijective index maps, modescost is execution-free: closed-form lattice sums, worst arm for modes

Two consequences of these constants drive everything that follows. First, a working set of W bytes costs about √W per access, so the energy of a sweep is ≈ T·√W: distributing W over P cores cuts the mean distance by √P. Second, at 1 B/ns a tape delivers 220 bytes in 1.05 ms whatever the core count, while one core consumes them at 2 ns per byte (recv + add): a second core doubles throughput and a third does nothing. Both facts are physics, not artefacts, but the second one hides an unstated calibration (one byte per nanosecond is a single wire at 1 GHz, not a memory interface), and §4 says what to do about it.

3. What the sources say

Dally: a parallel model with a distance function

Dally's CACM point [1] is usually read as an argument about single-processor cost, but the model it proposes is explicitly parallel. His PECM (parallel explicit communication model) is PRAM with two changes: arithmetic stays unit cost, and “each processing element and each memory is assigned a location l ∈ L and a distance function D: L×L ⇒ R is defined to determine the cost of sending a message or making a memory access between two locations,” with 2-D Manhattan distance for on-chip communication and extra distance when a coordinate crosses a chip boundary. Multiple PEs at locations are native to it; the settled Grid VM is its P = 1 case with the distance function made literal.

His numbers, verbatim: a 32-bit add is 20 fJ and 150 ps; moving its two operands 1 mm is 1.9 pJ and 400 ps; 40 mm corner to corner on a 400 mm² chip is 77 pJ and 16 ns; going off chip is 320 pJ per 64 bits with 6 ns per metre. On-chip SRAM is built from 8 KB sub-arrays: 64 b from a sub-array costs 0.64 pJ and 300 ps; the same 64 b from a 256 MB memory (about 100 mm²) costs 58 pJ and 12.3 ns, of which 57.4 pJ and 12 ns are communication, 15 mm each way. And the worked multiprocessor example that §11 animates: summing a table held in the on-chip memory of a 4×4 array of 256-core chips, 16 mm on a side, each core at the centre of a 2 MB SRAM with a 1 mm local round trip (1.9 pJ, 400 ps per 64 b access). A random access costs 21.3 mm on chip for the 1/16 of accesses that stay local and an additional 640 pJ + 21.3 mm for the 15/16 that leave, 680 pJ on average; letting each core sum its own 256K words and forward the result up a tree is “354×” cheaper (230× elsewhere in the same article) — and PRAM cannot tell the two programs apart.

Roune: the AI CPU

Bjarke Roune's design document [2] argues from the other end — from what accelerators should look like — and lands on “traditional-ish CPUs with big caches and systolic arrays, where the caches and systolic arrays take up most of the chip area and power.” The facts that bear on a grid model: doubling a systolic array's vector width quadruples its work per cycle while less than doubling the cost of the core that drives it, so the controlling scalar and vector logic shrinks relative to the array (“45 = 1024×” in scalar work from Volta's 4×4 to TPUv3's 128×128); after configuration a systolic array fetches no instructions, which is where its energy advantage over a vector processor comes from; the reduction dimension K is the hard utilisation limit (attention at 16–128, feed-forward at 8,192), so mono-sized arrays are unbalanced; data should move SRAM → network → SRAM without a detour through a central store; a torus with neighbour-only traffic is 100% link-efficient while any router caps at 50%; and all-reduce traffic per chip is 2X(1 − 1/P), so within-layer parallelism more than doubles per-chip bandwidth when P doubles. He is explicit that there are few numbers in the document, and that a 2-D plane is enough to understand most of it.

The calibration thread

A Codex thread on matmul energies [3] turned Dally's SRAM figures into a hierarchy the grid can represent: 256 MiB is 32,768 sub-arrays of 8 KiB; at 100 mm² each sub-array gets a 55.2 µm square-equivalent pitch and each 64-bit word site a 1.73 µm pitch (0.61 µm per byte); an 8 KiB sub-array laid out as 32 half-diamond shells has a mean one-way distance of 37.7 µm; Dally's 15 mm needs a routing factor of about 2.24 over the 6.7 mm mean of a flat 100 mm² layout; and at the area-derived byte pitch and the AHA keynote's 100 fJ per bit-mm, a byte-wide round trip over one grid step costs 0.98 fJ — the physical reading of “1 fJ per score step.” Effective speeds: c/120 for global wires, c/1200 for a complete sub-array access. One slip in the thread's descendants is corrected here: 320 pJ per 64 b is 5 pJ per bit, 40,000 fJ per byte, a board-level crossing; the 5,000 fJ per byte the competition uses for Ein is a chiplet- or HBM-class crossing (0.6 pJ/bit), and the two must not be cited for each other.

4. Three axes, and twenty rules applied to all four scenarios

Read together, the six designs and eighteen reviews say that multiprocessor extensions of the grid differ on exactly three axes, and that everything else is a constant to be calibrated once:

  1. Instruction delivery. MIMD cores each fetch their own program (Dally's 80 pJ “add instruction” on a CPU is this overhead); SIMT lanes share one fetch across a broadcast tree whose wire length grows with P; a systolic array fetches nothing after a priced configuration. A grid model that broadcasts instructions for free erases the axis that separates GPUs from TPUs from multicores.
  2. Memory ownership and geometry. One shared plane read from anywhere at the distance from the reader (PECM literal), or private regions around each head with explicit messages (Dally's 256-core chip, Roune's SRAM-to-SRAM DMAs), or a hierarchy of tiles, dies and packages with a crossing constant at each boundary. Where the head sits and how large its footprint is decides the minimum distance a byte ever travels.
  3. Communication pricing. Byte-microns of wire (the settled rule) plus, once routers exist, a per-hop constant and a link rate; whether idle silicon costs anything; and whether makespan is a closed form or a simulation.

Twenty problems recurred across designs. Each is resolved once here and the resolution is applied to every scenario, so their numbers are comparable with each other and with the single-core leaderboard. The load-bearing ones:

ProblemWhere it bitRule adopted for all four scenarios
Tape rateevery streamed example capped at 2×; 25 of 32–60 µs of the 64×64 matmul8 B/ns per tape for P ≥ 2 (Dally's 64-bit quantum at 1 GHz); Ein per byte unchanged; the P = 1 port term is kept and the discontinuity declared
Zero-footprint coresradius-16 tiles whose controller and 5-port crossbar occupied five cells; 8 µm lanes with a dp4a datapathevery control unit occupies a declared block that holds no data: 128×128 cells for a scalar head with its router and buffers, 16×16 per SIMT lane, 16×16 per systolic PE; blocks count in area
Idle silicon is freea 4,096-core submission using one core scores the single-core energyone clock rule for every scenario: 0.125 fJ per bit-micron of the declared control structure's clock tree per nanosecond, gated or not (168 fJ/ns per tile), scored for P ≥ 2; plus a reported static column A×T at 1 fJ per µm² per µs (scoring it is open decision P3)
Router energy8 fJ per byte per hop; a 2.24× per-micron multiplier fitted to an H-tree1 fJ per byte-micron of wire plus 40 fJ per byte per router traversed and 65 fJ at the endpoint interface, 1 ns per hop
Makespan under modesarms with equal port traffic but different lengths make time data-dependent; worst-arm does not compose across coresarm padding: every arm is charged the mode's maximum issues and byte-microns in the time model; port balance counts bytes
Deadlock as a timing propertyshared network-interface buffers with in-network blockingcredit-based end-to-end flow control per ordered core pair; output port pulls from the owner of its current segment; single-signaller flags
Straw-man baselinesnaive triple-loop single core; resident tables that arrive for freecompare against a blocked single-core schedule; report Dally's table sum in both framings (streamed once, and resident with the load charged)
Fetch rule across President instruction memory at ~5 fJ per byte vs 4 fJ/line + 1 fJ/issuekeep the settled per-core fetch rule everywhere; add each scenario's delivery term on top

5. Scenario 1: the SPMD tile mesh with a collective library

In one paragraph. Add one header line, replicate P, to a settled schedule. The judge stamps P copies of the settled machine — head, three port cells, private half-diamond — each with a 128×128-cell core block under its head, on a Px×Py lattice at a derived pitch. All tiles run the same text with static lane_x, lane_y; bytes cross a tile boundary only inside a fixed library of scoped collectives whose energy and time are closed forms; the three tapes attach to tile (0,0) at 8 B/ns and distribute by a static stripe library. It is Dally's 256-core chip programmed the way GSPMD programs a TPU pod, priced by the PECM lattice plus a real network's constants. Adopt it first.

   y ^      tile (0,1)                          tile (1,1)
     |   .  .  .  ◊  .  .  .                 .  .  .  ◊  .  .  .      diamond: k shells, lin(a)
     |   .  .  ◊  ◊  ◊  .  .                 .  .  ◊  ◊  ◊  .  .      reads cost ⌈√a⌉ fJ/byte
     |   .  ◊  ◊  ◊  ◊  ◊  .                 .  ◊  ◊  ◊  ◊  ◊  .
     |   I [H] O ═══════ 8 B/ns link, S µm ═══════ I [H] O            head row, ports at ±1
     |   +----------------+                  +----------------+
     |   | 128x128 block  |                  | 128x128 block  |       sequencer, 2 KiB I-buf,
     |   | seq ibuf ALU   |                  | seq ibuf ALU   |       ALU, router, 4x1 KiB NI
     |   | router  NI     |                  | router  NI     |       (no data cells; clock
     |   +------║---------+                  +------║---------+        tree 1,344 µm, 168 fJ/ns)
     |          ║ vertical link, S µm               ║
     |   .  .  .  ◊  .  .  .                 .  .  .  ◊  .  .  .
 in ═══► I [H] O ═════════════════════════════════════ I [H] O        tile (0,0): the settled
 out ◄══ tile (0,0)    (0,-1) ◄═══ instr tape           tile (1,0)     machine + block; 3 tapes
     |   +----------------+                  +----------------+
     +----|<----- S ----->|-------------------------------------------> x

Geometry and constants

LatticeP = 2j ≤ 4,096; Px = 2⌈j/2⌉, Py = P/Px; tile (i,j) has its head at (S·i, S·j); uniform radius k = max over tiles of ⌈√amax⌉ PitchS = max(2k − 1, k + 129) µm: the block of the tile above must clear this tile's diamond. k = 33 → 162; 47 → 176; 57 → 186; 91 → 220; 257 → 513 Core block128×128 cells (16,384 µm²) below the head: sequencer, 2 KiB instruction buffer, loop stack, ALU, 5-port router, four 1 KiB network-interface FIFOs. Derived at the model's own density (one cell = one byte of SRAM with overhead ≈ 0.37 real µm² at 7 nm): 6,144 buffer cells + ≈5,400 for an Ibex-class core + ≈2,700 for the router ≈ 14,250. Holds no data. Ablock = 0 at P = 1 ClockEclk = 168 fJ/ns per tile at P ≥ 2: 0.125 fJ per bit-micron of the block's 1,344 µm clock H-tree per nanosecond, gated or not (the model's 1 fJ per byte-micron applied to one clock bit). Inside the physical band: an idle clocked 7 nm microcore burns 300–1,000 fJ/ns, gated leakage 15–150 fJ/ns Networkstraight head-to-head links, 8 B/ns per direction, XY routing; a byte over h hops costs S·h + 40h + 65 fJ (wire, routers, destination interface) and takes h(S/v + 1) ns plus ⌈m/8⌉ of serialisation Tapesat tile (0,0), 8 B/ns each; Ein = Eout = 5,000 fJ per byte plus the port micron; the pad is a DMA engine that pushes stripe segments into the owning tile's FIFO, priced as network bytes, only when the FIFO has room Die16,384 µm on a side (a judge constant); a lattice that does not fit is cut into dies and priced as Scenario 3

Instruction delivery, tapes, memory

The text (Stext canonical bytes, up to 2 KiB before the block grows) crosses the instruction tape once and is multicast over the XY spanning tree: Etext = 4·Lstatic + Stext·(P − 1)·(S + 105) fJ, arriving after Stext/8 + (Px + Py − 2)(S/v + 1) ns. Each tile then issues from its own buffer at the settled 4 fJ per static line and 1 fJ per issue; the physical reading is a per-core loop buffer with a location, filled once from a shared instruction memory over the network. A reported, unscored column Ectl = 1,000 fJ per issued instruction records what a microcontroller-class sequencer would actually spend.

Input is cut into segments by a declared stripe — cyclic (element kP+l to lane l), block n, block2d(bx,by), replicate (one Ein, then a priced multicast with charged landings) — and output is the mirror under credit pull: the pad's 1 KiB buffer is credit for the owners of the next segments in stream order, a send blocks until its tile holds credit, and the pad drains a segment only after it has arrived. Rule R9 makes this decidable: cyclic is safe by construction; block stripes are accepted only when no barrier separates two tape operations of the same block or the block fits the FIFO, and their phase time is a per-segment recurrence (push, arrival, receive-start, receive-end) that the judge evaluates in O(number of segments) with periodic extrapolation for long streams. Memory is private per tile at the settled lin(a) addresses; local writes stay free; the landing writes of collectives are charged, into a judge-allocated slot just above the program's own amax.

Collectives

CollectivePattern (fixed)EnergyTime
reduce.op.T a, n [.row|.col] [root]recursive halving, X rounds then Y rounds, m = n·w bytes per message; snapshot per roundper round: senders × [issue + read of a + m·enet(2rS) + landing write] + receivers × n issued adds with their readsper round: 1 + ⌈m/8⌉ + 2r(S/v + 1) + 1 + ⌈m/8⌉ + n·(1 + flight)
allreducereduce then bcastsumsum
reduce_scatter, allgatherbidirectional chain along the line (nL(nL−1) one-hop block moves)block-hops × [issue + read + m·enet(S) + landing + issue] (+ n issued adds per landed block for reduce_scatter)(nL−1) rounds of one hop plus two serialisations, with the sender's read flight charged
bcast a, n [root]XY spanning tree of the scoperead + m(scope−1)(S + 105) + (scope−1) landing writes⌈m/8⌉ + depth·(S/v + 1) + 1
alltoall, shift dx dy, roll dx dyXY-routed, per-link load closed-form; dx = dy = 0 rejectedper message as abovemax link load × ⌈m/8⌉ + flight + 2(1 + ⌈m/8⌉)
reduce.argmin.T a, nkey-value recursive halving, row-major tiesas reduce with two issued ops per elementas reduce

Every collective is a barrier among the lanes in scope, every combine order is fixed, and every round snapshots its sources before any landing write, so values form a Kahn network with one actor class: determinism is syntactic. Element-wise arithmetic inside a collective is issued (one issue per element on the combining lane) and movement runs at DMA rate; a collective is not a free vector unit.

Makespan, area, and the ISA delta

Makespan is MIMD-between-barriers: the prologue, plus for every barrier-to-barrier segment the maximum over lanes of that lane's settled time for the lines it executes, plus the collective rows, plus the tape phases of R9. Because lane coordinates are affine in addresses (rule R1′), the lane maximum sits at a corner of each guard class and is found by evaluation, not search. Modes are padded segment-wise: every arm is charged the mode's maximum issues and byte-microns between consecutive blocking operations, so the timeline is data-independent by construction. Nothing is simulated. Area is P·((2k−1)² + 16,384) µm² for P ≥ 2 and the settled (2k−1)² at P = 1.

ConstructOperandsSemanticsBytes
replicate PP = 2j ≤ 4,096header; fixes Px, Py, S; lane = lane_y·Px + lane_x6
lane, lane_x, lane_y—static per-tile integers; affine in addresses; mod/div only in set immediates and if_static predicates0
lanes (x0..x1, y0..y1):static, inclusiverectangular guard; unguarded lanes skip to the next barrier14
stripe <tape> cyclic | block n | block2d(bx,by) | replicatein or outstatic distribution of the stream (R9)8
recv.T d / send.T aas settledcollective tape operations under the stripe; 1 + w/8 ns each6
collectivesa, n, op, T, scope, roottable above; the head is blocked ⌈m/8⌉ ns per endpoint10 (18 for shift/roll)
mode sel -> c in 0..Kas settledworst arm for energy, segment-wise padding for time; arms carry identical barrier tuples and byte-balanced portsas settled

Worked examples

(a1) The streamed 220-byte sum. stripe in cyclic, one recv.i32 and four adds per trip per lane, one reduce, one send. The body is 5.52 ns per trip, the tape 4P/8 ns, so the program is issue-bound to P = 8 and tape-bound from P = 16. Speed-ups are given against the settled 1 B/ns machine and against a same-tape single core (8 B/ns), because the first number mixes an eight-fold tape change with parallelism.

Pmesh, SE (fJ)of which clockT (ns)speed-up settled / same-tapeA (µm²)
1 (settled)—5,255,745,0920 (353.3 MfJ if charged)2,102,751 (same-tape 1,447,809)125
22×1, 1325,623,260,828243,238,103723,9232.90 / 2.0032,818
42×2, 1325,730,531,803243,249,428361,9785.81 / 4.0065,636
84×2, 1325,919,523,775243,279,764181,01211.62 / 8.00131,272
164×4, 1326,213,474,881352,442,878131,11716.04 / 11.04262,544
648×8, 1327,996,764,2221,410,063,435131,14416.03 / 11.041,050,176

Energy rises 18% at P = 16 (12% distribution, 7% clock) for an 11× time gain, and then the tape is the wall: the streamed sum is where a parallel machine buys time only.

(a2) The resident sum, Dally's framing. Each lane holds N/P bytes, sums them, then one reduce. The load phase (a cyclic stripe) is reported separately and added for the end-to-end row, because Dally's example charges it.

Pk, SE resident (fJ)of which clockratioT (ns)speed-upA (µm²)E end-to-end (fJ)ratioT end-to-end, speed-up
11,025724,764,7250 (241.0 MfJ if charged)11,434,75714,198,4015,968,955,44512,483,333 ns
4513, 1,025575,978,693208,969,2461.26310,9664.64,268,0367,076,103,3970.84442,041; 5.6 / 4.1
16257, 513381,364,918193,027,8751.9071,81120.04,472,8487,781,382,9010.77202,891; 12.2 / 9.0
64129, 258285,163,248185,640,4032.5417,266835,275,7129,193,233,3800.65148,354; 16.7 / 12.3
25665, 194243,111,814185,767,8812.984,3193328,454,40014,874,263,8780.40135,424; 18.3 / 13.5
1,02433, 162256,353,600211,862,5952.831,2321,16521,103,61634.69 µJ0.17132,371; 18.8 / 13.8
4,09617, 146481,118,176410,727,0431.515972,40471,569,408108.4 µJ0.06131,805; 18.8 / 13.9

Three readings. The √P locality dividend is real (mean read distance 683 µm at P = 1, 171 at P = 16) but the clock caps it near 3× at P = 256 and it falls again at 4,096, so the energy board's optimum is finite. Speed-ups above P are a v1 artefact the reader must know: the settled machine charges operand flight serially (386,177 of its 1,434,757 ns is unpipelined flight over a 683 µm mean path) and the √P shrinkage of that path is booked as speed-up; real SRAM pipelines it. And a once-swept table that had to be loaded over the tape is worse in energy at every P ≥ 4 — Dally's 354× needs a table produced in place, which is exactly what the MNIST tiers' resident weights are.

(b) The 64×64 int8 matmul. Tile (x,y) owns a block of C; stripe in block2d delivers its blocks of A and B; allgather.row and allgather.col give it its block-row of A and block-column of B; the settled 4×4 register-block kernel does the MACs; output leaves row-major under credit pull.

Pk, SE (fJ)tapesallgatherclockT (ns)speed-up settled / same-tapeA (µm²)fJ/MAC (compute)
1 (blocked)97146,421,528124,454,16000 (117.7 MfJ if charged)700,320 (same-tape 684,960)137,24983.8
491, 220271,650,182131,792,8923,387,456116,370,102173,1704.04 / 3.96196,58075.1
1657, 186294,430,778141,918,8968,731,896123,843,20646,07315.20 / 14.87466,44869.1
6437, 166355,814,021160,503,87218,273,808152,853,72114,21649.3 / 48.21,389,63264.9

Time falls 15× and energy doubles. The clock is 42% of the 16-tile energy, and it is honest: P·T = 16 × 46 µs = 737 core-microseconds against 700 for the single core (95% parallel efficiency), and the single core pays no clock by rule. Like for like (the single core charged its 117.7 MfJ), the 16-tile machine costs 1.11× the energy for 15× the time. The energy board rewards P only where locality beats P·T × 168 fJ; the time board rewards it outright.

Which machine, scoring, exploits

Dally's 256-core chip with per-core SRAM on a mesh, programmed as GSPMD does with partition_id and all-reduce, all-gather and collective-permute; the SRAM-plus-network half of Roune's AI CPU without the array. One honest mismatch: Dally's 2 MB core does not fit 256 to a 16 mm die in this model (k = 1,449, S = 2,897 µm, five tiles per die side), because the byte pitch is 1 µm against his 0.61 and a half-diamond fills a quarter of its bounding square; 256 tiles per die are 243 KiB tiles. Scoring is the settled closed forms with two more affine dimensions plus a table row per collective and the R9 recurrence: about 2,600 new judge lines, 0.2–10 ms per submission, no simulator. Exploits closed: huge P for free work (the clock, the block, the text delivery); a replicate 2 shell with one idle lane, 1.45× faster than the settled streamed sum on the tape rate alone (it scores on the P ≥ 2 time board only); collectives as unissued vector units; FIFO deadlock through block stripes (R9); corner-rule under-estimation with mod addresses (R1′); modes as free MIMD (segment padding); port balance by mnemonic (bytes); shift as a free memset (rejected at P = 1); the table bomb; head placement (fixed lattice). It rewards small per-tile working sets, neighbour chains, large messages, 2-D decompositions (SUMMA's row and column scopes cost 0.4× the link energy of a 1-D allgather) and model parallelism for MLPs; it punishes streaming once-touched data, replication to all lanes, divergence, high P on small problems, and every rung-(a) trace (a 700k-line trace costs 323 mm² of instruction buffer at P = 16, so rung (a) stays P = 1 only).

Strongest surviving objection. Collectives-only is a closed world: no overlap of a lane's own communication with its compute, no point-to-point, no data-dependent destinations. Roune's “three-stage software pipeline you write every time” has no expression, and the makespan is pessimistic against hardware that barriers only at collectives. That is the price of a judge with no simulator; Scenario 3 is the answer when it is too high.

6. Scenario 2: the systolic MXU coprocessor with a vector pass

In one paragraph. The settled head, or a Scenario-1 tile's head, gets a K×K mesh of 16×16-µm processing elements in its otherwise empty lower half-plane, fed and drained through four edge buffers by K-lane vector loads and stores at min(4K, 16) B/ns. The PE program (up to eight four-byte micro-ops in up to four phases, including shr/shl/cmp/select) is loaded once at a priced configuration; afterwards there is no instruction traffic, only 1 fJ per clocked PE-beat, the clock trunk of the declared array per beat, and the bytes moved. Time is a Kung–Leiserson wavefront: mesh.run starts a skewed phase sequence, the head keeps issuing, mesh.wait joins. It is a TPU matrix unit and vector unit attached to a scalar core, Roune's “traditional CPU with extra vector compute and a systolic array.” K = 0 is the settled machine bit for bit. Adopt it second, inside a Scenario-1 tile.

              y ^      head memory: lin(a) half-diamond above the head (unchanged)
                |               . . . . . . .
   IN ─► (−1,0) [H] (0,0) ─► (1,0) OUT        (0,−1) instruction tape; core block, if a Scenario-1 tile,
                |                              sits beside the array to the west
  x = −w_buf−1 .. −1 │ x = 0 ................. K·s−1 │ K·s .. K·s+w_buf−1
  ┌──────────────────┼────────────────────────────────┼──────────────────┐ y = −2
  │                  │  NORTH buffer: K lanes, 2D B   │                  │  w_buf = 2D/s columns
  ├──────────────────┼──┬──┬──┬──┬────────────────┬──┼──────────────────┤ y = −2−w_buf
  │ WEST buffer      │PE│PE│PE│PE│ …              │  │ EAST buffer      │
  │ lane l: s rows   ├──┼──┼──┼──┼────────────────┼──┤ (pass-through    │  PE: 16 x 16 cells,
  │ slot (h,t) at    │PE│PE│PE│PE│                │  │  writes priced)  │  4x4 controller,
  │ x = −1−c,        ├──┼──┼──┼──┼────────────────┼──┤                  │  32 data B, 64 prog B
  │ y = y_top(l)−r   │ …                             │                  │  links: 4 B/beat,
  ├──────────────────┼────────────────────────────────┼──────────────────┤  16 fJ per byte-hop
  │                  │  SOUTH buffer (drain reads priced)                │
  └──────────────────┴────────────────────────────────┴──────────────────┘ y = −2−2w_buf−K·s

Constants and rules

PE16×16 cells: a 4×4 controller, 16 ring-1 data cells at 1 fJ/byte, 16 ring-2 at 2 fJ/byte, 64 program cells, the rest logic (a u8×u8→i32 MAC with link registers is about 90 real µm² at 7 nm). s = 8 µm is allowed only for a declared u8-multiply-only PE (5 nm) Links4 bytes per beat per direction to the four neighbours; the sender pays s fJ per byte; a beat is 1 ns on the array's equal-path clock tree Per beat1 fJ per PE for every PE and every beat of a phase, skew beats included, plus 0.125·Htree fJ of clock trunk (K = 16: 5,760 µm of tree, 720 fJ per beat), regardless of how many rows and columns the run uses Configurationmesh.prog once: 64·(1 + D00 + Htree) + 256·K² fJ; go and done tokens one byte over the tree each way Feeda byte reaches a PE by tape → head memory → head (⌈√a⌉) → lane cell (head-to-lane distances of the diagram) → edge PE (δ = s/2 + column + |row offset|) → interior PEs at 16 fJ per hop. Nothing is broadcast: a byte K lanes need is fetched K times. The head's memory port caps vector loads and stores at min(4K, 16) B/ns — the settled head moves about 13 bytes per issued nanosecond and inherits that width Makespana phase occupies np + |σr|(R−1) + |σc|(C−1) beats; the software-pipelined loop (wait, run, store, load, load) obeys Δ = 1 + max(H + 1, Tmesh) per iteration exactly, with H = Tstore + 2Tload; the judge evaluates it at the box corners. Closed-form Areathe settled square of the head's diamond (with a K²-tile i32 C buffer, comparable to v1's 4-row buffer) plus (K·s + 2wbuf)² for the array block
MnemonicOperandsPrice
mesh K, Dheader; K ∈ {0, 1, 2, 4, …, 256}, D bytes per lane per halfarea only
mesh.prog Pa library program (OS_MAC, WS_MAC, VPASS) or up to 64 inline bytes; once, never during a run64(1 + D00 + Htree) + 256K² fJ; 8 + (D00 + K·s)/v + 8 ns
mesh.load.T side.h, base, sl, ss, n, lanestyped vector load into a buffer half: lane stride, element stride, elements per laneΣ d(addr) + Σ head-to-lane distance; 1 + ⌈K·n·w/min(4K,16)⌉ ns + flight
mesh.store.T side.h, base, sl, ss, n, lanestyped vector store from slot 0 upwardΣ lane-to-head distance (head write free); same rate
mesh.run pmask, n0..n3, σr, σc, rows, cols, contphases, beats per phase, skews, active sub-array, keep lane pointers2Htree + Σp np·rows·cols·cp + trunk per beat + edge terms; 1 ns on the head
mesh.wait—t ← max(t + 1, tdone)
PE micro-opsmac add sub mul and or xor min max copy set shr shl cmp select phase nop, links @W/@N/@E/@S, accumulate @X+local 1–2 fJ/B, link write s fJ/B, edge δ, 1 fJ per beat; one beat each

Worked example: the 64×64 int8 matmul

Output-stationary OS_MAC (zero, then mac.i32 acc, @W.u8, @N.u8 with the operands forwarded east and south, then a northward drain), tiles of K×K outputs over a reduction length of 64, software-pipelined halves. A MAC-beat at s = 16 is 41 fJ (1 + 8 + 16 + 16), a drain beat 73. Compute-only energies; the common I/O is 124.45 nJ. The baseline is the blocked single core: 21,967,280 fJ compute-only in 674,920 ns.

K (PEs)s = 16: fJ/MAC (mesh, trunk, edge, load, store)E (fJ)T (ns)speed-upA (µm²)mesh busys = 8: fJ/MACE (fJ)
blocked v183.821,967,280674,920137,249—83.821,967,280
2 (4)158.1 (45.0, 1.6, 16.6, 94.3, 1.8)41,439,52171,8009.436,8570.99152.640,014,113
4 (16)115.8 (48.4, 2.6, 8.6, 55.2, 3.0)30,363,56919,53234.641,9770.9898.025,692,081
8 (64)100.3 (54.0, 3.6, 4.8, 35.6, 4.9)26,298,0415,725117.959,0890.9773.919,377,593
16 (256)104.6 (64.7, 4.9, 3.0, 25.8, 8.8)27,432,7493,307204.1119,4250.5468.717,997,741
32 (1,024)133.3 (85.8, 7.2, 2.5, 20.9, 16.6)34,936,7392,347287.6344,7770.2780.921,206,243
64 (4,096)211.2 (127.8, 11.8, 3.0, 18.9, 33.1)55,372,7812,075325.31,281,7130.12125.032,780,173

The parenthetical components are the calculator's attribution and do not sum exactly to the totals (they leave out the one-time program load and head control at small K and overlap slightly at large K); the totals, E divided by 262,144 MACs, are the scored values.

The coprocessor is a time engine: 35–325× faster than the blocked single core. On energy it beats the single core only with the declared 8-µm PE (68.7–73.9 fJ/MAC at K = 8–16, 1.13–1.22× below); at 16 µm the in-mesh floor is 41 fJ of hops per MAC and the head's diamond feed adds 19–94, so K = 8 lands 1.20× above. Roune's forces appear correctly stated: issues per MAC fall 4× per doubling of K, but the head's bytes per MAC fall at most 2× on loads and not at all on stores (4K² i32 bytes per 64K² MACs at every K), the drain grows with K, and an array larger than the head port can feed idles — at K = 16 the mesh is 54% busy because a 16 B/ns port, not the array, sets the pace. The honest caveat: a TPU matrix unit is fed at K bytes per cycle per side from a banked vector memory, 16–32× wider than this inherited head port, so every K ≥ 16 row describes the port. The “TPU beats CPU on energy” story needs a banked head memory (deferrable), panel-resident buffers (D ≥ 8,192) and a reduction length far above K: the 8192³ GEMM and the tier-3 MLP, not 64×64. For the tier-2 SGD step the vector pass is load-bearing: without it the step is 73–89% head-bound and saturates at 13–16× over v1; with it about 90×.

On the 220-byte sum the mesh is a K-lane SIMD strip: 960 nJ (1.32× v1) in 67 µs at K = 16. It loses on energy at every K and cannot reach Dally's distributed-memory result at all, with 20–32 bytes per PE. Its scoring is entirely closed-form (static counts times per-beat costs, quasi-polynomial edge sums of period s, lattice sums for loads, the first-order recurrence for time); it cannot deadlock and determinism is a circuit property. Exploits closed: free head bandwidth (the port cap), the K = 1 relayout engine (4 B/ns), free idle silicon (trunk and PE beats regardless of gating), the straw-man baseline, zero-footprint PEs, area absorption, modes reaching into the mesh, declared half flags, mesh.prog as a cheap broadcast, link registers as free storage, untyped stores that scatter bytes.

Strongest surviving objection. Its expressivity is one dataflow shape. Only the 4K−4 edge PEs receive independent data, so anything that is not a rank-1-update wavefront runs at O(K) parallelism, and it answers one of the four target algorithms on its own. It is a component, ranked second as the first extension of a Scenario-1 tile, not as a multiprocessor; its energy case rests on the PE pitch and on a head port the model inherited rather than designed.

7. Scenario 3: the message-passing multicore with a chiplet level

In one paragraph. Scenario 1's lattice, tiles, tapes and collective library (kept as primitives, so every Scenario-1 program scores identically here), plus explicit two-sided messages (msend/mrecv, mxchg), a one-sided put into declared landing windows with an explicit release, credit-based end-to-end flow control per ordered pair of tiles, and a die/package level with priced crossings. Values stay a Kahn network (per-pair FIFOs, blocking receive, no probe); energy and area stay closed-form; makespan needs a deterministic, data-free discrete-event simulation over message and tape-segment events. It is Epiphany-, SCC- or Cerebras-class manycore, Dally's 4×4 array of 16 mm chips, and the SRAM-to-network-to-SRAM DMAs of Roune's AI CPU. Adopt it third, once the reference simulator exists and has been differentially tested against Scenario 1's closed forms.

   die (0,1)                            die (1,1)
   +-----------------------------+  gap  +-----------------------------+
   | [t][t][t][t] ... C x C      |  ~~~  | [t][t][t][t] ...            |
   | [t][t][t][t]  tiles, S µm   |═E_off═| [t][t][t][t]                |   ═ die-to-die link:
   | ...                         |  ~~~  | ...                         |     5,000 fJ/B, +20 ns,
   +-----------------------------+       +-----------------------------+     8 B/ns
        ║ E_off                                ║
   +-----------------------------+       +-----------------------------+
   | [t][t][t][t] ...            |═E_off═| [t][t][t][t] ...            |
 in═►[t]                         |       |                             |
 out◄[t]  tile (0,0) has the     |       |                             |
 instr►   three tapes            |       |                             |
   +-----------------------------+       +-----------------------------+
   die (0,0), 16,384 µm                  die (1,0)
Diesside 16,384 µm (judge constant); a lattice larger than one die is cut into C×C tiles per die; a route that crosses a die boundary pays Eoff = 5,000 fJ per byte + 20 ns per crossing (chiplet, silicon-bridge or HBM-class, 0.625 pJ/bit); a board crossing, if a task declares one, pays Epkg = 40,000 fJ per byte + 100 ns (Dally's 320 pJ per 64 b) Packets8-byte header (destination, source, length, sequence), up to 64 KiB, priced on n + 8 per byte at S·h + 40h + 65, latency 1 + ⌈(n+8)/8⌉ + flights + h ns; the landing write in the destination's diamond is charged; landing is cut-through, so the 1 KiB network interface is a staging buffer, not a size bound Flow controlcredits per ordered pair in bytes at the landing window (default double buffering); a packet is injected only when its bytes are reserved, so links never stall; the output pad pulls from the owner of its current segment; flags have exactly one signaller and one waiter Textshared text multicast as Scenario 1; role-specialised blocks (core (i,j): or a quasi-affine predicate) are shipped per tile over their own XY path and cross the tape once each; a tape schedule (an affine list of tile, bytes segments) makes Cannon's skewed initial placement free Windowswindow w: @b len n depth k declares k slots that exactly one other tile may write by put; disjoint from everything the owner writes; a slot is readable only between its wait and its release
MnemonicOperandsSemantics and price
msend q, a, ndestination tile, local address, n ≤ 65,536next message in the (me, q) FIFO; blocks at the source until q's window has n+8 bytes of credit; source read + (n+8)·(S·h + 40h + 65) [+ (n+8)·Eoff per crossing]
mrecv p, b, nsource tile, local address, nwait for the next message from p (must be n bytes, checked statically); lands at [b, b+n); landing charged; 1 + ⌈n/8⌉ after the last byte
mxchg q, a, b, npair exchangesend and receive as one instruction; the checker requires q's matching mxchg in the same barrier position
put w@q, a, n; wait w; release wwindow of tile qone-sided write into the next slot; the owner's wait blocks until it has landed; release returns the credit
sig f / wait f, mflag cell, thresholdcounting semaphore, one signaller and one waiter; priced as a 1-byte message
Scenario-1 collectives—primitives, priced by Scenario 1's rows

Determinism and deadlock. Values are Kahn-determinate: per-pair FIFOs, blocking receives, no probe, single-signaller flags, single-writer disjoint windows, put snapshots its source at issue. Deadlock is decided by an untimed execution of the credit network (every tile run as a process with the declared credit depths and no clock; by the Kahn property the answer is schedule-independent), because FIFO-size matching alone is not enough: two tiles that each send twice before their first receive deadlock at depth one with perfectly matching sequences. Makespan is the discrete-event simulation of the rulebook: events are messages, tape segments, output-segment handovers and boot completions; between events each tile advances by the settled closed-form segment time; integer ticks of 1/(1,874×8) ns; oldest-head-flit arbitration with row-major ties; steady-state extrapolation of index-invariant outer loops. It is O(M log M) with M ≤ 107 events, milliseconds for the worked examples and about 104 events for the 8192³ GEMM and tier-3 MNIST after segment-level tape events and 64 KiB messages. A closed-form lower bound (per-tile sums, per-link bytes/8) is reported beside it.

What it adds, measured. Cannon on the 64×64 matmul, which Scenario 1 cannot write (point-to-point shifts with wrap on a mesh without a torus): per tile two operand blocks double-buffered, √P steps, a message of A left and of B up per step, C accumulated in place.

SchedulePk, SE (fJ)T (ns)A (µm²)fJ/MACexchange E (fJ)messages
Scenario 1 SUMMA491, 220271,650,182173,170196,58075.13,387,4568
Scenario 3 Cannon491, 220273,700,861175,279196,58077.23,408,2568
Scenario 1 SUMMA1657, 186294,430,77846,073466,44869.18,731,89696
Scenario 3 Cannon1647, 176299,910,73447,221400,52872.311,029,77696

At 64×64 the model does not separate Cannon from SUMMA in energy (+1.9%) or time (+2.5%), because tapes and clock dominate; Cannon holds 4×256 B of operands instead of a 1 KiB block-row plus block-column and wins 14% of the area. At 8192³, where replication is 2 MB per tile, only Cannon can be written. On Dally's 4×4 dies the partial-sum tree costs at most 15 crossings × 4 bytes × 5,000 = 0.3 nJ, while loading the table across dies costs three quarters of 220 bytes at 5,000 or more, at least 3.9 µJ — which is his point about where the 640 pJ goes. Scoring: energy and area closed-form (piecewise-affine hop counts and die floors through the settled floor-sum engine); about 4,700 new judge lines including an 800-line simulator; 0.2–2 s per submission at the event cap. It rewards pipelines and stages with different text, overlap of one tile's DMA with another's compute, coarse messages and skew by tape schedule; it punishes fine-grained messaging (a 1-byte message is a 9-byte packet at ≥ 105 fJ per payload byte), die crossings for anything but results, and out-of-order output.

Strongest surviving objection. The makespan is a simulation, and every tie-break in it is a rule of the competition: the published simulator is the definition of time on the general path. The closed-form lower bound lets a suspicious makespan be compared, but the time axis rests on 800 lines of simulator rather than on a formula.

8. Scenario 4: the SIMT lane array

In one paragraph. One instruction tape, one decoder at the port strip, P identical lanes at fixed sites on an nx×ny array at pitch s, every instruction executed by every lane in lockstep. The word is driven over an H-tree whose entire wire length is charged per issue; data reaches lanes by striped recv over a second tree; lanes exchange through a distance-priced shuffle library with a per-link rate term or through a 32-bank shared plane; dp4a and dp2a do four int8 or two int16 MACs per issue. Everything is closed-form. It is one GPU streaming multiprocessor. Adopt it fourth, on its own P ≥ 2 board, because on the energy board it loses to the single core for every instruction-bound task by construction.

              SHARED PLANE  n_x·s wide × H_SH rows, 32 banks × 4 B (bank = ⌊q/4⌋ mod 32)
   y=n_y·s  ┌──────────────────────────────────────────────────────────────┐
            └──────────────────────────────────────────────────────────────┘
            ┌───────────────┬───────────────┬───────────────┬───────────────┐
            │  ◊◊◊ private  │  ◊◊◊          │  ◊◊◊          │  ◊◊◊          │  l_y = 1
            │   H  head     │   H           │   H           │   H           │  head at local row 16
            │ ┌────┐ 16x16  │ ┌────┐        │ ┌────┐        │ ┌────┐        │  head block rows 0..15
            │ │blk │ ══╗    │ │blk │ ╔══    │ │blk │ ══╗    │ │blk │ ╔══    │  (decoder leaf, dp4a,
            ├─┴────┴───╫────┼─┴────┴─╫──────┼─┴────┴───╫────┼─┴────┴─╫──────┤   predicate, ports)
            │  ◊◊◊     ╚════╪════ROOT╩══════╪══════════╝    │        ║      │  l_y = 0
            │   H           │   ║           │   H           │   H    ║      │
            │ ┌────┐        │ ┌─╫──┐        │ ┌────┐        │ ┌────┐ ║      │  ═ H-tree (I and D
            │ │blk │        │ │blk│ trunk   │ │blk │        │ │blk │═╝      │    trees, same shape)
   y=0      └───────────────┴───╫───────────┴───────────────┴───────────────┘
   y=−1      port strip      [in] [instr] [out]   decoder at the port; s ≥ 32
LanesP ∈ {2, 4, …, 1,024}; lane (lx,ly) is an s×s tile, s ≥ 32; rows 0–15 are the 16×16 head block, the head sits at local row 16, the private half-diamond hangs above with k ≤ s − 17 (private capacity 225 B at s = 32, 1,024 at 64, 4,096 at 128) Treestrunk Lt = (ny−1)s/2 + 17 from the port to the tree centroid; H-tree length H = 1.5·s·n(n−1) for a square array; root-to-leaf s(n−1), equidistant Instruction priceper issue Einstr = Btape(1 + Lt) + Bword·H + P·Bword with an 8-byte lane word: 5,660 fJ per issue (354 per lane) at P = 16, s = 32; 808,430 fJ (789.5 per lane) at P = 1,024, s = 66. Per lane it tends to 1.5·s fJ per word byte and never amortises: an H-tree is within 1.5× of the Steiner minimum (P−1)s of wire, which is a theorem about wire, not a modelling choice Tapesat the port strip, 8 B/ns; recv.T d striped (element l to lane l, priced P·w(Ein + 1 + trunk + root-to-leaf)); recvrec for un-transposed records; brecv one element to all lanes; recv1/send1 single-lane forms; send coalesced in lane order; port balance in bytes Memoryprivate lane memory at identical addresses (writes free), a lane-affine private form [a + σ·lane], a per-lane indexed window priced at its maximum (flagged as an upper bound), and the 32-bank plane with q = (b + σxlx + σyly) mod M: one distinct address per bank per ns, same-address reads broadcast, conflicts serialised, plane writes charged Shufflesshfl.T d, a, pat, k with xor, up, down, bcast, rot within 32-lane warps and rotx, roty, shx, shy on rows and columns; energy per lane w(⌈√a⌉ + s(|Δlx| + |Δly|) + 2); time max(flight, per-link bytes/8): a row rotation by nx/2 at P = 1,024 puts 64 B on one link, 8 ns, not 0.56 of flight Predication@p costs two word bytes and P⌈√p⌉; masked lanes pay everything and write nothing; not on sends, so tape consumption is static Makespan, areaT = Σ over issues of [1 + broadcast flight + max over lanes of operand flight + bytes/8 + conflicts], the lane maximum by an upper-envelope sweep over lane and loop boxes; closed-form at every rung. A = max(nxs, 1 + nys + HSH)²; the clock rider 0.125·H fJ/ns is charged

Worked examples

(a) The 220-byte sum, streamed, P = 16, s = 32: one striped recv.i32 (333,132 fJ, 9.09 ns) and one dp4a (6,204 fJ, 1.10 ns) per iteration, 16,384 iterations: 5.572 µJ in 166.95 µs, 12.6× the settled machine and 8.7× a same-tape single core, on 16,384 µm². Resident (the table in the lanes, s forced by capacity):

PsE (fJ)of which clockratio to v1T (ns)speed-upA (µm²)
1—724,764,725011,434,75714,198,401
165142,090,800,82553,134,5840.3545,944314,231,249
64258894,375,43730,460,1460.8111,2441284,264,225
256130475,498,64316,402,0141.522,8045124,330,561
1,02466265,853,6558,848,5202.737211,9914,464,769

Instruction delivery is 83–89% of the parallel machine's energy at every P: fat lanes lose 2.9×, thin lanes win 2.7×, the crossover is near P = 100. This is the GPU lesson in one table.

(b) The 64×64 int8 matmul, P = 16, s = 32, a 128×68 plane holding BT padded to bank-conflict-free rows, lane l owning columns j ≡ l (mod 16), a 4-row register tile and dp4a:

ConfigurationissuesE (fJ)on-chip (fJ)on-chip fJ/MACT (ns)A (µm²)
settled v1, blocked (2 issues per MAC)669,696146,421,52821,967,28083.8700,320 (same-tape 684,960)37,249
P = 4, s = 6424,576206,126,71383,246,71331830,77338,809
P = 16, s = 326,912193,115,45070,235,45026811,02138,809
P = 16, s = 646,912250,521,316127,641,31648711,79284,681

64× faster than the blocked single core (62× same-tape) for 1.32× the energy; on-chip energy triples because instruction delivery, 56–68% of it, is priced honestly, and dp4a is the only thing that keeps it there. The comparison with Scenario 1 is confounded by an ISA choice (decision P7): a Scenario-1 tile granted dp4a would cut its compute phase about eight-fold and land near 9,300 ns at P = 16, ahead of this array's 11,021 at 0.9× the energy — an estimate, not a calculator output.

Which machine: one streaming multiprocessor, with lane = CUDA core and register slice, decoder = warp scheduler, instruction tree = dispatch, data tree = operand collector, plane = shared memory with 32 banks, shfl = SHFL, predication = the SIMT mask, dp4a = IDP4A, brecv = the constant cache; 350–790 fJ of delivery per lane-instruction is of the order of published per-lane overheads. Scoring: closed-form at every rung (lane sums are lattice sums of piecewise-affine forms; about 2,500 judge lines; 1–20 ms per submission); deadlock impossible. Exploits closed: the P-ported plane and crossbar (32 banks, warp-scoped shuffles, a per-link rate), zero-footprint lanes (s ≥ 32 and the head block), data-dependent tape position across arms (bytes), data-dependent writer counts, the table bomb (immediates cost trunk plus tree per byte per issue), the unlabelled baseline. It rewards thin lanes with small private sets, coalesced striped I/O, register tiles, packed MACs, and ownership that makes lane order equal stream order; it punishes fat lanes, divergence, plane traffic without reuse, streaming, and scalar instruction-bound work (the sparse-parity search at P = 32 is 13× faster and 12.6× the energy).

Strongest surviving objection. On the energy board this scenario loses to P = 1 for every instruction-bound or streamed task, because the settled machine fetches a 14-byte instruction for 1 fJ and the thinnest legal lane array pays at least 110 fJ per issue; only resident, read-bound, packable problems flip. Either SIMT is scored as its own P ≥ 2 board (the recommendation) or P = 1 gets a priced instruction store, which breaks the P = 1 exactness that everything else here depends on.

9. Comparison

The rank is an adoption order under two constraints (the judge stays execution-free wherever possible; P = 1 stays exact) weighted by expressivity over the four target algorithms. No scenario is first on every criterion:

CriterionBest to worst
Judge cost, closed-form puritySIMT ≈ systolic > SPMD mesh > message passing
Determinism and deadlock, as specifiedSIMT = systolic (structural) > SPMD mesh (checker) ≈ message passing (credits + untimed run)
Expressivity over the four target algorithmsmessage passing (four, plus pipelines) > SPMD mesh (four) = SIMT (four, bounded routing) > systolic (one)
Time on the 64×64 matmulsystolic (204× compute-only) > SIMT (64×) > SPMD mesh ≈ message passing (15×)
Realism against the Dally and Roune anchorssystolic (the AI-CPU array, fed 16–32× below a TPU) ≈ message passing (Dally's die array, DMAs) > SPMD mesh > SIMT
Smallest delta to the settled specSPMD mesh > systolic > SIMT > message passing
1. SPMD tile mesh2. Systolic coprocessor3. Message-passing multicore4. SIMT lane array
New constants beyond the rulebooknone (S from k; P ≤ 4,096)s = 16 (8 declared), min(4K,16) B/ns, 1 fJ per PE-beat, trunk per beat, edge distances8-byte header, per-pair credits, 5,000 fJ + 20 ns per die crossing, 40,000 per board crossings ≥ 32, 16×16 head block, tree and trunk lengths, 32×4 B banks, 8- or 11-byte words
Instruction axisMIMD with shared text: multicast once, settled fetch per tile, 168 fJ/ns clockconfigured once; 1 fJ per beat plus trunkplus per-tile role text over its own pathone fetch, about 1.5·s fJ per lane per word byte per issue
Memory axisprivate diamonds, fixed lattice, uniform khead diamond, edge buffers, 32 B per PEplus landing windows and diesprivate, 32-bank plane, indexed window
Communication axiscollectives only, statically scheduled DMA16 fJ hops, lanes at δ, the head portplus packets with credits and crossingsshuffles at s·hops + 2 with a link rate, plane, trees
Closed-formenergy, area, makespanenergy, area, makespanenergy, area; makespan by simulationenergy, area, makespan
Judge: new lines, per submission≈2,600; 0.2–10 ms≈2,000–2,800; 0.5–5 ms≈4,700; ms to 2 s≈2,500; 1–20 ms
220 sum, streamed, P = 16 (settled 5.26 µJ, 2,103 µs)6.21 µJ, 131 µs (16.0× / 11.0× same-tape)0.96 µJ + load, 67 µs (a K-lane strip)as Scenario 15.57 µJ, 167 µs (12.6× / 8.7×)
220 sum, resident, P = 16 and best P (settled 725 nJ, 1,435 µs)381 nJ, 71.8 µs; 243 nJ at P = 256 (2.98×)960 nJ, 67 µs (loses)as Scenario 12.09 µJ, 45.9 µs; 266 nJ at P = 1,024 (2.73×)
64×64 matmul, best P (settled 146.4 nJ, 700 µs)294.4 nJ, 46.1 µs at P = 16 (15.2×); like-for-like clock 1.11×151.9 nJ (s = 16) or 142.4 (s = 8), 27.9 µs at K = 16 with 1 B/ns tapes; 6.4 µs inside a Scenario-1 tile299.9 nJ, 47.2 µs (Cannon, P = 16)193.1 nJ, 11.0 µs at P = 16 (64×)
Which machineDally's 256-core chip, GSPMDTPU matrix and vector unit, AI-CPU core, port-starvedEpiphany, SCC, Cerebras; a 16-die array; AI-CPU DMAsone GPU SM
Weakest pointbarriers only at collectives; P = 1 pays no clockthe pitch decides the energy verdict; a 16 B/ns feedsimulator tie-breaks are rulesthe 1 µm wire model is 4× above CACM per bit-mm
Fitstree reductions, SUMMA, model-parallel MLPs, candidate search, per-lane arms via lane-static modes, rungs (b)–(e) per tilerank-1-update wavefronts, im2col convolution, GF(2) matmulplus Cannon, pipelines with overlap, halos, MoE as a static all-to-all, 8192³SUMMA, reductions, oblivious search, packed inference
Cannotpoint-to-point, overlap of a lane's communication with its compute, data-dependent destinationsanything that is not a wavefront at K² parallelismremote reads, dynamic routing, work stealingper-lane data-dependent routing beyond a window, 2-D recursion over lanes
Writabilitybest: MPI or pmap vocabulary, 5–40-line programs; R9 and the pitch rule are the trapspick a PE program from a verified library of three, write strides; custom PE programs are an expert pathgood for MPI-shaped authors once mxchg exists; the tape schedule is the trapgood for CUDA-shaped authors; s set by the largest private array is the trap
P = 1 exactyes (E, T, A)yes at K = 0yesyes; lane forms rejected by grammar at P = 1

10. Recommendation and migration path

Adopt the SPMD tile mesh first. It is the smallest delta that makes the three invisible things visible — parallel makespan, cross-core locality, Dally's tree — while keeping the judge a formula: one header line, a stripe library with rule R9, seven scoped collectives, the 128×128 block, the clock rule and 8 B/ns tapes. Its scores are what the other three are compared against: every message-passing program that uses only collectives scores identically, the systolic array attaches to its tiles, SIMT is its own division. And it is the scenario in which the MNIST target reads correctly: the tier-3 MLP, whose weights are resident across epochs, is the “table produced in place” that makes the resident-sum dividend real rather than an artefact of dropping the load phase. Three things must be in its checker before it ships: R9 (stripe validity and the tape-phase recurrence), R1′ (affine lane addresses), and the P = 1 | P ≥ 2 split of the time board.

Then the systolic coprocessor inside a tile (“AI-CPU tile”: replicate P plus mesh K, D per tile), because it is the only scenario that prices Roune's thesis and its scoring is closed-form; the per-challenge flag is the PE pitch, and its first honest showcase is the 8192³ GEMM with panel-resident buffers. Message passing third, when the reference simulator exists and has been differentially tested against the closed forms on the collective primitives; its first user is the 8192³ Cannon. SIMT as a separate P ≥ 2 division, with decision P7 settling whether dp4a reaches the mesh's tiles.

Migration from the settled spec.

  1. Pin two settled conventions the designs found unwritten, as decisions: the port term (a recv.T occupies sizeof(T) ns at 1 B/ns with no issue slot; program-text transit is not in T at P = 1) and the area function ((2k−1)² over the lin(a) half-diamond). Correct the “5 pJ per byte” slip to per bit.
  2. The mesh: header, stripes with R9, collectives with charged landings, the block, the clock rule, 8 B/ns tapes, byte-based port balance and segment-wise arm padding (these two also tighten P = 1 modes: a settled program whose arms differ in recv width becomes invalid, a grammar change at no score change for programs that remain valid), and the reported columns Estatic, Ectl, Eclk-if-charged. Publish the resident-sum and matmul rows of §5 as reference scores; split the time board. Rung (a) stays P = 1 only.
  3. mesh K, D inside a tile, with the three PE programs shipped as a verified library and the vector pass.
  4. msend/mrecv/mxchg/put/release, windows, dies, with the simulator and the untimed credit run published as normative.
  5. lanes P, s, H_SH on its own leaderboard.

Deferrable, with no worked number depending on them: scoring Estatic; a banked head memory for the coprocessor; torus wrap links; asynchronous msend with a descriptor queue; heterogeneous tile radii and Roune-style mixed core kinds; per-die tape triples at Epkg; a v2 critical-path time division.

11. Animations

The three animations below are driven by event-level schedules, not by drawings. Every dot is a byte transfer along its Manhattan path, every filled region is a local phase, and the counters under each canvas accumulate the same energy and time the scorer would charge; the totals were cross-checked against an independent Python calculator to the femtojoule and nanosecond. Press play, drag the speed slider (log scale), or step from event to event. Long local phases are fast-forwarded while nothing visibly moves, and the readout says so.

Animation 1: Dally's table sum on a 4×4 tile lattice (Scenario 1, resident framing)

Sixteen tiles at a 162 µm pitch each hold 1 KiB of the table in their private diamond (k = 33; the 128×128 blocks under the heads are the core footprints). The 38-byte program crosses the instruction tape once and is multicast over the spanning tree (152,206 fJ, 11.27 ns); every tile sums its 1,024 bytes (30,669 fJ and 1,039.82 ns each: one issue per byte plus the accumulator round trip plus the read at ⌈√a⌉); then 4-byte partial sums climb a recursive-halving tree in four rounds (1,349 fJ per one-hop message, 2,157 per two-hop, 24,275 fJ and 26.8 ns in all); the result leaves by the output tape.

Counters: dynamic energy 687,197 fJ; clock 168 fJ/ns × 16 tiles × 1,079.40 ns = 2,901,436 fJ; total 3,588,633 fJ; makespan 1,079.40 ns; area 16 × (65² + 16,384) = 329,744 µm². The same 16,384 bytes on the settled single core (k = 129, mean read distance 85.9 µm against 21.95 on the lattice): 1,557,877 fJ in 17,199.88 ns on 66,049 µm². The lattice is 15.9× faster; on dynamic energy it is 2.27× cheaper (the sixteen local sums alone 3.13×); with its clock it costs 2.30× more than the uncharged single core and 1.24× less like for like. At 1 KiB per core the clock is 4.2× the movement; the dividend grows with the table (§5, resident rows). Streamed instead of resident, the same job is 0.82× the single core's energy and 10.7× faster, because the 16 KiB has to cross the tape and be distributed either way.

Animation 2: 32×32 int8 SUMMA on a 2×2 tile lattice (Scenario 1)

Four tiles at a 176 µm pitch (k = 47). The 420-byte program is multicast (354,180 fJ, 54.7 ns). The input tape streams 128 sixteen-byte segments of A and B in stream order into the owning tiles under the block2d stripe (the tape at 8 B/ns, each tile receiving 16 B per 6 ns); each tile all-gathers its row of A and column of B in eight 256-byte messages (673,068 fJ, 141 ns); four register-blocked sweeps of 20,992 issues compute C (535,084 fJ and 21,266 ns each); then 64 sixty-four-byte rows of C leave under the credit rule, and the pad is visibly starved for its first half by the 24-ns injection cadence of the two tiles that own the first rows.

Counters: dynamic energy 35,687,672 fJ (text 354,180; input 10,784,768; allgather 673,068; compute 2,140,336; output 21,735,320); clock 168 × 4 × 22,411.90 = 15,060,797 fJ; total 50,748,469 fJ; makespan 22,411.90 ns; area 4 × (93² + 16,384) = 100,132 µm²; compute 65.3 fJ/MAC. The settled single core with the same blocked kernel: 33,206,376 fJ in 91,389.82 ns on 10,609 µm². The lattice is 4.08× faster (3.91× against a same-tape single core) for 1.53× the energy (1.05× like for like); the two tapes are 64% of its energy and the clock 30%. The picture shows why: eight block messages and four long sweeps, with the input and output tapes as the only serial resources.

Animation 3: a Kung–Leiserson wavefront on a 4×4 systolic mesh (Scenario 2)

A 4×4 mesh of 16-µm processing elements hangs below the head in the Scenario-2 geometry, with the west and north edge buffers beside it and the head's memory diamond above holding A, B and C at lin(a) addresses. The 64-byte OS_MAC program is loaded once over the array's H-tree (23,873 fJ, 16.0 ns); the A rows and B columns are loaded into the west and north lanes through the head port at 16 B/ns (5.0 ns each); then the wavefront runs. PE(i,j) starts at beat i+j, each active beat does one MAC for 41 fJ (8 local, 16 forwarding A east, 16 forwarding B south, 1 of clock) while the trunk toggles for 36 fJ, for 22 beats including six skew beats; the four-beat northward drain (73 fJ per PE-beat) delivers the i32 tile to the north lanes, and the store carries the 64-byte C tile back through the head port (2,337 fJ, 5.0 ns).

Counters: dynamic energy 50,729 fJ (configuration 23,873; loads 5,873; mesh 18,620, of which trunk 972 and PE clock 432; store 2,337); makespan 58.26 ns; area 5,913 µm² by the Scenario-2 rule (a 729 µm² diamond plus the 72² array block); 1,613 events; 198 fJ/MAC with the one-time configuration, 105 without it. The settled single core with the blocked kernel (two issues per MAC, since the head has no fused MAC): 15,454 fJ (60.4 fJ/MAC) in 679.89 ns on 1,089 µm². The wavefront is 11.7× faster and 3.28× the energy (1.74× with the configuration amortised; 0.47× like for like with the head's clock charged). At this toy size the array's fixed costs dominate; the 64×64 table in §6 is where the PE pitch decides the verdict. Two choices the Scenario-2 text left open are recorded in the schedule: the drain is drawn as a synchronous shift of one PE per beat, which is what its pricing implies, and the skew applies to the MAC phase only.

12. Open decisions

#DecisionRecommended defaultAlternative and its cost
P1Tape rate for P ≥ 2, and the time board8 B/ns per tape (Dally's 64-bit quantum); P = 1 keeps 1 B/ns; the time board is split at P = 1 | P ≥ 2 (a replicate 2 shell with one idle lane runs the streamed sum 1.45× faster on the tape rate alone); every speed-up is also reported against a same-tape P = 1give P = 1 the 8 B/ns tape: one board, but every P = 1 time record is re-scored (the streamed sum 2,102,751 → 1,447,809 ns); or a priced multi-tape option, one tape per die edge at Ein each
P2Fetch continuity4 fJ per line + 1 fJ per issue per tile everywhere, plus each scenario's delivery terma located loop buffer at about 5 fJ per instruction byte for all P is the physically honest MIMD price but re-scores every P = 1 record by 2–24%
P3Static energyreport Estatic = A·T × 1 fJ per µm² per µs as a column and run an A·T board; do not score it yetscoring it changes P = 1 (6.0 µJ against 0.73 µJ on the resident sum) and makes resident tasks far better parallel; the constant has a ±10× band
P4Idle-clock termone rule for all scenarios: 0.125 fJ per bit-micron of the declared control structure's clock tree per ns, gated or not (168 fJ/ns per tile, 720 fJ per beat for a K = 16 array); scored for P ≥ 2; “Eclk if charged at P = 1” reported. To accept: the 16-tile matmul costs 2.0× the settled energy (1.11× like for like) and the resident sum's dividend caps near 3×omit it and idle silicon is free (4,096 declared cores cost nothing; the energy board's optimum is Pmax); or charge P = 1 too, moving every P = 1 energy record by 7–80%
P5Area ruleΣ settled squares + P × 16,384 (0 at P = 1); pitch S = max(2k−1, k+129)the centred (2K+1)² tile is 4× the settled area at the same K and breaks P = 1 exactness; a 64×64 block under-sizes the buffers 4×
P6Write pricinglanding writes of collectives and messages charged; tape landings and local writes free (settled D2)charging all writes for P ≥ 2 is cleaner, at a declared P = 1 → 2 step; a banked head memory for the coprocessor is the same family of decision
P7SIMT board and dp4aSIMT on its own P ≥ 2 board; dp4a/dp2a rejected at P = 1 and in mesh tilesadopting dp4a into v1 drops the 16×16 record 4× overnight; adopting it into mesh tiles makes the mesh beat SIMT on 64×64 matmul time (about 9,300 against 11,021 ns, an estimate)
P8Makespan on the general paththe published integer-tick simulator plus the untimed credit run are normative; tier 3 accepts only collective-structured or judge-verified periodic programsfree-form point-to-point at tier 3 costs hours per submission (4×108 events as first drafted)

Summarized in one sentence: put the settled machine on a lattice and let tiles talk only through priced, statically scheduled collectives, and the judge stays a formula while parallel time, cross-core locality and the cost of idle silicon all become visible; everything more expressive than that is a simulator, and everything more specialised is a coprocessor.

13. References

  1. W. J. Dally, “On the model of computation: Point. We must extend our model of computation to account for cost and location,” Communications of the ACM 65(9), September 2022, pp. 30–32, cacm.acm.org — the PECM, the SRAM numbers, the 256-core table-sum example.
  2. B. H. Roune, “Designing AI Chip Software and Hardware,” 2026, Google Doc — the AI-CPU thesis, systolic-array size forces, torus and all-reduce arithmetic, SRAM-to-network DMAs.
  3. “Compare matmul costs across chips,” Codex thread, September 2026 — the 1 fJ-per-step calibration against Dally's SRAM hierarchy; c/120 vs c/1200; the 8 KiB sub-array as a 32-shell half-diamond. Companion pages: the A100 grid energy report.
  4. “The Grid VM: competition design and feasibility,” this repository, September 4, 2026 — the settled single-core machine, decisions D1–D6, the rung-(a)–(e) language.
  5. “The expressivity–scorability ladder” and “Fixed or moving I/O order?”, this repository — closed-form scoring by rung; the tapes, determinacy, and the remark that nothing rewards parallelism.
  6. “Proposal: a streamed instruction processor and a compact schedule language,” this repository, September 4, 2026 — the four-port geometry, the canonical instruction encoding, charged reads and writes.
  7. H. T. Kung and C. E. Leiserson, “Systolic arrays (for VLSI),” 1978/79 — the wavefront schedule of Scenario 2 and Animation 3.
  8. Y. Xu et al., “GSPMD: general and scalable parallelization for ML computation graphs,” 2021 — the programming model Scenario 1 prices (partition ids, all-reduce, all-gather, collective-permute on a mesh).
  9. N. P. Jouppi et al., “Ten lessons from three generations shaped Google's TPUv4i,” ISCA 2021; “In-datacenter performance analysis of a tensor processing unit,” ISCA 2017 — the matrix unit fed from a banked vector memory that Scenario 2 approximates with a 16 B/ns port.
  10. A. Olofsson, “Epiphany-V: a 1024-processor 64-bit RISC system-on-chip,” 2016; Intel SCC; Cerebras WSE — the manycore anchors of Scenario 3.
  11. G. Kahn, “The semantics of a simple language for parallel programming,” IFIP 1974 — determinacy of the message-passing and collective networks.
  12. C. Sun et al., “DSENT: a tool connecting emerging photonics with electronics for opto-electronic networks-on-chip modeling,” NOCS 2012 — the router energy band behind the 40 fJ transit constant.
  13. lowRISC, the Ibex RISC-V core — the microcontroller-class core behind the 128×128 block and the 1,000 fJ per instruction control column.
  14. A. Aggarwal, B. Alpern, A. Chandra, M. Snir, “A model for hierarchical memory,” STOC 1987; L. Yavits, A. Morad, R. Ginosar, “Cache hierarchy optimization,” 2014 — the √-priced memory and the bank-plus-network latency decomposition that the hierarchy numbers follow.
  15. NVIDIA, PTX ISA (dp4a, shfl, predication, shared-memory banks) — the vocabulary of Scenario 4.