6.1.4 · D3Parallelism & Multicore

Worked examples — Multicore vs manycore designs

3,325 words15 min readBack to topic

This page is the "boss fight" for the parent topic. We will take the two formulas the parent introduced — the speedup formula from Amdahl's Law and the throughput formula — and push them into every corner: the easy cases, the broken cases, the "it's exactly zero" cases, and the ones that look like they should favour one design but secretly favour the other.

Before any numbers, let's re-anchor the two symbols we will use over and over, because a good chunk of "wrong answers" come from mixing them up.

Here are the exact formulas we'll be feeding, copied from the parent so no symbol is used unearned:

Two chips will recur through the examples, so let's fix their parameters once here and name them, rather than sneaking numbers in mid-problem:


The scenario matrix

Every question this topic can throw at you lands in one of these cells. The worked examples below are labelled with the cell they cover, and together they hit all of them.

Cell The "input extreme" being tested What it probes
A (nothing parallel) Serial floor — degenerate low end
B (perfectly parallel) The manycore dream — degenerate high end
C , small Realistic multicore
D (limiting behaviour) Amdahl's ceiling
E Throughput vs latency clash Same chips, opposite winners
F Area/transistor tradeoff Why the two philosophies exist
G Utilization collapse ( small) When manycore's flood dries up
H Real-world word problem Picking a design from a description
I Exam twist (the trap) Where "obvious" answer is wrong

Worked examples

Example 1 — Cell A: nothing is parallel ()

  1. Write down . "100% serial" means the parallel fraction . Why this step? Translating English ("serial") into the symbol the formula eats is where most errors happen — is the parallel fraction, so serial-only means , not .
  2. Substitute into Amdahl: Why this step? The term is the only place appears. If , that whole term vanishes and becomes invisible — the cores literally cannot touch this problem.
  3. Interpret: means "exactly as fast as one core." The other 511 cores sit idle. Why this step? A degenerate case must be named so you recognise it live: dependency chains defeat parallelism entirely.

Verify: Plug (one core, the baseline) into the same formula: . Same answer as — confirming extra cores added nothing. Units: speedup is dimensionless (a ratio of times), and is the "no change" value. ✓


Example 2 — Cell B & D: perfect parallelism, then the limit

  1. Confirm . Independent entries ⇒ zero serial fraction. Why this step? is the only value that lets speedup grow without a ceiling — so verifying it is worth the second.
  2. Part (a): . Why this step? With the serial term gone, speedup becomes exactly — linear scaling, the manycore dream.
  3. Part (b), the limit: as , , so Why this step? This is the ONLY for which the limit is infinite. It shows the boundary between Cells B and D: perfect parallelism has no ceiling; anything less does (next example).

Verify: Reality check — the parent notes actual A100 speedup is ~4000×, less than 6912×. That's consistent: our is the theoretical max (utilization ); memory bandwidth drags real below 1, so real speedup < 6912. The model over-estimates, never under-estimates — correct direction. ✓


Example 3 — Cell D: Amdahl's ceiling for imperfect

  1. Take the limit : Why this step? This is the single most important consequence of Amdahl: a mere 5% serial slice caps you at 20×, forever.

    Now look at the figure below. Each curve is for a fixed as we crank rightward. The blue curve climbs steeply at first, then bends over and presses flat against the red dashed line at — that red line is exactly the we just computed. The picture is the visual proof of this step: no matter how far right you go (more cores), the curve can never cross its ceiling.

Figure — Multicore vs manycore designs
  1. Find for half the ceiling (): solve . Then . Why this step? It exposes the cruelty of the curve: 19 cores get you to , but reaching needs infinitely many. In the figure this is the white dot at — notice it sits only halfway up to the red ceiling even though we already spent 19 cores. Everything to the right of that dot is the region of diminishing returns.

Verify: Plug back: . ✓ And , exactly half the ceiling. ✓


Example 4 — Cell C: realistic multicore, small

  1. Substitute , : Why this step? The serial term dominates the denominator — that's the "killer" the parent warned about. It's fixed no matter how many cores you add.
  2. Compute: . Why this step? A tiny speedup — yet multicore is still the right choice here (see step 3), which is the whole point.
  3. Compare the base core speeds. A single REF-CPU core does GIPS; a single REF-GPU core does GIPS — the REF-CPU core is faster on one thread. Since 70% of this workload runs on one thread, that base speed dominates; the modest parallel bonus rides on top of an already-fast core. Why this step? Speedup is relative to a single core; the base core matters. Using the named REF-CPU / REF-GPU numbers (instead of vague "high IPC") makes the comparison concrete: multicore wins branchy code because its base thread is ~10× quicker, not because of core count.

Verify: . ✓ Base-speed ratio . ✓ Sanity: with , must be strictly less than and greater than — and holds. ✓


Example 5 — Cell E: same two chips, throughput flips the winner

