Gustafson's Law and Scaled Speedup
Imagine a weather simulation lab that buys a machine ten times more parallel. Amdahl's Law and Speedup says the payoff is disappointing. It's capped by whatever fraction of the program is sequential. But the scientists never actually run the same forecast faster on the bigger machine. Instead, they run a finer-resolution forecast. It covers more grid cells, more altitude layers, more ensemble members. This happens in the same wall-clock time as before. That single shift in perspective is key. It moves from "fixed problem, more processors" to "fixed time, bigger problem." This is the heart of Gustafson's Law. This distinction is not a philosophical footnote. It decides how supercomputing centers, cloud clusters, and GPU farms are actually justified and purchased. Amdahl's Law, applied naively, suggests something troubling. Buying a machine with thousands of cores seems nearly pointless once the sequential fraction dominates. Yet real large-scale machines routinely deliver near-linear scaled speedups. This holds true on science and industry workloads. The resolution is simple: users do not hold problem size fixed as machines grow. Instead, they hold their patience (total run time) fixed. They grow the problem to fill the available parallel capacity. Gustafson's Law formalizes this idea. It explains why massively parallel machines remain economically and scientifically justified. The big picture is that speedup is not one number. It is a family of numbers, depending on what you hold constant. This depends on what stays fixed while you scale the number of processors. Two disciplined choices dominate practice. Strong scaling fixes the total problem size; you add processors to finish it faster (Amdahl's regime). Weak scaling fixes the problem size per processor; you add processors to solve a proportionally larger problem in the same time (Gustafson's regime). Neither law is "more correct" than the other. They answer different questions. Conflating them is one of the most common analytical errors in parallel systems work. This article builds Gustafson's Law from first principles. It contrasts it carefully with Amdahl's Law using the same notation. It works through numeric traces that expose the difference concretely. It connects the idea to how real clusters are sized and marketed. It sets up the reasoning that underlies Warehouse-Scale Computing. There, "scale out the problem, not just the fleet" is the default mental model for capacity planning.
- Amdahl's Law fixes problem size, grows processors; speedup saturates at 1/s where s is the sequential fraction.
- Gustafson's Law fixes run time, grows the problem alongside processors; scaled speedup grows linearly with p.
- The two laws model different experiments — strong scaling (Amdahl) vs weak scaling (Gustafson) — not competing theories of the same fact.
- Gustafson's formula is Speedup(p) = s + p·(1 − s), derived from time spent, not time saved.
- Neither law is "wrong"; the honest question is always "scaled with what held constant?"
- Real HPC and warehouse-scale systems justify growth by growing workload size, matching Gustafson's regime.
If you let the problem grow with the machine, the sequential bottleneck shrinks in relative terms and speedup scales almost linearly with processor count.
The idea
Both Gustafson's Law and Amdahl's Law start from the same decomposition of a program's execution time into a sequential portion and a parallelizable portion. Let a program require total time on one processor, split into a fraction that is inherently serial and a fraction that parallelizes perfectly across processors. Amdahl's Law asks: if I run this exact same fixed-size program on processors, how much faster does it finish? The answer is
which is bounded above by no matter how large grows — because the sequential part's time is fixed and un-shrinkable. Gustafson's Law, introduced by John Gustafson and Edwin Barsis in 1988, asks a different question: if I have a <strong>fixed time budget</strong> and a machine with processors, how much <strong>larger</strong> a problem can I solve in that budget, compared to what one processor could solve, and what is the resulting speedup? Here the measurement is taken on the parallel run as the reference point. Suppose on the -processor machine the observed execution consumes fraction of time doing serial work and doing parallel work (this portion, by construction, is now times larger in work done than it would be on one processor, since processors did it in the same wall time). The scaled speedup — how much work a single processor would have needed to redo the same total job — is:
This is linear in , with slope , rather than asymptotically flat. The crucial conceptual move is that here is the serial fraction of the parallel run, not the serial fraction of some fixed sequential program — these are related but numerically distinct quantities, and confusing them is a classic error (see the pitfalls table below). The umbrella term for these two philosophies is strong scaling (Amdahl: fixed total problem, more processors, goal = shorter time) versus weak scaling (Gustafson: fixed problem-per-processor, more processors, goal = bigger problem in the same time). Real workloads often exhibit a mixture: some subroutines strong-scale (fixed matrix, more cores factor it faster), while the overall application weak-scales (finer mesh resolution as more nodes become available). Both laws are exact under their respective idealized assumptions; both ignore secondary costs like communication overhead, memory bandwidth contention, and load imbalance, which real systems must additionally account for.
How it works
The mechanism behind Gustafson's Law is best understood by tracking where time goes under the two different experimental protocols.
Amdahl's protocol. Fix the total work . Time on 1 processor is . Time on processors is . Speedup is . As , , a floor — this is why speedup saturates.
Gustafson's protocol. Fix the time budget (the time you're willing to wait, e.g., one simulated day of compute). Run on processors: the machine spends time on serial work and on parallel work, but because there are processors, the parallel work accomplished in that window is times what one processor could do in the same window. So the total work accomplished by the -processor run, measured in "single-processor-equivalent time units," is
Dividing by the reference (what one processor alone would have accomplished in that same budget, which is just itself, i.e., ), gives the scaled speedup formula directly — it is literally "how many times more work got done," not "how much time got saved." ``` ALGORITHM: EstimateScaledSpeedup INPUT: p // number of processors available s // serial fraction OBSERVED on the p-processor parallel run // (fraction of wall-clock time spent in non-parallel code) OUTPUT: speedup // Gustafson scaled speedup estimate function GustafsonSpeedup(p, s): assert 0 <= s <= 1 assert p >= 1 parallel_fraction = 1 - s speedup = s + p * parallel_fraction return speedup
# Contrast: Amdahl's Law answers a DIFFERENT question with the SAME s-notation
# but s there must be measured on the SEQUENTIAL (1-processor) run. function AmdahlSpeedup(p, s_seq): assert 0 <= s_seq <= 1 assert p >= 1 denom = s_seq + (1 - s_seq) / p return 1.0 / denom
# WORKFLOW for weak-scaling an actual experiment (how Gustafson numbers
# are produced in practice, e.g. in HPC benchmarking): function WeakScalingExperiment(base_problem_size, p_list, time_budget): results = [] for p in p_list: problem_size = base_problem_size * p // grow problem WITH p run_time = ExecuteParallel(problem_size, p)
# Ideally run_time ≈ time_budget for all p (that is the goal
# of weak scaling: keep wall time roughly flat as p and size grow) s_observed = MeasureSerialFraction(problem_size, p) speedup = GustafsonSpeedup(p, s_observed) results.append((p, run_time, s_observed, speedup)) return results ``` The pseudocode makes explicit the one thing that trips up almost every student encountering this the first time: the in Gustafson's formula is measured on the parallel execution, not derived from timing a sequential-only run. This is why the two laws, applied to the same system with the same letter , give different-looking numbers that are not contradictory — they are answers to different experiments.
Complexity & correctness
Complexity of the formula itself. Evaluating is time and space — it is a closed-form arithmetic expression, not an algorithm over a data structure. The "complexity" content of this topic is really about the asymptotic behavior of speedup as a function of , which is the substantive claim to verify.
Correctness argument — why the formula is linear in . By construction of the weak-scaling experiment, the wall-clock time is held fixed at across all values of (this is the defining invariant of Gustafson's protocol, not an assumption to be proven — it is how the experiment is run). Within that fixed time :
- Serial time consumed: (unchanged by , by definition of "serial").
- Parallel time consumed: , but during this window all processors work simultaneously on independent pieces of a problem that has been scaled up to exactly fill them. The amount of work completed in this window equals times the work one processor would complete in the same window (perfect parallel efficiency assumption, identical to Amdahl's idealization for the parallel portion).
So total work completed, expressed in "one-processor-equivalent time units," is . Normalizing by (the work one processor alone accomplishes in that budget) yields exactly
a first-degree polynomial in with slope . This is manifestly unbounded as , in stark contrast to Amdahl's Law's asymptote at . The derivative with respect to is constant, whenever , so speedup strictly increases with every additional processor — there is no saturation point in the idealized model.
Reconciling the two laws (they are not in conflict). It is a common misconception that Gustafson's Law "refutes" Amdahl's Law. It does not — both are algebraically exact under their own fixed quantity. One can show they are two different slices through the same underlying surface: if you take a Gustafson-scaled experiment and instead ask "how much faster would the original small problem finish," you recover something Amdahl-like; if you take an Amdahl experiment and ask "how much more work fits in the shrunk time," you can derive a Gustafson-like bound. The formulas diverge because is not the same number in the two experiments — the serial fraction of a small fixed problem run in parallel is typically larger (relatively) than the serial fraction of a scaled-up problem, because many serial costs (I/O setup, initialization, a control loop) do not grow with problem size, so they shrink as a fraction of a larger total.
Honest tradeoffs and hidden assumptions. Both laws assume: 1. Perfect parallel efficiency — the portion divides evenly across processors with zero communication or synchronization overhead. Real systems lose efficiency to network latency, cache contention, and load imbalance; scaled speedup in practice is sublinear, and the honest bound is , with equality only in the idealized case. 2. The serial fraction is measured, not assumed constant. In many real applications, as problem size grows, actually shrinks (I/O and setup overhead amortize over more work), which makes real weak-scaling curves sometimes better than the idealized formula predicts for a fixed — but if instead grows with problem size (e.g., a global reduction step that gets more expensive with more processors), scaled speedup can be considerably worse than linear. 3. Memory and bandwidth are assumed unconstrained. Growing the problem size with requires proportionally more memory and I/O bandwidth; if the machine's memory or network cannot keep pace, weak scaling degrades regardless of what the compute-only formula predicts.
Worked example
Consider a climate simulation whose single-processor serial bookkeeping (I/O, boundary setup, a final reduction) is a small, roughly fixed cost, while its main grid-update computation parallelizes almost perfectly.
Setup for a strong-scaling (Amdahl) trace. Fix the grid at cells. On 1 processor this takes s total, of which s (5%) is irreducibly serial () and s is parallelizable.
| p | Amdahl: (s) | Speedup |
|---|---|---|
| 1 | 1000 | 1.00 |
| 2 | 525 | 1.90 |
| 4 | 287.5 | 3.48 |
| 8 | 168.75 | 5.93 |
| 16 | 109.4 | 9.14 |
| 64 | 64.8 | 15.4 |
| 1024 | 50.93 | 19.6 |
The ceiling of is visible clearly by : adding a thousand-fold more processors barely moves speedup from to .
Setup for a weak-scaling (Gustafson) trace. Now the lab does what it actually does: with processors available, it runs a grid times larger (finer resolution), keeping wall time fixed near s. Measuring the observed serial fraction on each run (the s bookkeeping cost stays roughly fixed regardless of grid size, since it does not depend on cell count — think of it as reading one config file and writing one summary):
| p | grid size (× base) | wall time (s) | observed | Gustafson speedup |
|---|---|---|---|---|
| 1 | 1× | 1000 | 0.050 | 1.00 |
| 2 | 2× | 1000 | 0.050 | 1.95 |
| 4 | 4× | 1000 | 0.050 | 3.85 |
| 8 | 8× | 1000 | 0.050 | 7.65 |
| 16 | 16× | 1000 | 0.050 | 15.25 |
| 64 | 64× | 1000 | 0.050 | 61.05 |
| 1024 | 1024× | 1000 | 0.050 | 972.65 |
Here, even with the same nominal , speedup at is — a night-and-day difference from Amdahl's ceiling of , because the two tables answer different questions. The Amdahl table asks "how much faster is the fixed 1-million-cell grid?" The Gustafson table asks "how much more total simulated science got done in the same 1000 seconds?" Both are true, simultaneously, about the same underlying machine.
A less rosy variant — s growing with p. Suppose instead that the serial part includes a global synchronization ("gather all subdomain boundaries onto one node before writing output") that grows like because more subdomains must be merged. Then for some reference ; plugging into shows scaled speedup grows sublinearly and eventually can even decrease with once approaches 1 — a cautionary case that shows why "scaled speedup is always linear" is only true under the idealized constant- assumption, and real system designers must measure empirically at each scale rather than trust a single measurement extrapolated arbitrarily far.
Common pitfalls & traps
| Pitfall | Why it happens | Fix |
|---|---|---|
| Treating in both laws as the same measured number | is measured on different reference runs (1-processor fixed-size vs. -processor scaled-size) | Always state which experiment produced before quoting a speedup number |
| Claiming Gustafson's Law "disproves" Amdahl's Law | Surface-level reading of "linear vs. capped" as contradictory | Recognize they answer different questions (strong vs. weak scaling); both are exact under their own protocol |
| Assuming scaled speedup is always linear in practice | Formula assumes perfect parallel efficiency and constant | Measure empirically; account for communication/memory growth with problem size |
| Growing problem size without growing memory/bandwidth proportionally | Weak scaling implicitly assumes resources scale with , not just compute cores | Check memory-per-core and network bandwidth-per-core stay adequate as grows |
| Reporting "we achieved Gustafson speedup of " without stating the time budget | Speedup number alone is meaningless without knowing what was held fixed | Always report: fixed quantity (time or size), , and measured together |
Pioneers & history
Origins · 1 minJohn L. Gustafson and how this was discovered
John Gustafson worked at Sandia National Laboratories during the late 1980s, a period when massively parallel processors (the era's hypercube and mesh machines) were being evaluated against the pessimistic ceiling implied by Amdahl's Law and Speedup. Running actual production physics codes on a 1024-processor hypercube, Gustafson and his collaborators (including Edwin Barsis, along with Robert Montry and colleagues on related benchmark work) observed near-linear speedups that flatly contradicted the Amdahl-based expectation that such large processor counts should be nearly wasted on any program with even a small serial fraction. The resolution was not that Amdahl's algebra was wrong, but that the experiment being run was different: scientists were not solving the same fixed problem faster — they were solving proportionally larger, higher-fidelity problems in the same allotted machine time. Gustafson formalized this observation as what is now called Gustafson's Law (also known as the Gustafson–Barsis Law), published in the widely cited 1988 paper "Reevaluating Amdahl's Law." The paper reframed how the parallel-computing community justified investment in large machines: not by promising to make small jobs instantaneous, but by promising to make ambitious jobs tractable within a fixed patience budget — precisely the model that later underwrote climate modeling, computational fluid dynamics, and large-scale simulation as flagship uses of supercomputing.
Origins · 1 minhow this was discovered
Where this matters
High-performance computing centers report both strong-scaling and weak-scaling curves for every major machine precisely because customers ask both kinds of questions — "will my job finish faster" versus "how much bigger a job can I now afford." Climate and weather models, computational fluid dynamics, molecular dynamics, and cosmological N-body simulations are the classic Gustafson-regime workloads: as machines grow, scientists do not rerun old low-resolution simulations faster, they run finer grids, more particles, longer time horizons, or larger ensembles, filling the fixed time budget of "before the next funding review" or "before the storm arrives." Training ever-larger machine learning models on ever-larger clusters follows the same logic: adding GPUs does not primarily make yesterday's model train instantly, it enables training a model with more parameters or more data in a similar training-time budget, which is the philosophical ancestor of how modern large-scale AI training clusters are justified and scaled. Databases and MapReduce-style big-data systems weak-scale by design — sharding a dataset across more nodes lets an organization process a proportionally larger dataset in a similar batch window. This same reasoning about growing workload to match growing fleet size is exactly the mental model that recurs when reasoning about Warehouse-Scale Computing, where the operative question shifts from "how fast is one query" to "how much total serving capacity can the fleet sustain," and it underlies why capacity planners think in terms of throughput-per-added-machine rather than latency-per-fixed-job. It also disciplines how engineers write Parallel Algorithms: knowing whether a workload will be deployed in a strong-scaling or weak-scaling regime changes which serial bottlenecks are worth eliminating first.
Ask the tutor: Can you derive what happens to scaled speedup if the serial fraction itself grows as a function of the problem size, and show when that turns the curve from linear into something that eventually declines?
Does Gustafson's Law prove Amdahl's Law wrong?
No. Both are algebraically correct statements about different experiments. Amdahl's Law fixes the problem size and asks how much faster a fixed amount of work finishes as processors are added; its ceiling of 1/s is exact under that protocol. Gustafson's Law fixes the time budget and asks how much larger a problem can be solved in that same budget; its near-linear growth is exact under that different protocol. The apparent contradiction dissolves once you realize the serial fraction s is measured differently in each case — on a fixed small problem for Amdahl, on a scaled-up problem for Gustafson. Neither law refutes the other; they are complementary lenses, and confusing which one applies to a given workload is the real source of most reported "contradictions."
Which law should I use to plan capacity for my own workload?
Ask what you actually intend to hold fixed when you add hardware. If your job has a fixed size that must finish faster — a fixed dataset, a fixed simulation grid, a deadline-driven fixed-size task — reason with Amdahl's Law and strong-scaling benchmarks; know its ceiling before promising a client a speedup number. If your workload naturally grows to consume available capacity — bigger simulations, larger training runs, bigger batch jobs within a fixed nightly window — reason with Gustafson's Law and weak-scaling benchmarks. Many real production systems contain both kinds of subroutines, so mature capacity planning reports both curves rather than picking one law as universally applicable.
Is scaled speedup ever actually linear in real hardware, or is that purely theoretical?
It is an idealization, but real systems can get close for workloads with genuinely fixed, amortizable serial overhead (like reading one config file regardless of problem size) and near-perfect data parallelism (like independent grid cells in a stencil computation). Communication overhead, memory bandwidth limits, and load imbalance typically make real weak-scaling curves sublinear at very large p, and some workloads have a serial fraction that actually grows with p (e.g., global reductions), making the curve worse than linear or even eventually decreasing. Reported "linear scaling to N nodes" claims should always specify the workload and the range of p tested, since near-linear behavior at small p often degrades well before the largest available machine size.
How does Gustafson's Law relate to strong scaling and weak scaling as used in HPC benchmarking?
Strong scaling and weak scaling are the standard operational names for the two experimental protocols underlying Amdahl's and Gustafson's Laws respectively. A strong-scaling study fixes total problem size and reports speedup or efficiency as processor count grows — this directly instantiates Amdahl's Law's assumptions. A weak-scaling study fixes problem size per processor and grows both problem size and processor count together, reporting how close the resulting speedup or efficiency stays to the linear/Gustafson ideal. Supercomputing center benchmarks (and Top500-adjacent performance reports) routinely publish both, because a single scaling curve cannot answer both "will my exact job get faster" and "how much bigger a job can this machine now handle."
Does adding more processors always help under Gustafson's Law, with no downside?
Within the idealized model with constant s and perfect parallel efficiency, yes — speedup increases monotonically and without bound as p grows, since the derivative (1−s) is positive whenever s<1. In practice there are real downsides: growing the problem proportionally with p demands proportionally more memory, storage bandwidth, and network bandwidth, and if any of these lag behind processor count growth, the effective serial fraction s can itself increase with p (more synchronization, more data movement), eroding the linear benefit. So "more processors always helps" is true only as an idealization; real deployments must verify that memory and communication infrastructure scale in step with compute.
Can a single program exhibit both Amdahl-like and Gustafson-like behavior?
Yes, and this is typical of real applications. A component like a fixed-size input-parsing routine or a fixed final report generation might strong-scale poorly (Amdahl-limited, since its size does not grow with the machine), while the dominant scientific kernel — a grid update, a matrix operation over a problem that the user chooses to enlarge — weak-scales well (Gustafson-favorable, since users grow it to match capacity). Overall application performance is then a blend, and profiling should identify which subroutines are size-fixed versus size-scalable before choosing which scaling law to apply when reasoning about future hardware investment.
Why does the historical NCUBE/10 experiment matter beyond its numeric result?
It mattered because it was an empirical challenge to a purely algebraic pessimism. Amdahl's Law, read naively, suggested that 1024 processors would be wasted on any program with a nontrivial serial fraction, discouraging investment in massively parallel machines. Gustafson, Montry, and Benner's 1988 measurements on a real 1024-processor hypercube running production physics codes showed near-linear speedup in practice, because the scientists had scaled their problems up rather than kept them fixed. This reframed the argument for building larger parallel machines: not "your existing job will run proportionally faster," but "your ambitions can grow proportionally with the machine," a framing that underlies essentially all subsequent large-scale scientific computing investment.