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.

Key takeaways
  • 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.
The core insight

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 TT on one processor, split into a fraction ss that is inherently serial and a fraction 1−s1-s that parallelizes perfectly across pp processors. Amdahl's Law asks: if I run this exact same fixed-size program on pp processors, how much faster does it finish? The answer is

SpeedupAmdahl(p)=1s+1−sp\text{Speedup}_{\text{Amdahl}}(p) = \frac{1}{s + \dfrac{1-s}{p}}

which is bounded above by 1/s1/s no matter how large pp 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> TT and a machine with pp 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 pp-processor machine the observed execution consumes fraction ss of time doing serial work and 1−s1-s doing parallel work (this 1−s1-s portion, by construction, is now pp times larger in work done than it would be on one processor, since pp 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:

SpeedupGustafson(p)=s+p(1−s)=p−s(p−1)\text{Speedup}_{\text{Gustafson}}(p) = s + p(1-s) = p - s(p-1)

This is linear in pp, with slope (1−s)(1-s), rather than asymptotically flat. The crucial conceptual move is that ss 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 W=Wserial+WparW = W_{\text{serial}} + W_{\text{par}}. Time on 1 processor is T1=Wserial+WparT_1 = W_{\text{serial}} + W_{\text{par}}. Time on pp processors is Tp=Wserial+Wpar/pT_p = W_{\text{serial}} + W_{\text{par}}/p. Speedup is T1/TpT_1/T_p. As p→∞p \to \infty, Tp→WserialT_p \to W_{\text{serial}}, a floor — this is why speedup saturates.

Gustafson's protocol. Fix the time budget TT (the time you're willing to wait, e.g., one simulated day of compute). Run on pp processors: the machine spends time s⋅Ts\cdot T on serial work and (1−s)⋅T(1-s)\cdot T on parallel work, but because there are pp processors, the parallel work accomplished in that (1−s)T(1-s)T window is pp times what one processor could do in the same window. So the total work accomplished by the pp-processor run, measured in "single-processor-equivalent time units," is

Wdone=s⋅T+p⋅(1−s)⋅TW_{\text{done}} = s\cdot T + p\cdot (1-s)\cdot T

Dividing by the reference TT (what one processor alone would have accomplished in that same budget, which is just TT itself, i.e., s⋅T+(1−s)⋅Ts\cdot T + (1-s)\cdot T), gives the scaled speedup formula s+p(1−s)s + p(1-s) 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 ss 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 ss, give different-looking numbers that are not contradictory — they are answers to different experiments.

Figure
Strong scaling (Amdahl) vs weak scaling (Gustafson): where the work goes as p grows
Amdahl: fixed problem size, time shrinks p = 1 T₁ = serial + parallel work p = 2 T₂: parallel part halves p = 4 T₄: parallel part quarters p = 8 serial part now dominates — floor reached Red = fixed serial time (never shrinks) · Blue = parallel time Gustafson: fixed time budget, work grows p = 1 baseline work, time T p = 2 2× work, same time T p = 4 4× work fits in remaining space, same time T p = 8 work keeps growing — bar continues off-canvas, speedup scales ~linearly with p Red = fixed serial time · Green = parallel work DONE (grows with p, not shrinks) Same letter "s", different experiment: Amdahl: s measured on the ONE-processor run of a FIXED problem. Gustafson: s measured on the P-processor run of the SCALED-UP problem.

Complexity & correctness

Complexity of the formula itself. Evaluating Speedup=s+p(1−s)\text{Speedup} = s + p(1-s) is O(1)O(1) time and O(1)O(1) 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 pp, which is the substantive claim to verify.

