Visual walkthrough — NUMA architectures
This page rebuilds the parent note's headline result — the NUMA factor and the average-latency formula — starting from a single memory request and a stopwatch. We assume you know nothing except that a processor sometimes needs a number out of memory. Everything else is drawn.
If a word here feels heavy, the parent NUMA architectures note has the wider context; prerequisite ideas about caches and coherence live in memory consistency models and multicore synchronization.
Step 1 — What "memory access time" even means
WHAT. A processor is a machine that, many billions of times per second, says "give me the number stored at address ." The time between asking and receiving is one memory access. We give that duration a name: , measured in nanoseconds (ns) — billionths of a second.
WHY start here. Every later symbol is built from stopwatch readings. If we never nail down "what are we timing," ratios like are meaningless. So the very first object is a single arrow from a core to a memory bank, with a clock on it.
PICTURE. One core, one memory bank, one request travelling out and the data coming back. The green bar is the elapsed time on the stopwatch.

Step 2 — Two kinds of request: local and remote
WHAT. In a NUMA machine the memory is chopped into nodes. Each node is a core-group glued to its own nearby memory bank. A request can land in your own node (short trip) or someone else's node (long trip across the interconnect wire). Same operation, two very different distances.
WHY two names. A single symbol can no longer describe reality, because the same core sees different times depending on where the data sits. The moment one number splits into two outcomes, we must give each outcome its own name — otherwise we cannot compare them.
- — the tiny hop from the core to the memory controller sitting in the same node.
- — the physical time to pull bits out of the DRAM chips. Unavoidable, same everywhere.
- — the extra toll for leaving your node: onto the interconnect (QPI / Infinity Fabric), across to the far node's controller, and the data's return trip. This term is zero for a local access and positive for a remote one.
PICTURE. Two arrows from the same core: a short green one into its own bank, a long red one across the interconnect into a neighbour's bank. The red arrow is visibly longer — that length is .

Step 3 — Turn "how much slower" into one clean number:
WHAT. We do not care about raw nanoseconds as much as we care about the ratio: how many times slower is a remote trip than a local one? Divide by and give the result a name.
- The bar means divide. We put remote on top and local on the bottom so the answer reads as "remote is this-many times a local access."
- If remote local, the fraction is . So means "no penalty at all" — a plain UMA machine.
- If remote is twice as slow ( vs ), .
WHY a ratio and not a subtraction? We could have written , but that is a raw duration tied to one machine's clock speed. A ratio is unit-free — it survives across different machines and lets us say "this box has a NUMA factor of 1.8" as a single portable quality score. That is the exact question we want answered: how bad is remote here?
PICTURE. A number line of latencies with the local mark at and remote marks pushed out to the right; the horizontal gap, expressed as a multiplier, is .

Step 4 — Real programs mix the two: introduce the fraction
WHAT. A running program does millions of accesses. Some hit local memory, some go remote. Let be the fraction that go remote — a number between and .
- → every access is local (perfect locality, the dream).
- → every access is remote (worst case).
- → one in five accesses crosses the interconnect (the parent note's 80/20 example: 80% local, so ).
WHY a fraction? Because reality is a mixture, not all-local or all-remote. To predict the time of a whole program we need to know how often each kind happens. A single fraction captures "how leaky is my locality" in one dial we can turn.
PICTURE. A bar of 100 tick marks; a fraction of them coloured red (remote), the rest green (local). Slide and the bar recolours.

Step 5 — Averaging: the weighted mean that gives
WHAT. If a fraction of accesses cost and a fraction cost , the typical access time is their weighted average — each cost multiplied by how often it happens, then added:
WHY weighting and not a plain average? A plain average would pretend the two happen equally often. They don't — you might have 95% local and 5% remote. Weighting each cost by its actual frequency is the only honest way to get the long-run mean.
Now substitute the Step-2 fact (which is just Step 3 rearranged) to collect everything into :
- — the local slice, each paying .
- — the remote slice, each paying .
- — factor out front so the bracket is a pure multiplier telling you how many local-latencies an average access costs.
PICTURE. A see-saw / weighted-beam: the local weight at and the remote weight at , with the balance point landing at the value of the bracket.

Step 6 — Speedup: how much locality buys you
WHAT. Compare your mixed program to the disaster baseline where every access is remote, . The speedup is how many times faster the mixed program is:
The on top and bottom cancel (a common factor divides out), leaving a clean, machine-independent expression:
- Numerator — how bad all-remote is.
- Denominator — the bracket from Step 5 — how bad you actually are.
- Big = your locality effort paid off relative to the worst case.
WHY divide by the all-remote case? Because it isolates the value of locality itself. It answers "compared to a NUMA-oblivious program that flails across the interconnect, how much did keeping data local win me?"
PICTURE. A curve of versus : at the curve sits at (you are the baseline); as it climbs toward (all-local is the whole factor faster).

Step 7 — The edge cases (never leave the reader stranded)
WHAT & WHY. A formula you trust must survive its extremes. Let's push and to their limits and confirm each answer is sane.
| Case | Plug in | Result | Meaning |
|---|---|---|---|
| Perfect UMA () | for any | No penalty exists, so locality can't help — correct. | |
| All local () | You beat the all-remote baseline by the full factor. | ||
| All remote () | You are the baseline — no speedup, as expected. | ||
| Extreme NUMA () | Speedup is capped by your remote fraction — a hard Amdahl-style ceiling. |
- The ceiling is the punchline: even an infinitely fast local memory can't rescue you if a fraction of accesses still crawl across the interconnect. Your remote traffic is the anchor.
PICTURE. The speedup curve again, this time with the ceiling drawn as a dashed line the curve presses against as grows.

The one-picture summary
Everything above, on one canvas: a request splits into local (green, ) and remote (red, ); the fraction mixes them on a weighted beam into ; dividing the all-remote baseline by gives the speedup curve with its ceiling.

Recall Feynman retelling — say it back in plain words
A computer sometimes fetches numbers from memory right next to it (fast) and sometimes from memory in another room across a wire (slow). We time one fetch and call it . Because the same core sees two different times, we split into and , where remote is just local plus the toll for crossing the wire. To describe "how much worse remote is" in one portable number we divide them: . A real program does a mixture, so we track , the share of fetches that go remote. The typical fetch time is the two costs weighted by how often each happens — that weighted average, tidied up, is . Comparing this to a program that goes remote every time gives a speedup . Testing the extremes shows it behaves: no penalty means no speedup, all-local means full speedup, and — the key lesson — even infinitely fast local memory caps you at . So the whole game is shrinking : keep your data where your thread lives.
Recall Quick self-test
What does mean, and what value does "80% local" give it? ::: is the fraction of accesses that are remote; 80% local means . Why use the ratio instead of the difference ? ::: A ratio is unit-free and portable across machines; a difference is tied to one machine's clock. With , , what is the speedup? ::: . As , what is the speedup ceiling? ::: — your remote fraction is the hard limit.