Intel's Pentium (1993) is step 3: two in-order pipes, U and V, taking a pair of instructions per cycle when the pair fits the rules. The Pentium Pro of 1995 is step 4 — a February 1995 Microprocessor Report describes x86 instructions decoded into micro-operations, a reservation station, a reorder buffer and out-of-order execution, with a 133 MHz target. The big x86 and ARM cores in your laptop and phone are step-4 machines of this kind, four to eight wide.
Doing more per cycle: superscalar, static vs dynamic scheduling, the limits of ILP
After this lesson you will turn any issue width into an ideal CPI, place a processor on the four-step ladder from scalar to superscalar, write the exam's "main concepts and benefits" answer in five lines per technique, and say why real cores stopped at four to six instructions per cycle.
In 1967 Robert Tomasulo described the IBM System/360 Model 91's floating-point unit as hardware that speeds execution by "looking ahead" about eight instructions for work it can run early. Intel's Golden Cove core (2021) keeps 512 instructions in flight in its reorder buffer and decodes six per cycle: the window grew 64 times, the width 6 times.
Yet on ordinary programs such a core completes about two to three instructions per cycle. Lighterra's guide to modern microprocessors quotes Andy Glew's confession: "the dirty little secret of OOO is that we are often not very much OOO at all". Where did the other slots go?
That gap is this lesson: the trick that makes a CPI below 1 possible, the ladder of designs that reach it, the five walls that stop it — and the exam question that asks for all of it in five lines per technique.
One instruction per cycle is a ceiling, not a law
Every pipeline so far — the five-stage datapath of lesson 1, the multi-cycle pipelines of lesson 7 — obeys one silent rule: at most one instruction enters per clock and at most one leaves. Ideal CPI = 1; hazards push it above 1. Even a program of independent instructions is processed by the scalar pipeline "sequentially, one at a time" (p. 89).
Dynamic scheduling (lesson 7) attacks the stalls, not the rule. The notes' three instructions of p. 87, numbered from I0 as the papers do and in the papers' mnemonics (older papers write $F0; the 2026 paper and this notebook drop the dollar sign):
I0: FDIV F0, F2, F4 ; long: the divider takes many cycles
I1: FADD F10, F0, F8 ; RAW on F0: must wait for I0
I2: FSUB F12, F8, F14 ; independent of both
In order, I2 waits behind I1 and I1 waits for the divider. With dynamic scheduling the three are still issued in program order, but into reservation stations: I1 waits there for F0 while I2 executes, and each result reaches its consumers over the common data bus (lessons 11–13; the scoreboard, lessons 9–10). What does not change: one instruction is still issued per cycle, so the CPI can approach 1 but never go below it.
Multiple-issue processor — a processor that fetches, decodes, issues and executes more than one instruction per clock cycle (Definition 1, p. 89), the parallel instructions chosen by the hardware at run time (superscalar) or by the compiler at compile time (VLIW).
The simplest case is the dual-issue pipeline: up to two instructions fetched, decoded and issued per clock (Definition 2, p. 90). Fig. 1 redraws the notes' Figure 22 as a before / after pair: same stages, same clock, instructions travelling in pairs.
Before: scalar, one instruction per clock
After: dual issue, two instructions per clock
The notes' figure runs its clock at 2 ns: two instructions every 2 ns is one per nanosecond, 1000 MIPS from a 500 MHz clock — twice the scalar pipeline. Ideal IPC = 2, ideal CPI = 1/2 = 0.5. The general rule (p. 95), on which every "ideal CPI" quiz of the exam rests, is one line:
- \(w\)
- issue width: instructions fetched, decoded, issued and started per clock, at most
- depth
- pipeline stages (Fig. 1: 2 × 5 = 10)
- stalls/instr
- what hazards, misses and mispredictions add, as the example formula sheet writes it
What a second issue slot costs
Figure 23 of the notes (p. 91) is Patterson and Hennessy's two-issue datapath, its additions drawn in orange but not explained; Fig. 2 names them. One packet per cycle — one ALU-or-branch instruction plus one load-or-store, p. 91 — needs five additions:
- a wider fetch: two instructions, 64 bits, per cycle;
- two decoders;
- a register file with 4 read ports and 2 write ports — an ALU operation reads two registers and a store reads two more (base and data); an ALU operation and a load both write in the same cycle;
- a second adder for the load's address;
- hazard detection across the pair (p. 93): independent, compatible types.
Even this ideal 2-wide machine rarely reaches its width. Patterson and Hennessy's own five-instruction loop runs on it at IPC 1.25, not 2: the pairing rule and the load-use delay leave three of the eight slots empty, and only unrolling the loop four times lifts it to 1.75. That gap is what the notes mean by "it cannot be always reached" (p. 95) and what the exam measures as code efficiency (section 4).
Each costs area and power, and not alike: ports and decoders grow with w, the bypass network — each result compared with every source operand of the next packet — with w². The widget shows that growth, and the ideal CPI falling as 1/w while the achieved one goes flat.
Multiple issue multiplies the work in flight by the width: ideal CPI = 1/w, in flight = w × depth — a ceiling, because the slots still have to be filled with independent instructions.
Four steps from scalar to superscalar
The notes (pp. 92–94) describe the road from the scalar pipeline to the modern core as four steps, summed up in Table 10. Read it column by column first.
| Step | Issue | Execution | Commit | Example |
|---|---|---|---|---|
| 1 | In-order | In-order | In-order | Scalar pipeline |
| 2 | In-order | Out-of-order | In-order | Dynamic single-issue |
| 3 | In-order | In-order | In-order | Dual-issue pipeline |
| 4 | In-order | Out-of-order | In-order | Superscalar processor |
Issue is in order in every row; commit is in order in every row; only Execution changes, and the width. A processor becomes superscalar by widening issue and freeing execution — never by reordering issue or commit. Issue stays in order so that each instruction meets its predecessors on the way in; commit stays in order so that an exception finds the state a sequential execution would have left — precise, as in lesson 7; the reorder buffer of lesson 17 enforces it, and the notes assume it for step 2 ("a commit stage ensures in-order architectural updates", p. 92).
One fragment, four rows. The machine: one unit of each kind, all pipelined; FDIV 8 cycles, FADD and FMUL 3, LD 2, ADDUI 1; a result is written the cycle after execution ends and committed the cycle after that; different units may write in the same cycle; at most w commits per cycle. "In-order execution" means that the starts are in program order — a short operation may still finish before a longer one that started earlier, as in the multi-cycle pipeline of lesson 7; the in-order commit puts the results back in order.
I0: FDIV F0, F2, F4 ; 8 cycles
I1: FADD F6, F0, F8 ; RAW on F0 (I0)
I2: LD F10, 0(R1) ; 2 cycles, independent
I3: FMUL F12, F10, F14 ; RAW on F10 (I2)
I4: ADDUI R1, R1, 8 ; writes the R1 that I2 reads (WAR)
I5: FADD F16, F8, F14 ; independent
Step 1 — single issue, in-order execution. I0 issues in cycle 1, starts in 2, writes F0 in 10. I1 needs F0 and cannot issue before 10 — nor can anything behind it: I2, dependent on nobody, waits until 11. Last commit: cycle 21. "Hazards (data, structural, control) cause pipeline stalls that affect all subsequent instructions" (p. 92).
Step 2 — single issue, out-of-order execution. I1 issues in cycle 2 into a reservation station and waits; I2 issues in 3, starts in 4, writes in 6; I3 to I5 follow. Every result exists by cycle 14, but commit is in order, one per cycle: I1 at 15, I2 to I5 at 16 to 19. "Throughput is still constrained by the single-issue limit" (p. 92).
Step 3 — dual issue, in-order execution. Two independent instructions on different units issue together: I1 and I2 in cycle 10, I3 and I4 in 13, I5 in 14 — 19 again, because an in-order packet stalls as a unit: I2 waited with I1. "Dependent instructions must wait, even if others could proceed" (p. 93).
Step 4 — dual issue, out-of-order execution. I0 and I1 issue in cycle 1, I2 and I3 in 2, I4 and I5 in 3; the independent work is written by cycle 9, the chain at 14, and two commits per cycle end at 17. In the layout of the exam's Tomasulo tables, with a commit column:
| INSTRUCTION | ISSUE | START EXEC | WRITE RESULT | COMMIT | Hazards Type |
|---|---|---|---|---|---|
I0: FDIV F0, F2, F4 | 1 | 2 | 10 | 11 | None |
I1: FADD F6, F0, F8 | 1 | 11 | 14 | 15 | RAW with I0 for F0 |
I2: LD F10, 0(R1) | 2 | 3 | 5 | 15 | None |
I3: FMUL F12, F10, F14 | 2 | 6 | 9 | 16 | RAW with I2 for F10 |
I4: ADDUI R1, R1, 8 | 3 | 4 | 5 | 16 | WAR with I2 for R1, solved (operand copied at issue) |
I5: FADD F16, F8, F14 | 3 | 4 | 7 | 17 | None |
Against step 1: step 2 saves two cycles, step 3 two, step 4 four. Each middle step removes one restriction — the order of execution or the width of issue — and the superscalar removes both. And no machine on the ladder, however wide, finishes before cycle 15: issue, start, eight cycles of divide, three of add and one commit for the chain FDIV → FADD. A true dependence is what no width can touch; section 5 names that fact.
"Out of order means out-of-order issue." No: in all four rows the instructions are issued in program order, one packet per cycle; execution and write-result reorder, and commit restores the order. The exam's Tomasulo tables rest on this — the ISSUE column grows by one per row.
Issue and commit are in order in every design; only execution is freed, and only the width grows. Step 2 and step 3 each remove one restriction of the scalar pipeline; the superscalar removes both.
The superscalar recipe and its six parts
Superscalar processor — "a dynamically scheduled, multiple-issue architecture capable of issuing and executing several instructions per clock cycle, using complex hardware mechanisms to detect and exploit instruction-level parallelism at runtime" (Definition 3, p. 95).
The notes reserve the word for step 4 — multiple issue plus dynamic scheduling; some textbooks also call step 3 an in-order superscalar, but on the exam follow the notes. Four key characteristics (pp. 95–96): an issue width, "the maximum number of instructions a processor can fetch, decode, issue, and begin executing in a single clock cycle", which "cannot be always reached (hazards, etc.)"; dynamic scheduling, the hardware analysing dependences in real time; out-of-order execution, as soon as operands and resources are ready; in-order commit, so that the architectural state follows program order and exceptions stay precise. A superscalar is not several pipelines side by side: one front end issues up to w instructions per cycle into one shared pool of units, and they still form one program.
The architecture "must include" six components (p. 96). Fig. 3 places each in the path of an instruction; the list says what each buys, because the exam asks for benefits.
- Multiple functional units — ALUs, FP units, load/store units: somewhere to put a wide issue.
- Register renaming — more physical names than architectural registers; it "eliminates WAR and WAW hazards".
- Reservation stations / issue queues — where instructions wait for operands or units, so issue continues past a stalled one.
- Reorder buffer — holds results "until they are safe to commit": in-order commit, precise exceptions.
- Common data bus — broadcasts each result with its tag to every waiting instruction in one cycle.
- Instruction window — the "sliding window of in-flight instructions from which the scheduler selects those ready to issue".
Benefits (p. 96): high ILP; dynamic parallelism — "no need for compiler to expose ILP, hardware finds it at runtime"; latency hiding of misses and FP divides; generality, "even without manual tuning". Challenges (pp. 96–97): complex hardware; issue-logic scalability — "the complexity of deciding which N instructions to issue out of M in-flight grows quickly", every broadcast tag being compared with every waiting operand every cycle; branch and memory dependences; diminishing returns — "after 3-4 issue width, real programs rarely expose enough parallelism to fully utilize the issue bandwidth" (p. 97; p. 102 says 4–6 for the hardware's own limit).
The exam question this section answers
Question 1 of the 22 June 2026 paper (8 points): "Explain the main concepts and benefits of each one of the following techniques used by modern superscalar processors (Tomasulo-style)" — eight techniques, five lines each. The discipline is concept, benefit, cost: the table is the compressed form, the exam section writes it out. Reservation stations, the reorder buffer and SMT have their own lessons (11, 17, 29).
| Technique | Main concept | Benefit | Cost |
|---|---|---|---|
| Dynamic instruction scheduling | hardware decides at run time when each instruction executes: in-order issue, out-of-order execution | a stalled instruction no longer blocks independent ones; handles latencies unknown at compile time; one binary fits many pipelines | stations, tags, a broadcast bus |
| Branch prediction and speculation | predict outcome and target at fetch; execute the predicted path before the branch resolves, results held back | removes most control stalls; keeps a wide front end fed | flush on a misprediction, costing depth × width slots |
| Multiple-issue pipeline | fetch, decode, issue up to w per cycle into several units | IPC above 1, ideal CPI = 1/w | wider fetch, more ports, cross-packet checks |
| Reservation stations | buffers at each unit holding the operands or the tags of their producers | distributed hazard detection; operands fetched once; issue continues past a wait | one station per in-flight instruction |
| Register renaming | a new name (tag, physical register) for every destination; readers redirected | WAR and WAW disappear; only RAW remains; loops overlap | a larger register set or tag space, a rename table |
| Out-of-order execution | execute in the order operands become ready, not program order | fills the stall cycles of long operations; more ILP from the window | needs renaming and in-order commit |
| Reorder buffer | a FIFO in program order holding results until commit | precise exceptions; speculation undone by discarding entries | buffer space, commit latency |
| Simultaneous multithreading | several threads issue in the same cycle into one out-of-order core | empty issue slots filled with another thread's work; per-thread ideal CPI = threads/w | per-thread state; threads contend for caches and units |
Three true sentences from the 2025 midterm
The midterm of 5 May 2025, as the notes transcribe it (pp. 540–541), ends with three true-or-false statements to motivate: doubling the number of issues reduces the CPI; out-of-order execution can be generated by data cache misses; dynamic branch predictors improve the CPI. All three are true, and the motivation earns the points — the first only for the ideal CPI, the second because the scheduler, not the miss, is the mechanism. They are the fourth exam question below, with the motivations; the third one rests on the notes' formula (p. 541):
- \(f_b\)
- branch frequency
- \(m\)
- misprediction rate
- \(P\)
- misprediction penalty in cycles; it grows with the depth, and the work thrown away with depth × width
Superscalar = multiple issue + dynamic scheduling + out-of-order execution + in-order commit, built from units, renaming, stations, a reorder buffer, a common data bus and a window — and the exam wants the benefit of each.
Compiler or hardware: static vs dynamic scheduling
Who finds the parallelism? Table 11 (p. 98) answers in two rows, and everything else follows from them.
Performed by the compiler, at compile time: the schedule is fixed before the program runs.
Performed by the hardware, at run time: decided every cycle from what is ready.
A VLIW (Very Long Instruction Word) processor is "a statically scheduled, multiple issue processor architecture in which the compiler selects and packs multiple independent operations into a single, wide instruction word that is executed in parallel by the processor" (p. 98) — a memory, a floating-point and an integer operation per word, the three columns of the exam's VLIW table. The compiler detects the ILP, schedules around the hazards (it knows every latency) and fills the empty slots "with NOPs when no instruction fits" (p. 98); the hardware checks nothing.
Static: the compiler packs the words, NOPs included
Dynamic: the hardware fills the units from the window
The formula sheet measures the left panel in one number:
- \(\mathrm{IC}\)
- instructions (operations) actually scheduled
- \(\#\text{cycles} \times \#\text{issues}\)
- all the slots of the schedule: cycles times issue width; the difference is NOPs
In Fig. 4, 10/21 = 47.6 % of the slots do work; lesson 20 computes it for the exam's schedules, where every VLIW exercise asks it. The right panel is the superscalar's answer: "the compiler generates sequential code (as usual, no additional effort)" (p. 99); the hardware chooses every cycle from whatever is ready.
The balance sheet (pp. 98–99) follows from who decides. The VLIW gains simple hardware — "no need for out-of-order logic, dependency checks at runtime, or renaming hardware" — predictable timing, and energy efficiency, the decision being made once at compile time instead of every cycle in silicon. It loses three ways: performance depends on the compiler and on the visible ILP; binary compatibility — the schedule encodes one machine's units and latencies, so the next machine needs a recompilation, and it "cannot adapt to unpredictable latencies at runtime"; and wasted slots — NOPs that still cost fetch bandwidth and code size. The superscalar reverses every line — adapts, stays portable, finds hidden ILP — and pays in area, power, scheduling logic that "becomes a bottleneck at wider issue widths" and timing that is hard to verify (Table 12).
| Feature | Static (VLIW) | Dynamic (superscalar) |
|---|---|---|
| Scheduling responsibility | Compiler | Hardware |
| Instruction issue | Fixed and pre-planned | Determined at runtime |
| Flexibility at runtime | Low | High |
| Hardware complexity | Low | High |
| Compiler complexity | High | Moderate |
| Portability of compiled code | Low (machine-dependent) | High |
| Latency tolerance | Poor (fixed schedule) | Good (adaptive execution) |
| ILP exploitation | Only what compiler exposes | Also includes dynamic/hidden parallelism |
"Moderate" on the dynamic side is a real middle: a scheduling compiler still helps a superscalar (fewer stalls inside the window), but nothing breaks without it, whereas on a VLIW the compiler's schedule is the only thing that keeps the results right.
Why can a VLIW binary not run on the next chip?
The compiler placed a load's consumer two words later because the memory latency was 3; on a chip where it is 5 the consumer fires before the value exists. The schedule is the hazard check, and it is wrong for the new machine: add interlocks and lose the simplicity, or recompile. A superscalar reads the same binary and waits in the station for the tag.
Hence the domains (p. 100): VLIW "for predictable workloads, embedded systems, or domain specific processors, where simplicity and determinism matter"; superscalar for general-purpose computing, where run-time variability makes "hardware-managed scheduling more effective". Lessons 19–21 open the static side: bundles, list scheduling, software pipelining.
Static: the compiler packs independent operations into wide words and pays in NOPs and portability. Dynamic: the hardware picks from a window every cycle and pays in silicon and power.
Why ILP hit a wall — and the way out
Pipelining, multiple issue, dynamic scheduling and renaming "have pushed ILP to impressive levels" (p. 101) — and then it stops. Five limits, each already met in a widget:
- Limited parallelism in programs. Much code is sequential in logic, and the hardware exploits only what it sees: the instruction window, "the set of instructions that the processor can see and analyze" at a given time — a few dozen to a few hundred, bounded by area, power and timing, "a practical limit". Behind it stands a theoretical one, Amdahl's law.
- Dependency constraints. True dependences "cannot be bypassed or parallelized because the value doesn't exist yet": a chain executes one link at a time — the FDIV → FADD chain of the stepper.
- Control dependences and branches. Even with prediction and speculation, "mispeculation causes flushes and wasted cycles", growing with depth × width — the dial's second wall.
- Memory latency and aliasing. Misses are long and unpredictable, and dependences through memory are hard to resolve at run time, addresses being known only after execution — the third wall.
- Hardware complexity and power. The logic for dependence checking, wakeup-select, renaming and window scaling "grows rapidly"; "superscalar processors beyond 4-6 issue width become infeasible to scale" (p. 102) — the quadratic bar.
Amdahl's law, derived and corrected
The notes put limit 1 in numbers: "if 10% of our program is serial (f = 0.1), then the best speedup we can ever get is 1/0.1 = 10", even with "unlimited issue width, perfect branch prediction, and ideal memory". Lesson 3 met the law for one enhancement; here the enhancement is everything the machine can overlap and the serial part is the dependent chain.
Call the original execution time 1. A fraction \(f\) of it is serial and cannot be sped up; the rest, \(1 - f\), can be run \(p\) times faster (more issue slots, more units — any overlap).
The serial part still takes \(f\). The parallel part now takes \((1-f)/p\):
\[ T_{new} = f + \frac{1-f}{p} . \]Speedup is old time over new time:
\[ \mathrm{Speedup}(p) = \frac{1}{\,f + \dfrac{1-f}{p}\,} . \]Let \(p\) grow without bound; the parallel term vanishes and the serial one stays:
\[ \mathrm{Speedup}_{max} = \frac{1}{f} \quad (p \to \infty) . \]
The example formula sheet writes the same law with the enhanced fraction \(F\) and its speedup \(S\):
- \(F\)
- fraction of the time that is enhanced (parallelisable): \(F = 1 - f\)
- \(S\)
- speedup of the enhanced part: \(S = p\)
Same formula, \(F = 1 - f\) and \(S = p\). The exam trap is the reading: check whether the fraction you are given is the serial or the enhanced one before substituting. With \(f = 0.1\): \(p = 2\) gives 1.82, \(p = 4\) gives 3.08, \(p = 8\) gives 4.71, and no \(p\) reaches 10.
Where the slots went
Now the opening puzzle. A 512-entry window sees sixty-four times more than Tomasulo's eight instructions, but it sees the same programs: dependence chains executed one link at a time (limit 2, Amdahl's serial part); a branch every few instructions, each misprediction discarding depth × width slots (limit 3); loads that miss, stores whose addresses arrive late (limit 4). Two or three of the six slots fill on an average cycle, and widening window or issue adds comparators to a wakeup-select network that grows with window × width (limit 5). The slots went into the structure of the programs. The notes' "alternative forms of parallelism" (p. 102) are the rest of this course:
- Thread-level parallelism — multithreading. Several threads on one core or many; threads are independent by construction, so nothing has to be tracked between them: a stalled thread is replaced by a ready one, and an SMT core issues from several in the same cycle. Lesson 29.
- Data-level parallelism — SIMD and vectors. One instruction on many data elements; the parallelism is known in advance, so the window problem disappears. Lessons 30–32.
- Heterogeneous computing — accelerators. GPUs, TPUs, NPUs, FPGAs take the parallel, compute-intensive parts off the CPU. Lesson 32.
Five walls — window, true dependences, branches, memory, wakeup-select hardware — cap the sustained IPC at two or three; Amdahl says 1/f is the most any width can give; the way past is threads, data parallelism and accelerators.
Exam-style questions
Explain the main concepts and benefits of each one of the following techniques used by modern superscalar processors (Tomasulo-style): 1. Dynamic instruction scheduling; 2. Dynamic branch prediction and speculative execution; 3. Multiple-issue pipeline; 4. Reservation stations; 5. Dynamic register renaming; 6. Out-of-order execution; 7. Reorder buffer; 8. Simultaneous multithreading. (Five lines each.)
Show model answer
1. Dynamic instruction scheduling. The hardware, not the compiler, decides at run time when each instruction executes: instructions are issued in program order to reservation stations and start as soon as their operands and a functional unit are available, so execution and completion are out of order while issue and commit stay in order. Benefits: an instruction stalled on a long-latency producer (FP divide, cache miss) no longer blocks the independent instructions behind it; higher ILP and unit utilisation; latency hiding; dependences unknown at compile time (memory, misses) are handled; the same binary runs efficiently on different pipelines; it is the base for hardware speculation.
2. Dynamic branch prediction and speculative execution. A branch history table (with a branch target buffer) predicts the outcome and the target at fetch time from the past behaviour of the branch; the processor fetches, issues and executes the predicted path before the branch is resolved, keeping the results in the reorder buffer, and squashes them if the prediction was wrong. Benefits: removes most control stalls, keeps the issue slots of a wide machine full and exposes ILP across branches; the cost is the flush on a misprediction, which grows with pipeline depth and issue width.
3. Multiple-issue pipeline. The front end fetches, decodes and issues up to w instructions per cycle (the issue width) into several functional units, so IPC can exceed 1 and the ideal CPI is 1/w. It needs wider fetch and decode, a multi-ported register file, more functional units and hazard checks across the instructions issued together. Benefit: throughput multiplied by the width when enough independent instructions are available; the ideal is a maximum, rarely sustained because of dependences, branches and misses.
4. Reservation stations. Buffers in front of each functional unit that hold the operation, the operand values already available (Vj, Vk) or the tags of the instructions that will produce them (Qj, Qk); an instruction waits in its station and fires when the last operand arrives on the common data bus. Benefits: hazard detection is distributed (no central bottleneck), operands are fetched once at issue, so WAR hazards vanish, the station's tag renames the destination, so WAW hazards vanish, and issue continues past a waiting instruction.
5. Dynamic register renaming. At issue, every destination register is mapped to a new name — a reservation-station tag, a ROB entry or a physical register — and later readers are redirected to that name, so two instructions that reuse the same architectural register no longer conflict. Benefits: WAR and WAW hazards, which are name dependences, are eliminated; only true RAW dependences remain; more instructions can be in flight and loop iterations overlap without unrolling.
6. Out-of-order execution. Instructions execute in the order in which their operands become ready rather than in program order; issue and commit remain in order and results are broadcast on the common data bus to the waiting consumers. Benefits: independent instructions fill the cycles that dependent ones would waste, long latencies (loads, FP operations) are overlapped and more ILP is extracted from the instruction window; the cost is renaming, reservation stations and a reorder buffer to keep exceptions precise.
7. Reorder buffer. A FIFO in program order that holds each result from write-result to commit; the entry at the head commits to the register file (or to memory, for a store) only when it is complete and no longer speculative. Benefits: precise exceptions and an architectural state updated in program order; speculation can be undone by discarding the entries after a mispredicted branch; the register file is written only at commit.
8. Simultaneous multithreading. Several hardware threads issue in the same cycle into the functional units of one out-of-order core, each with its own PC and rename table, sharing the units and the caches. Benefits: thread-level parallelism fills the issue slots that the ILP of one thread leaves empty (both horizontal and vertical waste), so throughput rises at a small hardware cost; the ideal CPI of the core stays 1/w and the ideal per-thread CPI is threads/w; threads contend for caches and units, so single-thread performance can drop.
Five lines per item is the paper's own allowance: name the mechanism in one sentence, then the benefit, then one cost or condition. The examiner looks for the key words of each row (in-order issue, out-of-order execution, tags, broadcast, in-order commit, precise exceptions, threads/w) and for the distinction between items 1 and 6 — dynamic scheduling is the policy, out-of-order execution is what it produces.
Compare static (VLIW) and dynamic (superscalar) scheduling: who schedules the instructions and when, the main advantages and drawbacks of each approach, and their typical application domains.
Show model answer
Static (VLIW). The compiler, at compile time, packs independent operations into long instruction words, scheduling around the known latencies and inserting NOPs where no operation fits. Advantages: simple hardware (no dependence checks, no renaming, no out-of-order logic), predictable timing, low energy per instruction. Drawbacks: performance depends entirely on the compiler and on the visible ILP; the binary is tied to one machine configuration (units, latencies), so it must be recompiled for a new one; the schedule cannot adapt to run-time events such as cache misses or mispredictions; unused slots become NOPs, lowering the code efficiency IC/(cycles × issues). Domains: embedded, real-time, DSP and domain-specific processors.
Dynamic (superscalar). The hardware, at run time, detects the parallelism with reservation stations, register renaming and a reorder buffer, and issues whatever is ready. Advantages: adapts to unpredictable latencies, keeps binary portability (no recompilation), exploits the hidden parallelism of general-purpose code. Drawbacks: complexity, area and power; the scheduling logic becomes the bottleneck at wide issue widths; timing is hard to verify. Domains: general-purpose x86 and ARM cores. Both aim at IPC above 1; the trade-off between hardware complexity and compiler sophistication decides where each wins.
The two columns of Table 12 in sentences. Say explicitly who and when in the first line of each half; the binary-compatibility point and the NOP/code-efficiency point are the drawbacks the examiner expects to see named.
Let's consider a dual-issue SMT processor that can manage up to 4 hardware threads. What are the values of the ideal CPI and the ideal per-thread CPI? (Single answer.)
Show model answer
Answer 3: ideal CPI = 1/issue width = 1/2 = 0.5; ideal per-thread CPI = threads/issue width = 4/2 = 2.
The same question is in all three papers, always with five options built from the same numbers permuted: dual-issue with 4 threads in July 2024 and June 2026 (0.5 and 2), quad-issue with 8 threads in June 2025 (0.25 and 2). In 2026 a second point asks for a practical example of SMT scheduling with up to 4 threads on the dual-issue core. The two formulas are all you need here; the reasoning behind them and the scheduling example are lesson 29.
Considering superscalar processors, which of the following statements are TRUE? (Multiple answers; motivate each.)
Show model answer
Statements 1, 2 and 3 are true (1 only for the ideal CPI, 1/issue width); statement 4 is false, because dependences, branches and memory stalls do not shrink with the width and Amdahl's law bounds the gain at 1/f.
The first three statements are the True/False quiz of the 5 May 2025 midterm (notes pp. 540–541); the fourth is the standard distractor. The motivation earns the extra point: write "ideal", name the scheduler as the mechanism behind the miss, and write the CPI formula with its branch term.
A program spends 20 % of its execution time in a part that must run sequentially. The rest is accelerated 4 times by a wider, out-of-order core. What is the overall speedup?
Show model answer
Serial fraction \(f = 0.2\), \(p = 4\):
\[ \mathrm{Speedup} = \frac{1}{0.2 + \dfrac{0.8}{4}} = \frac{1}{0.4} = 2.5 \]In the formula sheet's form, \(F = 0.8\) and \(S = 4\): \(1/(0.2 + 0.8/4) = 2.5\). The ceiling for this program is \(1/0.2 = 5\).
Read the fraction first: "20 % sequential" is the serial \(f\), so \(F = 0.8\). The typical slip is to put 0.2 into the sheet's \(F\) and get \(1/(0.8 + 0.05) = 1.18\).
A compiler schedules the 10 operations of one loop iteration on a 3-issue VLIW processor in 7 cycles (delay slot included). How much is the code efficiency for a single iteration, in percent?
Show model answer
The formula is on the example formula sheet; the exam's VLIW exercises ask it after the schedule, together with the critical path, the CPI and the FP operations per cycle (lesson 20). Eleven of the 21 slots are NOPs.
Check yourself
In Table 10, going from step 1 (scalar pipeline) to step 2 (dynamic single-issue) changes exactly one column. Which?
In the dual-issue in-order pipeline (step 3), I1 waits eight cycles for a divide. I2, right behind it, depends on nothing. What happens to I2?
Which of these does a dual-issue in-order datapath need, compared with the single-issue one? Select all that apply.
Step 3 widens the datapath; step 4 adds the bookkeeping. Keep the two kinds of hardware apart in the open question.
A VLIW binary was compiled for a machine whose loads take 3 cycles. It is run, unchanged, on a successor whose loads take 5 cycles. What happens?
A quarter of a program's time is an inherently serial dependence chain. With unlimited issue width, perfect prediction and ideal memory, the best possible speedup is…
A core's instruction window is doubled; the program and its longest dependence chain are unchanged. Which statement is right?
What is true of the issue width of a superscalar processor? Select all that apply.
Key take-aways
- A scalar pipeline issues one instruction per cycle, so its CPI can never fall below 1; dynamic scheduling removes stalls but not this limit. Multiple issue removes it: ideal CPI = 1/w, and w × depth instructions are in flight.
- A dual-issue datapath needs wider fetch, two decoders, a 4-read/2-write register file, a second adder and a hazard check across the packet; ports grow with w, the bypass network with w².
- Table 10's ladder: issue and commit are in order in every design; step 2 frees execution, step 3 widens issue, the superscalar (step 4) does both. On the six-instruction fragment: 21, 19, 19, 17 cycles, and no width can beat the FDIV → FADD chain.
- The superscalar recipe is multiple issue + dynamic scheduling + out-of-order execution + in-order commit, built from functional units, renaming, reservation stations, a reorder buffer, a common data bus and an instruction window; the exam asks the benefit of each.
- Static scheduling (VLIW): the compiler packs independent operations into wide words and pays in NOPs, latency intolerance and binary compatibility; dynamic scheduling (superscalar): the hardware picks from a window and pays in area, power and issue-logic complexity. Code efficiency = IC/(cycles × issues) measures the NOPs.
- ILP stops at five walls — window, true dependences, branches, memory, hardware complexity; Amdahl bounds the speedup at 1/f; the way past is TLP, DLP and accelerators.
What to watch and read
-
Modern Microprocessors: A 90-Minute Guide!
Jason R. C. Patterson, Lighterrathe sections on superscalar, VLIW and the ILP wall
The plainest map of this lesson with real processor names and widths: read "Multiple Issue – Superscalar", "Explicit Parallelism – VLIW" and "The Power Wall & The ILP Wall" before starting, and come back to "The Brainiac Debate" after section 4.
-
FREESS — a free superscalar simulator in the browser
Roberto Giorgi, University of Siena
Load an example loop and run it with issue width 1, 2 and 4, then with a small and a large reorder buffer: the diminishing returns of the first widget, measured on a real out-of-order model with reservation stations, a ROB and a physical register pool.
-
Intel's P6 Uses Decoupled Superscalar Design
Linley Gwennap, Microprocessor Report, February 19957 pages
The Pentium Pro as it was announced: micro-operations, a reservation station, a reorder buffer, out-of-order execution. Step 4 of the ladder described in trade-press English, with numbers.
-
Limits of Instruction-Level Parallelism
David W. Wall, DEC WRL, ASPLOS 199113 pages
The measurements behind section 5: how much ILP exists under perfect and realistic prediction, renaming and alias analysis — each hardware technique removes one wall, and true dependences remain.
-
A New Golden Age for Computer Architecture — Turing Award Lecture
John Hennessy and David Patterson, ISCA 2018
The authors of the course textbook tell the story from the end of the easy ILP gains to multicore and domain-specific architectures — the "way out" of section 5, and the reading the professor lists in week 1.