One small unit note before we compute. (in GHz) is clock ticks per second; is instructions per tick. Multiplying them, the "ticks" cancel: has units of instructions per second — that's the honest per-core work rate, and it's what "single-thread performance" means here. (Below, the shorthand means "16 giga-instructions per second on one core," since .)

  1. REF-CPU throughput: GIPS. Why this step? Multiply the four factors of the throughput formula; GHz × IPC gives billions of instructions/sec per core, ×cores×U gives the chip total.
  2. REF-GPU throughput: GIPS. Why this step? Same formula, opposite balance: tiny per-core numbers, huge core count. The count wins the product.
  3. Ratio: → REF-GPU wins throughput. Why this step? Confirms the firehose beats the eyedropper on volume.
  4. Single-thread: one core does instructions per second. REF-CPU: GIPS; REF-GPU: GIPS. Ratio → REF-CPU wins latency. Why this step? Shows the flip: the throughput loser is the latency winner. Same silicon, opposite verdicts, depending on the question you asked.

Verify: ✓; ✓; ✓; ✓. Units: GIPS = giga-instructions per second (a rate) for throughput; the single-thread numbers (, ) are also GIPS but per core, so you must not compare them against the whole-chip totals — hence two separate ratios. ✓


Example 6 — Cell F: the transistor tradeoff, from area

  1. Complex cores: . Why this step? Area budget ÷ area-per-core = count. The die is the fixed pie; each fat core takes a big slice.
  2. Simple cores: . Why this step? Same pie, thinner slices ⇒ vastly more of them.
  3. Ratio: . Why this step? The ratio doesn't even need the die size — it's just the area ratio. One fat core = fifty skinny ones. This is the physical reason the two philosophies can't coexist: Power Consumption and area are one fixed budget you spend once.

Now compare that arithmetic to the figure below. The left panel is a single die tile filled almost entirely by one blue core — the multicore way, spending everything on being big and clever. The right panel is the same-size tile (see the yellow "same area" arrow bridging them) tiled by a grid of tiny green cores — the manycore way. The eye sees instantly what step 3 proved: one fat core and fifty skinny cores occupy identical silicon. That equal area is the whole reason "you can't have both."

Figure — Multicore vs manycore designs

Verify: ✓; ✓; ✓. Units: mm² / mm² = dimensionless count. ✓


Example 7 — Cell G: utilization collapse (the manycore flood dries up)

  1. Recompute REF-GPU throughput with : GIPS. Why this step? multiplies everything linearly — divergence (see SIMD vs MIMD) is the manycore's kryptonite because its cores share instruction streams and stall together.
  2. Compare: REF-CPU now wins even on throughput. Why this step? This is the degenerate case for the manycore side: when the workload is irregular, its numerical advantage evaporates. It answers "when does a firehose lose to an eyedropper?" — when the firehose is 90% air.
  3. Solve for the break-even (part b): set REF-GPU throughput equal to REF-CPU's 115.2 GIPS and solve for : Why this step? It converts the vague worry "manycore sometimes loses" into an exact, predictable threshold. Below the REF-GPU falls behind the REF-CPU; above it, the REF-GPU wins. Now you can forecast the winner from workload regularity alone, without re-running the whole calculation — the single most useful number in this cell.

Verify: ✓; ✓; ✓ — and indeed the normal (Example 5) is well above , consistent with REF-GPU winning there, while sits below , consistent with it losing here. ✓


Example 8 — Cell H: real-world word problem

  1. Classify the database. Query planning is sequential with unpredictable branches; index traversal is pointer chasing; locks are serial critical sections ⇒ low , irregular. → multicore. Why this step? Low parallel fraction + branchy control flow is exactly Cell A/C territory where core count can't help and fast single-thread (Thread-Level Parallelism with few strong threads) matters.
  2. Classify the training loop. Dense matmul ⇒ , regular, Cache Coherence-light, bandwidth-bound. → manycore. Why this step? is Cell B — the only regime where thousands of cores pay off linearly.
  3. Decision: database → multicore CPU; training → manycore GPU. If forced to buy exactly one, pick by which service is the bottleneck on revenue: if latency-per-transaction is what customers pay for, buy the multicore CPU and rent GPU time for occasional training; if the product is the trained model, buy the manycore GPU and run the database on the existing host CPU. The genuinely correct architecture, though, is to keep both and route each workload to the chip it suits — this is exactly the Heterogeneous Computing design pattern. Why this step? It forces the reader to notice that "which is better" is always workload-relative; there is no universal winner, and real systems resolve the dilemma by using both.

Verify: Cross-check with Example 4 (branchy 30%-parallel → multicore , base-speed matters) and Example 2 ( matmul → manycore ). Both worked examples agree with this classification. ✓


Example 9 — Cell I: the exam trap

  1. Spot the trap: , not . The naive reader multiplies by core count. Why this step? The word "90% parallel" is deliberately close to 100% to tempt you into linear scaling. Only scales linearly (Example 2).
  2. Compute properly: . Why this step? Include the serial term — the one the trap wants you to forget.
  3. Result: . The ceiling () is only . Why this step? , nowhere near . Answer: FALSE. 1000 cores buy you 99% of a measly ceiling.

Verify: ✓; ceiling ✓; and (must be below the limit) ✓. ✓


Recall Quick self-test

A 100% serial task on 512 cores gives speedup? ::: Exactly — cores are useless (Cell A). The speedup ceiling for ? ::: (Cell D). One 10 mm² core equals how many 0.2 mm² cores? ::: (Cell F). Below what utilization does the 512-core REF-GPU lose to the 115.2 GIPS REF-CPU? ::: (Cell G). "90% parallel on 1000 cores ≈ 1000×" — true or false? ::: False, it's , ceiling (Cell I).