This page assumes nothing. Before you read the parent note, you must be fluent in every letter, ratio, and picture it throws at you. We build each one from the ground up, in an order where every symbol is earned before it is used.
Look at the picture below: the CPU never talks to slow memory directly if it can help it — it looks in the fast cache first.
WHY the topic needs this: prefetching's entire job is turning misses into hits. If you don't have the words "block", "hit", "miss" as pictures in your head, the metrics later are meaningless. This is the ground floor — see Cache Basics — Blocks and Locality.
WHY the topic needs this: the entire motivation for prefetching is that a stall is enormous. Every formula later is really asking "how many of these 400-cycle freezes can we avoid?"
WHY the topic needs this: locality is the reason a guess can succeed at all. Next-line prefetching lives on spatial locality; correlation prefetching lives on repeated (temporal) patterns of misses. No locality → no predictable future → prefetching is pure luck. Full detail in Spatial vs Temporal Locality.
Let's make "stride" a picture — a ruler with evenly spaced ticks:
WHY the topic needs this: next-line prefetch is the special case stride =1 block (one box forward). Stride prefetch is the general case, usually expressed in bytes. The parent's formula addr+stride⋅k is nothing but "start here, take k equal steps of size stride" — with addr and stride in the same unit (bytes).
WHY the topic needs this: the parent uses D and k in both next-line and stride strategies. If you read addr+stride⋅k without knowing k just counts 1..D, the formula looks mysterious. It isn't — it's just "take D evenly spaced steps forward."
Everything the parent measures is a fraction: a number between 0 and 1 meaning "this portion of a whole."
The two pie charts below make the "different wholes" point visual. Look at what each pie is a slice of: the left pie is cut from the set of original misses — its green wedge (c=0.6) is the portion of those misses we killed. The right pie is cut from a completely different set, the prefetches we issued — its green wedge (a=0.35) is the portion that got used, and the red "wasted / pollution" slice is bandwidth thrown away. The two greens are not comparable numbers: they answer different questions because they are slices of different circles. That is exactly why you must never multiply a into a coverage formula.
WHY the topic needs this: the parent's central formula meff=m(1−c) only makes sense once you see that c is already "the misses actually eliminated". The related metrics feed Cache Pollution and Replacement Policies (bad accuracy → pollution) and are the vocabulary of the whole page.
We now have every piece. Read the formula in plain words:
If c=0 (prefetcher does nothing), meff=m. If c=1 (kills every miss), meff=0. Every value in between is a straight line — no hidden accuracy factor, because c already counts only the ones that worked. See Average Memory Access Time (AMAT) for where meff plugs in.
thit and tmissthit = time for a cache hit (small, ~1 cycle). tmiss = extra penalty of a miss (~100 cycles). AMAT =thit+meff⋅tmiss: you always pay the hit-probe, and only survivors pay the penalty.
Recall
Δm (pollution)
Extra misses created when a useless prefetch evicts a still-needed block. Written meff=m(1−c)+Δm. This is why an inaccurate prefetcher can make things worse.
Recall PC and the Reference Prediction Table
PC = program counter = the address of the instruction doing the load. The table is indexed by PC so different loads (A[i] vs B[j]) keep separate stride histories and don't corrupt each other.
Recall MLP and Out-of-Order
Memory-Level Parallelism (Memory-Level Parallelism (MLP)) = having several memory fetches in flight at once. Out-of-Order Execution lets the CPU keep working past a stall — the useful computation that prefetch overlaps with. Compiler Optimizations — Loop Blocking is the software cousin that reshapes access patterns to be prefetch-friendly.