Technical note · interactive
Justifying Dally's Heuristics
In his 2022 Communications of the ACM essay, Bill Dally argues that a model of computation has to price distance. He quotes about fifteen energy and time figures. Each of them follows from six physical constants. This page rebuilds every figure and lets you change the constants.
Every figure in the essay rebuilds from six constants
Dally's figures, next to the reconstruction on this page. Thirteen match to the precision he quotes. The add and the sub-array come within \(25\%\) and \(15\%\). The \(230\times\) needs one inferred step.
| Figure in the essay | Dally states | Rebuilt here | Fit |
|---|---|---|---|
| \(32\)-bit add | \(20\,\mathrm{fJ}\), \(150\,\mathrm{ps}\) | \(15\,\mathrm{fJ}\), Horowitz scaled to \(5\,\mathrm{nm}\); \(\approx12\) gate delays | close |
| Move \(64\) bits \(1\,\mathrm{mm}\) | \(1.9\,\mathrm{pJ}\), \(400\,\mathrm{ps}\) | \(64\times30\,\mathrm{fJ}\); repeated wire at \(2.5\,\mathrm{mm/ns}\) | exact |
| \(64\) bits corner to corner, \(400\,\mathrm{mm^2}\) chip | \(77\,\mathrm{pJ}\), \(16\,\mathrm{ns}\) | \(40\,\mathrm{mm}\times1.92\,\mathrm{pJ/mm}=76.8\,\mathrm{pJ}\); \(40\times0.4=16\,\mathrm{ns}\) | exact |
| Going off chip | \(320\,\mathrm{pJ}\); \(6\,\mathrm{ns/m}\) | \(5\,\mathrm{pJ/bit}\) link; a board trace at \(\approx c/1.8\) | exact |
| \(8\,\mathrm{KB}\) sub-array, \(64\)-bit read | \(0.64\,\mathrm{pJ}\), \(300\,\mathrm{ps}\) | \(0.61\,\mathrm{pJ}\), \(230\)–\(290\,\mathrm{ps}\) from circuit budgets | close |
| \(256\,\mathrm{MB}\) area | \(\approx100\,\mathrm{mm^2}\) | \(0.021\,\mu\mathrm{m^2}\) cell at \(45\%\) array efficiency | exact |
| \(256\,\mathrm{MB}\) access | \(58\,\mathrm{pJ}\), \(12.3\,\mathrm{ns}\) | \(0.64+30\times1.92=58.2\,\mathrm{pJ}\); \(0.3+30\times0.4=12.3\,\mathrm{ns}\) | exact |
| "\(15\,\mathrm{mm}\) each way" | \(30\,\mathrm{mm}\) round trip | \(1.5L\): the \(87.5\)th percentile from a corner | exact |
| Core at the centre of \(2\,\mathrm{MB}\) | \(1\,\mathrm{mm}\) round trip, \(1.9\,\mathrm{pJ}\), \(400\,\mathrm{ps}\) | mean centre-to-point distance \(L/2\) each way | exact |
| Random access, \(16\,\mathrm{mm}\) chip | \(21.3\,\mathrm{mm}\) | \(4L/3=21.33\,\mathrm{mm}\) | exact |
| Average random access, \(4\times4\) chips | \(680\,\mathrm{pJ}\) | \(41+\tfrac{15}{16}(640+41)=679\,\mathrm{pJ}\) | exact |
| Random versus local | \(354\times\) | \(680/1.92=354\) | exact |
| Local sum, all-in | \(230\times\) cheaper | \((680+1.04)/(1.92+1.04)=230\) | inferred |
| DRAM fetch of two \(32\)-bit words | \(1.3\,\mathrm{nJ}\), \(64{,}000\times\) an add | \(64\times20\,\mathrm{pJ}=1.28\,\mathrm{nJ}\); \(\div\,20\,\mathrm{fJ}=64{,}000\) | exact |
| CPU add instruction | \(80\,\mathrm{pJ}\); memory "only \(15\times\)" | \(1.2\,\mathrm{nJ}\div80\,\mathrm{pJ}=15\) | exact |
| Store or recompute | \(640\,\mathrm{pJ}\) vs \(160\,\mathrm{fJ}\)/MAC; \(n\lt4{,}000\); \(16\times\) at \(n=256\) | \(640/0.16=4{,}000\); \(640/(256\times0.16)=15.6\) | exact |
Arithmetic is nearly free; distance is not
Dally's price list on one log scale. Switch the unit to read each cost as the distance a \(64\)-bit word could travel on chip for the same energy, or as a count of \(32\)-bit adds.
Going off chip once costs as much as \(16{,}000\) adds
- moving data
- computing on it
At \(1.92\,\mathrm{pJ}\) per word-millimetre, every cost becomes a distance. A sub-array read is \(0.33\,\mathrm{mm}\) of wire. Going off chip once is \(167\,\mathrm{mm}\), ten chips' width. A DRAM fetch is \(667\,\mathrm{mm}\).
Six constants generate the whole table
Process: six constants
Transport: what a bit pays on the way
Energy per bit per millimetre
Signal speed
Endpoint: the \(8\,\mathrm{KB}\) sub-array at the end of the wire
Any access: distance, then energy and time
Off chip, add \(b\,e_{io}\) for each chip crossing.
Here \(\alpha\) is the fraction of bits that toggle, \(f_{\text{rep}}\) the extra capacitance of repeaters, \(p\) the pipelining overhead of a real fabric, \(b\) the word width and \(\kappa\) the distance convention. Dally names no process; these values fit a \(5\)-nm-class chip at about \(0.75\,\mathrm{V}\).
The hardware the numbers imply
| Parameter | Value | Evidence |
|---|---|---|
| Process | \(5\)-nm class (TSMC N5), 2020–22 | \(20\,\mathrm{fJ}\) add; SRAM density; Dally's group built a \(5\)-nm accelerator in 2022 |
| Supply | \(V\approx0.75\,\mathrm{V}\) | \(30\,\mathrm{fJ}\) at \(c=0.2\,\mathrm{fF}/\mu\mathrm{m}\) with random data |
| SRAM cell | six-transistor, \(0.021\,\mu\mathrm{m^2}\) | \(256\,\mathrm{MB}\) in \(100\,\mathrm{mm^2}\) at \(45\%\) array efficiency |
| Sub-array | \(8\,\mathrm{KB}=256\times256\) cells | stated |
| Chip | \(16\times16\,\mathrm{mm}\); \(256\) cores with \(2\,\mathrm{MB}\) each | stated |
| System | \(4\times4\) chips on a board | stated |
| Gate delay | FO4 \(\approx12\,\mathrm{ps}\), \(R_0C_0\approx5\,\mathrm{ps}\) | \(300\,\mathrm{ps}\approx25\) gate delays |
Energy
A bit-millimetre costs \(30\,\mathrm{fJ}\) because a wire is a capacitor
Moving a bit one millimetre moves \(2{,}000\) gates' worth of charge
One millimetre of wire holds the charge of \(2{,}000\) transistor gates
- one gate, \(C\approx0.1\,\mathrm{fF}\): \(\approx470\) electrons
- one millimetre of wire, \(C=200\,\mathrm{fF}\): \(\approx940{,}000\) electrons
A logic \(1\) on a wire is charge held at the supply voltage, \(Q=CV\). A \(5\)-nm gate holds a few hundred electrons; a millimetre of wire holds nearly a million. That ratio, not transistor speed, is why communication dominates.
Charging \(C\) to \(V\) draws \(CV^2\) from the supply. Half is stored, half is burned in the resistance on the way in, and the stored half is burned on discharge. Each transition costs \(\tfrac12CV^2\) whatever the resistance, so lowering \(R\) makes a wire faster, never cheaper. Random data toggles a wire on half its bits, \(\alpha\approx\tfrac12\):
Capacitance per unit length is a shape factor, so it doesn't scale
About four-fifths of a wire's capacitance couples sideways, to its neighbours
- \(C_{\text{lat}}\), to the neighbours on the same layer
- \(C_{\text{vert}}\), to the layers above and below
Each face of a wire is a small parallel-plate capacitor, and every term is a ratio of lengths. Shrink a wire and its neighbours together and \(c\) stays put. Low-k dielectrics offset taller, closer-packed wires, so \(c\) has sat near \(0.2\,\mathrm{fF}/\mu\mathrm{m}\) since the 1990s.
Derivation
Take \(H=2W\), \(S=W\), \(T=H\) and a low-k oxide with \(k=3.0\), so \(\varepsilon=2.66\times10^{-11}\,\mathrm{F/m}\). The lateral term is \(0.106\,\mathrm{fF}/\mu\mathrm{m}\), the vertical term \(0.027\,\mathrm{fF}/\mu\mathrm{m}\), and fringing adds \(30\)–\(50\%\): \(c\approx0.17\)–\(0.20\,\mathrm{fF}/\mu\mathrm{m}\). The same wire in \(\mathrm{SiO_2}\) (\(k=3.9\)) gives \(0.22\)–\(0.26\,\mathrm{fF}/\mu\mathrm{m}\). Progress on k stalled near \(2.5\)–\(3.0\) around 2010, when more porous dielectrics stopped surviving polishing and packaging.
Dally's \(30\,\mathrm{fJ}\) is that wire at \(\tfrac34\,\mathrm{V}\) carrying random data
The same physics allows \(25\) to \(130\,\mathrm{fJ}\); the convention decides
Published conventions, in \(\mathrm{fJ/(bit\cdot mm)}\):
- your setting
The \(0.1\,\mathrm{pJ}\) per bit-millimetre rule of the 2010s is the same wire at \(1\,\mathrm{V}\) with every bit toggling. Dally's \(30\,\mathrm{fJ}\) sits between a bare wire (\(28\)) and one with a third more load from repeaters (\(37\)). A model that quotes energy per bit-millimetre should state its \(V\), \(\alpha\) and repeater load.
Speed
Signals crawl at \(c/120\) because on-chip wires are RC lines
Resistance per unit length grows with every shrink
| Wire class | \(W\times H\) | \(\rho_{\text{eff}}\) | \(r\) | Carries |
|---|---|---|---|---|
| Intermediate | \(35\times70\,\mathrm{nm}\) | \(4.5\,\mu\Omega\,\mathrm{cm}\) | \(18\,\mathrm{k\Omega/mm}\) | buses |
| Global | \(150\times300\,\mathrm{nm}\) | \(2.5\,\mu\Omega\,\mathrm{cm}\) | \(0.6\,\mathrm{k\Omega/mm}\) | clocks, power, a few signals |
Both dimensions shrink, so \(r\) grows as the square of the shrink. Below copper's \(39\,\mathrm{nm}\) electron mean free path, its resistivity climbs too. Buses ride the intermediate layers, where \(rc\approx3.6\,\mathrm{ns/mm^2}\).
Unrepeated delay grows as \(L^2\); repeated delay grows as \(L\)
At \(15\,\mathrm{mm}\), repeaters cut \(308\,\mathrm{ns}\) to \(5\,\mathrm{ns}\)
- intermediate, repeated
- intermediate, unrepeated
- global, repeated
- global, unrepeated
- Dally, \(0.4\,\mathrm{ns/mm}\)
A distributed RC line charges by diffusion, and its resistance and capacitance both grow with length. Its \(50\%\) delay is \(t\approx0.38\,rcL^2\); a lumped RC would take \(0.69\,RC\). Unrepeated, \(15\,\mathrm{mm}\) of intermediate metal takes about a thousand clock cycles.
Repeaters trade wire delay for gate delay, and the optimum is a square root
A \(15\,\mathrm{mm}\) bus is fastest with a repeater every \(49\,\mu\mathrm{m}\)
- total \(T(k)\)
- wire term
- repeater term
- optimum
Choosing both the number and the size of the repeaters (Bakoglu, 1990) gives
Delay becomes linear in length, at a velocity set by the geometric mean of the gate and wire time constants: \(0.34\,\mathrm{ns/mm}\) here. Pipelining and arbitration add about \(20\%\), which gives Dally's \(0.4\,\mathrm{ns/mm}\). Each process node shrinks \(R_0C_0\) and grows \(rc\) by similar factors, so the product barely moves. Repeated wires have stayed within \(2\times\) of \(0.3\,\mathrm{ns/mm}\) since the \(130\)-nm node, while gates got \(10\times\) faster.
On-chip signals move \(70\times\) slower than light in the same glass
Board traces run near light speed; on-chip wires don't
- RC wires on chip
- light, and transmission lines
Light in the chip's dielectric would cover \(173\,\mathrm{mm/ns}\), but on-chip wires are too resistive to act as transmission lines. Board traces do act as transmission lines, so Dally prices the board in energy and adds only \(6\,\mathrm{ns}\) per metre.
Memory
Memory is two-dimensional, so access cost grows as \(\sqrt{N}\)
Where the requester sits sets the distance
Dally's \(15\,\mathrm{mm}\) covers \(87.5\%\) of accesses from a corner of a \(10\,\mathrm{mm}\) block
Paths follow the wiring grid: across, then down. The drawing shows \(40\) of the sampled accesses.
| Requester to a random target | Mean one-way | Round trip |
|---|---|---|
| Centre of the square | \(L/2\) | \(L\) |
| Another random point | \(2L/3\) | \(4L/3\) |
| Midpoint of an edge | \(3L/4\) | \(3L/2\) |
| Corner | \(L\) | \(2L\) |
| Corner to the far corner | \(2L\) | \(4L\) |
For uniform targets \(\mathbb{E}\lvert x-y\rvert=L/3\) along each axis, and Manhattan distance adds the two axes. A core at the centre of its \(1\,\mathrm{mm}\) tile travels \(L/2\) each way: Dally's \(1\,\mathrm{mm}\) round trip. Two random points on a \(16\,\mathrm{mm}\) chip are \(2L/3\) apart: his \(21.3\,\mathrm{mm}\).
His "\(15\,\mathrm{mm}\) each way" for the \(10\,\mathrm{mm}\) block that holds \(256\,\mathrm{MB}\) is no mean. It is \(1.5L\), the \(87.5\)th percentile of distance from a corner: a deliberately conservative figure. Latency budgets want a high percentile; energy budgets want the mean.
Every \(4\times\) in capacity costs \(2\times\) in energy and time
From \(8\,\mathrm{KB}\) to \(256\,\mathrm{MB}\), capacity grows \(32{,}768\times\) and wire cost \(181\times\)
- random point to random point, \(\kappa=\tfrac23\)
- Dally's conservative \(\kappa=1.5\)
- endpoint only, \(E_0\) or \(t_0\)
- Dally's figures
Small memories pay mostly for the endpoint, large ones for the wire. Energy crosses over near \(160\,\mathrm{KB}\), the size of an L2 cache; latency crosses near \(0.8\,\mathrm{MB}\). That is why cache hierarchies are geometric. A level \(4\times\) larger is \(2\times\) slower and \(2\times\) dearer to reach, so each level belongs where the reuse it captures pays for that factor of two.
The \(256\,\mathrm{MB}\) access under each distance convention
| One way | Convention | Energy | Latency |
|---|---|---|---|
| \(6.7\,\mathrm{mm}\) one way | random point to random point | \(26\,\mathrm{pJ}\) | \(5.6\,\mathrm{ns}\) |
| \(10\,\mathrm{mm}\) one way | corner to a random point, mean | \(39\,\mathrm{pJ}\) | \(8.3\,\mathrm{ns}\) |
| \(15\,\mathrm{mm}\) one way | Dally: \(87.5\)th percentile from a corner | \(58\,\mathrm{pJ}\) | \(12.3\,\mathrm{ns}\) |
| \(20\,\mathrm{mm}\) one way | corner to the far corner | \(77\,\mathrm{pJ}\) | \(16.3\,\mathrm{ns}\) |
A sub-array's \(0.64\,\mathrm{pJ}\) is short wires, not bit cells
Bitlines and sense amplifiers take \(72\%\) of a sub-array read
| Stage | Energy | Time |
|---|---|---|
| Decoder and wordline driver | \(30\,\mathrm{fJ}\) | \(70\,\mathrm{ps}\) |
| Wordline across \(256\) columns | \(17\,\mathrm{fJ}\) | \(40\,\mathrm{ps}\) |
| Bitlines, \(256\) pairs | \(250\,\mathrm{fJ}\) | \(60\,\mathrm{ps}\) |
| \(64\) sense amplifiers | \(190\,\mathrm{fJ}\) | \(40\,\mathrm{ps}\) |
| Column mux and output | \(120\,\mathrm{fJ}\) | \(50\,\mathrm{ps}\) |
| Total, versus Dally's | \(607\) of \(640\,\mathrm{fJ}\) | \(260\) of \(300\,\mathrm{ps}\) |
An \(8\,\mathrm{KB}\) sub-array is \(256\) wordlines by \(256\) columns of six-transistor cells, about \(60\times45\,\mu\mathrm{m}\) with its periphery. A \(64\)-bit read fires one wordline across all \(256\) columns and senses \(64\) of them through a \(4{:}1\) multiplexer.
"The time and energy needed to read or write a single bit cell is negligible."Dally (2022)
The cell itself contributes under \(1\,\mathrm{fJ}\). The \(300\,\mathrm{ps}\) is about \(25\) gate delays: decode, three short RC lines and one small-signal sense. It is the fixed \(t_0\) that a pure distance model lacks.
How each stage is estimated
Wordline: \(54\,\mu\mathrm{m}\) of wire (\(11\,\mathrm{fF}\)) plus \(512\) pass-gate gates (\(20\,\mathrm{fF}\)), charged and discharged: \(31\,\mathrm{fF}\times(0.75\,\mathrm{V})^2\approx17\,\mathrm{fJ}\). Its distributed RC adds about \(20\,\mathrm{ps}\) to the driver.
Bitlines: each of the \(256\) pairs is about \(13\,\mathrm{fF}\), and one side swings \(100\,\mathrm{mV}\) before it is restored: \(C\,V\,\Delta V\approx1\,\mathrm{fJ}\) per pair. At a cell current of \(40\,\mu\mathrm{A}\), the signal takes \(C\Delta V/I\approx33\,\mathrm{ps}\) to develop, plus margin for offset.
The \(4{:}1\) overfetch is a small version of the waste in a DRAM's \(8\)-kilobit rows: a \(64\)-bit read charges \(256\) bitlines.
\(256\,\mathrm{MB}\) fits in \(100\,\mathrm{mm^2}\) at \(45\%\) array efficiency
Bit cells fill under half of a large SRAM
- bit cells, \(45\%\)
- sense amplifiers, decoders, drivers, redundancy, ECC, power and routing, \(55\%\)
Density enters only as \(\sqrt{D}\): doubling it shrinks every distance by \(\sqrt2\). SRAM cells have barely shrunk since N5, from \(0.021\,\mu\mathrm{m^2}\) at N5 and N3E to about \(0.0175\,\mu\mathrm{m^2}\) at N2. The way to bring a large memory closer now is to stack it.
Off chip
Leaving the chip costs \(5\,\mathrm{pJ}\) per bit, each way
Dally's off-chip figures sit inside the range of real links
- Dally's figures
- typical ranges
Dally's \(320\,\mathrm{pJ}\) to go off chip is \(5\,\mathrm{pJ/bit}\) for a \(64\)-bit word. A remote access crosses twice, request out and data back, hence the \(640\,\mathrm{pJ}\) in his summation example. His DRAM figures, \(1.3\,\mathrm{nJ}\) per \(64\) bits and \(640\,\mathrm{pJ}\) to write and re-read a \(16\)-bit activation, are both \(20\,\mathrm{pJ}\) per bit per direction.
Above a few \(\mathrm{Gb/s}\) a board trace is a transmission line, terminated in about \(50\,\Omega\), so it draws current whether or not bits toggle. Pads, ESD structures and package capacitance add more, as do equalizers, clock recovery and serializers at both ends.
A \(5\,\mathrm{pJ/bit}\) link budget
Termination: a \(450\,\mathrm{mV}\) swing into \(50\,\Omega\) is \(9\,\mathrm{mA}\) per lane, about \(8\,\mathrm{mW}\) at a \(0.9\,\mathrm{V}\) I/O supply, or \(0.3\)–\(0.8\,\mathrm{pJ/bit}\) at \(10\)–\(25\,\mathrm{Gb/s}\). Transmit and receive circuits cost \(1\)–\(3\,\mathrm{pJ/bit}\) per end at \(5\,\mathrm{nm}\). Protocol, CRC, retry buffers and the on-die path to the PHY add \(0.2\)–\(0.3\,\mathrm{pJ/bit}\).
Arithmetic
An add costs \(20\,\mathrm{fJ}\); overhead and distance cost the rest
The \(64{,}000\times\) is a DRAM fetch over an add; a CPU shrinks it to \(15\times\)
A CPU's overhead hides \(4{,}000\times\) of the gap
Horowitz's \(45\)-nm table puts a \(32\)-bit add at \(0.1\,\mathrm{pJ}\). Going to \(5\,\mathrm{nm}\), the switched capacitance falls about \(4.5\times\) and \(V^2\) falls \(1.44\times\), which leaves \(15\,\mathrm{fJ}\), close to Dally's \(20\,\mathrm{fJ}\). Fetching the two operands from DRAM at \(20\,\mathrm{pJ/bit}\) costs \(1.28\,\mathrm{nJ}\), exactly \(64{,}000\) adds.
A CPU wraps the add in instruction fetch, decode, register reads and pipeline control, \(80\,\mathrm{pJ}\) in all. Against that, a \(1.2\,\mathrm{nJ}\) memory access looks only \(15\times\) dearer. A domain-specific accelerator strips the overhead and exposes the whole gap.
Recompute beats store when a layer has fewer than \(4{,}000\) inputs
At \(n=256\), recomputing an activation is \(16\times\) cheaper than storing it
Backpropagation needs each layer's activations. Storing one to DRAM and reading it back costs \(640\,\mathrm{pJ}\). Recomputing it is a matrix-vector product, \(n\) multiply-accumulates at \(160\,\mathrm{fJ}\) each. Recompute wins while \(n\cdot0.16\,\mathrm{pJ}\lt640\,\mathrm{pJ}\), that is for \(n\lt4{,}000\). With HBM the threshold falls to \(n\approx600\), the same arithmetic that drives FlashAttention-style recomputation.
Placing data at random makes a sum \(230\times\) dearer
Per word summed: \(2.96\,\mathrm{pJ}\) locally, \(680\,\mathrm{pJ}\) at random
- wire on the home chip
- \(\tfrac{15}{16}\) of words cross chips: \(600\,\mathrm{pJ}\)
- wire on the far chip
- sub-array read and add, \(1.04\,\mathrm{pJ}\)
Dally's example sums a table spread over \(4\times4\) chips of \(256\) cores, each core holding \(256\mathrm{K}\) words in its own \(2\,\mathrm{MB}\). Summing locally costs \(1.92\,\mathrm{pJ}\) of wire per word. At random, every word travels \(21.3\,\mathrm{mm}\) on its home chip, and the \(15/16\) that live elsewhere add \(640\,\mathrm{pJ}\) and another \(21.3\,\mathrm{mm}\):
Dally's all-in \(230\times\) follows if both sides also pay the per-word work they share: the \(0.64\,\mathrm{pJ}\) sub-array read and about \(0.4\,\mathrm{pJ}\) for the add, \((680+1.04)/(1.92+1.04)\approx230\). He doesn't show this step; it is the simplest one that reproduces his number.
Calculator
Recompute every figure for another process
"Dally" pins the transport constants to his. Drag any constant to derive them from the process instead; every row updates.
| Quantity | This model | Dally |
|---|---|---|
| Transport energy \(e_w\) | \(30\,\mathrm{fJ/(bit\cdot mm)}\) | |
| Signal speed \(v\) | \(2.5\,\mathrm{mm/ns}\) | |
| Repeater spacing | not stated | |
| \(64\) bits over \(1\,\mathrm{mm}\) | \(1.9\,\mathrm{pJ}\), \(400\,\mathrm{ps}\) | |
| \(64\) bits corner to corner, \(40\,\mathrm{mm}\) | \(77\,\mathrm{pJ}\), \(16\,\mathrm{ns}\) | |
| \(256\,\mathrm{MB}\) access, \(1.5L\) each way | \(58\,\mathrm{pJ}\), \(12.3\,\mathrm{ns}\) | |
| Random access on a \(16\,\mathrm{mm}\) chip | \(21.3\,\mathrm{mm}\) | |
| Average random access, \(4\times4\) chips | \(680\,\mathrm{pJ}\) | |
| Random over local | \(354\times\) | |
| Local sum, all-in | \(230\times\) |
The same model in Python
import math
# Process constants: 5-nm class, about 2022
c = 0.2e-12 # F/mm, wire capacitance (0.2 fF/um)
r = 18e3 # ohm/mm, intermediate-metal resistance
V = 0.75 # V, supply
R0C0 = 5e-12 # s, inverter time constant
D = 21.4e6 # bit/mm^2, effective SRAM density
e_io = 5e-12 # J/bit for each chip crossing
alpha, f_rep, pipe = 0.5, 0.1, 1.2 # activity, repeater load, fabric overhead
E0, t0 = 0.64e-12, 0.3e-9 # 64-bit sub-array access (Dally)
e_w = alpha * 0.5 * c * (1 + f_rep) * V**2 # J per bit-mm
v = 1 / (2.5 * math.sqrt(R0C0 * r * c)) / pipe # mm per s
Lseg = math.sqrt(0.7 * R0C0 / (0.4 * r * c)) # mm between repeaters
def move(d_mm, b=64):
"""Energy (J) and time (s) to move b bits d_mm millimetres."""
return b * e_w * d_mm, d_mm / v
def sram(n_bits, kappa, b=64):
"""Access to a square SRAM of n_bits; kappa sets the one-way distance."""
side = math.sqrt(n_bits / D)
E, t = move(2 * kappa * side, b)
return E0 + E, t0 + t
E1, t1 = move(1.0) # core at the centre of its 1-mm tile
E256, t256 = sram(2**31, kappa=1.5) # 256 MB, Dally's 15 mm each way
Er, tr = move(4 * 16 / 3) # random point to random point, 16-mm chip
avg = Er + 15/16 * (2 * 64 * e_io + Er) # 4x4 chips: 15/16 of accesses leave the chip
print(f"e_w = {e_w*1e15:.1f} fJ/bit-mm, v = {v*1e-9:.2f} mm/ns, L_seg = {Lseg*1e3:.0f} um")
print(f"1 mm : {E1*1e12:5.2f} pJ {t1*1e9:5.2f} ns (Dally 1.9 pJ, 0.4 ns)")
print(f"256 MB : {E256*1e12:5.1f} pJ {t256*1e9:5.1f} ns (Dally 58 pJ, 12.3 ns)")
print(f"random : {avg*1e12:5.0f} pJ, {avg/E1:.0f}x local (Dally 680 pJ, 354x)")
Output:
e_w = 30.9 fJ/bit-mm, v = 2.48 mm/ns, L_seg = 49 um 1 mm : 1.98 pJ 0.40 ns (Dally 1.9 pJ, 0.4 ns) 256 MB : 60.1 pJ 12.4 ns (Dally 58 pJ, 12.3 ns) random : 682 pJ, 344x local (Dally 680 pJ, 354x)
Where the heuristics bend
Activity and swing
\(30\,\mathrm{fJ}\) assumes random data at full swing. Low-swing signalling cuts it \(2\)–\(4\times\); crosstalk can double it.
Queueing
\(0.4\,\mathrm{ns/mm}\) is unloaded transport. Routers add cycles, and under load, queues that can exceed the wire time.
Which metal
Upper layers are \(3\)–\(5\times\) faster per millimetre, but scarce. Velocity is a budget decision.
Which statistic
Mean, percentile and worst case differ by up to \(3\times\) for one memory. Say which one you charge.
The third dimension
Hybrid bonding replaces \(\sqrt{N/D}\) with a vertical hop of tens of micrometres. It is the one lever that moves the constant by \(10\times\).
Off-chip variance
Links span \(0.3\)–\(20\,\mathrm{pJ/bit}\). On a package, Dally's \(640\,\mathrm{pJ}\) remote access would cost \(40\)–\(130\,\mathrm{pJ}\).
Locality is the point
The \(\sqrt{N}\) rule prices uniformly random access. Reuse replaces \(N\) with the working set that actually moves, which is Dally's case for a model of location.
Reconciling with the Sutro grid model
The Sutro Group's grid model charges \(1\,\mathrm{fJ}\) per byte per \(\mu\mathrm{m}\), which is \(125\,\mathrm{fJ/(bit\cdot mm)}\): the same wire at \(\alpha=1\) and \(0.8\,\mathrm{V}\), \(4.2\times\) Dally's convention. Its signal speed, \(c/160=0.53\,\mathrm{ns/mm}\), is Dally's wire with more pipelining overhead counted. It charges mean distances, while Dally's \(256\,\mathrm{MB}\) figure is a high percentile. Neither is wrong; each should state what it charges.
Sources and revision notes
Part of Interlude show: Memory Wall research, the summary of the research behind the show.
- 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), Sept. 2022. doi:10.1145/3548783. Every figure attributed to Dally.
- U. Vishkin, "On the Model of Computation: Counterpoint," same issue. doi:10.1145/3548784.
- H. B. Bakoglu, Circuits, Interconnections, and Packaging for VLSI, Addison-Wesley, 1990. Optimal repeater insertion.
- W. C. Elmore, Journal of Applied Physics 19, 1948; T. Sakurai, IEEE Transactions on Electron Devices 40(1), 1993. RC delay.
- R. Ho, K. W. Mai, M. A. Horowitz, "The Future of Wires," Proceedings of the IEEE 89(4), 2001.
- M. Horowitz, "Computing's Energy Problem (and What We Can Do About It)," ISSCC 2014. The \(45\)-nm energy table.
- W. J. Dally and J. W. Poulton, Digital Systems Engineering, Cambridge University Press, 1998. Off-chip signalling.
- J. W. Poulton et al., ground-referenced single-ended serial link, IEEE Journal of Solid-State Circuits 54(1), 2019.
- B. Keller et al., deep-learning inference accelerator in \(5\,\mathrm{nm}\), VLSI Symposium 2022.
- TSMC SRAM disclosures for N5, N3E and N2: a \(0.021\,\mu\mathrm{m^2}\) high-density cell, about \(38\,\mathrm{Mb/mm^2}\) macro density at N2.
- Sutro Group, simplified-dally-model, the grid model compared above.
Figures not attributed to a source are estimates from the formulas on this page. They are meant to reproduce Dally's numbers to the precision he quotes, not to describe a specific product.
Revised from a September 2026 note, checked line by line against the essay. Three readings changed. The \(64{,}000\times\) is a DRAM fetch over a \(20\,\mathrm{fJ}\) add, not an off-chip access over a \(10\,\mathrm{fJ}\) add. The \(15\times\) is CPU instruction overhead, not an older process. The \(680\,\mathrm{pJ}\) now follows Dally's own split between on-chip and off-chip accesses.