Correctness argument — why the formula is linear in pp. By construction of the weak-scaling experiment, the wall-clock time is held fixed at TT across all values of pp (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 TT:

  • Serial time consumed: sTsT (unchanged by pp, by definition of "serial").
  • Parallel time consumed: (1−s)T(1-s)T, but during this window all pp 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 pp 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 sT+p(1−s)TsT + p(1-s)T. Normalizing by TT (the work one processor alone accomplishes in that budget) yields exactly

Speedup(p)=s+p(1−s),\text{Speedup}(p) = s + p(1-s),

a first-degree polynomial in pp with slope (1−s)≥0(1-s) \geq 0. This is manifestly unbounded as p→∞p\to\infty, in stark contrast to Amdahl's Law's asymptote at 1/s1/s. The derivative with respect to pp is constant, ∂Speedup/∂p=1−s>0\partial \text{Speedup}/\partial p = 1-s > 0 whenever s<1s<1, 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 (p,size,time)(p, \text{size}, \text{time}) 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 ss 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 (1−s)(1-s) portion divides evenly across pp 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 Speedup(p)≤s+p(1−s)\text{Speedup}(p) \le s + p(1-s), with equality only in the idealized case. 2. The serial fraction is measured, not assumed constant. In many real applications, as problem size grows, ss 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 ss — but if ss 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 pp 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 N=106N = 10^6 cells. On 1 processor this takes T1=1000T_1 = 1000s total, of which 5050s (5%) is irreducibly serial (sseq=0.05s_{\text{seq}} = 0.05) and 950950s is parallelizable.

pAmdahl: Tp=50+950/pT_p = 50 + 950/p (s)Speedup T1/TpT_1/T_p
110001.00
25251.90
4287.53.48
8168.755.93
16109.49.14
6464.815.4
102450.9319.6
→∞\to\infty→50\to 50→20  (=1/s)\to 20 \;(=1/s)

The ceiling of 1/0.05=20×1/0.05 = 20\times is visible clearly by p=1024p=1024: adding a thousand-fold more processors barely moves speedup from 19.619.6 to 2020.

Setup for a weak-scaling (Gustafson) trace. Now the lab does what it actually does: with pp processors available, it runs a grid pp times larger (finer resolution), keeping wall time fixed near T=1000T = 1000s. Measuring the observed serial fraction on each run (the 5050s 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):

pgrid size (× base)wall time (s)observed s=50/Ts = 50/TGustafson speedup s+p(1−s)s+p(1-s)
11×10000.0501.00
22×10000.0501.95
44×10000.0503.85
88×10000.0507.65
1616×10000.05015.25
6464×10000.05061.05
10241024×10000.050972.65

Here, even with the same nominal s=0.05s = 0.05, speedup at p=1024p=1024 is 972.65×972.65\times — a night-and-day difference from Amdahl's ceiling of 20×20\times, 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 p\sqrt{p} because more subdomains must be merged. Then s(p)=0.05p/p0s(p) = 0.05\sqrt{p}/\sqrt{p_0} for some reference p0p_0; plugging into s(p)+p(1−s(p))s(p) + p(1-s(p)) shows scaled speedup grows sublinearly and eventually can even decrease with pp once s(p)s(p) approaches 1 — a cautionary case that shows why "scaled speedup is always linear" is only true under the idealized constant-ss assumption, and real system designers must measure s(p)s(p) empirically at each scale rather than trust a single measurement extrapolated arbitrarily far.

Common pitfalls & traps

PitfallWhy it happensFix
Treating ss in both laws as the same measured numberss is measured on different reference runs (1-processor fixed-size vs. pp-processor scaled-size)Always state which experiment produced ss before quoting a speedup number
Claiming Gustafson's Law "disproves" Amdahl's LawSurface-level reading of "linear vs. capped" as contradictoryRecognize they answer different questions (strong vs. weak scaling); both are exact under their own protocol
Assuming scaled speedup is always linear in practiceFormula assumes perfect parallel efficiency and constant ssMeasure s(p)s(p) empirically; account for communication/memory growth with problem size
Growing problem size without growing memory/bandwidth proportionallyWeak scaling implicitly assumes resources scale with pp, not just compute coresCheck memory-per-core and network bandwidth-per-core stay adequate as pp grows
Reporting "we achieved Gustafson speedup of NxNx" without stating the time budgetSpeedup number alone is meaningless without knowing what was held fixedAlways report: fixed quantity (time or size), pp, and measured ss together

Pioneers & history

Origins · 1 minJohn L. Gustafson and how this was discovered
JL
John L. Gustafson
born 1955 · American computer scientist, formulated the scaled-speedup model in 1988 with Edwin Barsis while at Sandia National Laboratories, benchmarking massively parallel machines on real scientific workloads

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
History
1967
— Gene Amdahl presents the argument later formalized as Amdahl's Law, cautioning against over-investment in parallel processors for fixed-size problems.
1985
— Sandia National Laboratories acquires early massively parallel hypercube machines, motivating direct empirical tests of scaling behavior.
1988
— John Gustafson and Edwin Barsis publish "Reevaluating Amdahl's Law," introducing scaled speedup and the weak-scaling perspective.
1988
— Gustafson, Montry, and Benner report near-linear speedup on a 1024-processor NCUBE/10 across three real scientific applications, the empirical anchor for the law.
1990
s–2000s — Weak-scaling benchmarks (e.g., HPL/Top500-adjacent scaling studies) become standard practice for reporting supercomputer performance, formalizing strong-vs-weak scaling as the default vocabulary in HPC.

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.

Before this