CDC 6600 Scoreboard: Reservations, Dependencies, and Parallel Execution
Trace the CDC 6600 scoreboard through Thornton's 1970 account and contemporary 1964 context, separating documented mechanisms from modern CPU analogies.
The CDC 6600’s scoreboard solved a practical problem created by parallel hardware: several instructions could need the same functional unit or register at once, while independent units should not sit idle just because one operation was waiting. The scoreboard tracked those reservations and controlled when operands could be read and results stored. Its importance is not that it was an early version of every feature in a modern CPU. It is that it made concurrency in a real scientific computer an explicit control problem with visible resource and dependency rules.
The sources serve different purposes and dates. James E. Thornton’s 1964 AFIPS paper, “Parallel Operation in the Control Data 6600,” describes system organization and project history from an engineer responsible for the design. A Centre for Computing History catalog record identifies a separate 1967 Control Data publication, 6600 Central Processor, Volume I: Control and Memory, as publication 020167. That record is bibliographic context; the technical analysis below follows Thornton’s 1970 book, Design of a Computer: The Control Data 6600, and does not attribute its details retroactively to every sentence of the 1964 paper.
Parallelism existed at more than one level
Thornton records that Control Data began the 6600 project in the summer of 1960 and delivered the first 6600 in October 1964. His system description separates a high-speed central processor, which runs the large scientific problem, from peripheral activity handled by ten peripheral processors and twelve I/O channels. Those ten peripheral processors are not the central processor’s ten arithmetic/control functional units. The machine used both kinds of concurrency, but at different architectural levels.
Inside the central processor, specialized units, including add, multiply, divide, shift, Boolean, increment, and branch units, could operate independently. Thornton’s later account explains how the scoreboard coordinates reservations for these units and the 24 operating registers. The goal was not to allow instructions to ignore dependencies; it was to keep units working when their operands and destinations were safe, while preventing conflicting operations from corrupting the program’s results.
The reservation model
The instruction stream reached the scoreboard in program order. On issue, the control logic checked whether the required functional unit and result register were free. If both were available, it reserved them and recorded which unit would produce each result. A unit could then wait for source operands, execute independently once both were available, and request permission to release its result. The scoreboard granted the store only when the destination path was clear, then cleared reservations and signaled waiting units that a result could be read.
Thornton describes 24 XBA identifiers associated with the machine’s 24 operating registers, then explains how the scoreboard tracked resource ownership and source readiness around multiple execution units. The useful mental model is therefore not “one big queue of ready instructions.” The central control mechanism gated operand reads and result stores as dependencies cleared.
Thornton presents first-, second-, and third-order conflicts. These are the source’s own terms; modern labels such as structural, read-after-write, and write-after-read are helpful approximations, not a claim that the two architectures have identical pipeline or recovery semantics.
First order: a resource or destination is already reserved
A first-order conflict occurs when two instructions need the same functional unit or the same result register. The 6600 cannot issue the later instruction until that conflict clears, so issue stops at the conflicting point. This is where resource availability and output-register ownership matter: two otherwise independent calculations still cannot both occupy a single non-pipelined unit or write the same destination concurrently.
Second order: a source depends on an earlier result
A second-order conflict occurs when an instruction needs as an input a register whose value is being produced by an earlier instruction. The dependent unit must wait until the producer stores its result and the source can be read. Thornton’s account explains that the conflict delays execution of that instruction only; later instructions can continue to issue if they do not create a first-order conflict. This is how the machine can preserve a dependency without turning every waiting operand into a whole-program stall.
Thornton’s example issues an add that will produce X6, followed by a divide that needs X6 as a source:
F X6 = X1 + X2
F X7 = X5 / X6
The divide cannot read the not-yet-produced X6. The scoreboard records which unit owns the pending result, waits until the add stores it, and only then lets the dependent operation proceed. An unrelated operation can still use another available unit and destination in the meantime.
Third order: protect an older read from a younger write
A third-order conflict occurs when an instruction is ready to store a result in a register that an earlier-issued instruction still needs to read as a source. If the younger write happened first, the older operation would consume the wrong value. The scoreboard therefore delays the result store, even if the arithmetic has already completed, until the older unit has latched its operands. This is a write-after-read ordering constraint. The distinction between “calculation finished” and “result may be written” is essential: the functional unit can finish and wait for release permission.
Together, the three cases show that the scoreboard did more than reserve hardware. It separated issue, operand acquisition, calculation, and result release, then placed a guard at each point where program order could be violated. This let execution overlap without adding a modern reorder buffer or renaming every architectural register.
What “out of order” means here and what it does not
Instructions were issued in the order prescribed by the original program, but a later independent unit could complete before an earlier long-latency operation. The scoreboard’s reservation and read rules prevented those completion differences from changing which values the program observed. That is a useful historical example of dynamic scheduling, but it is not a synonym for speculative execution or modern out-of-order retirement.
The sources do not justify claims that the 6600 had a modern reorder buffer, register renaming, speculative branch recovery, or precise exceptions in the contemporary sense. Nor should the “ten functional units” be recast as ten instructions issued every cycle: Thornton describes an instruction transfer during an ISSUE minor cycle followed by a SKIP minor cycle that advances past the second parcel of the 30-bit word. The machine’s actual overlap depended on available units, registers, operands, instruction formats, and memory paths, not on a single headline issue-width number.
The 6600 also kept system-level I/O work distinct from central arithmetic. Thornton describes ten peripheral processors, each with private storage for its own program and working data, plus access to central storage and I/O channels. That arrangement moved much device-management work away from the central processor, while the scoreboard handled conflicts among central-processor units. Putting both facts side by side avoids a common historical mistake: using the same “parallel processors” phrase for peripheral processors and arithmetic functional units as if they were interchangeable resources.
Why the design remains a useful case study
Thornton’s 1964 paper presents a machine organized around concurrency, not a single instruction stream that performs all activity serially. His 1970 account makes the control cost visible: each unit, destination, and pending source had to be tracked, and permission to read or write became part of the operation. The scoreboard is compelling precisely because it did not erase hazards. It made them explicit and handled each class at the point where the conflict mattered.
This is an interpretation of the primary descriptions, not a claim that one design alone created modern dynamic scheduling. The 6600 case is best read on its own terms: a centralized reservation mechanism coordinating specialized units, with fixed architectural registers and no assumption that the unit that finishes first must be the unit that was issued last. Comparing it with later designs is useful only when differences such as register renaming, speculation, retirement, and pipeline organization are stated rather than silently imported.
For a focused reading, start with Thornton’s 1964 system overview, then follow the “Reservation Control (Scoreboard)” section of his 1970 book for the detailed conflict analysis. The separate 1967 catalog record helps identify a near-period Control Data publication, but it is not a substitute for the accessible technical account used here. This keeps a contemporaneous paper, a bibliographic record, and a later author retrospective distinct.
Related:
- Cray-1: Designing a Supercomputer Around Vector Pipelines
- DEC PDP-11: A General Register Machine Built Around the UNIBUS
Sources:
- James E. Thornton, “Parallel Operation in the Control Data 6600,” AFIPS Fall Joint Computer Conference, 1964, pp. 33–40 (original paper scan)
- Thornton paper text as reproduced in Computer Structures: Readings and Examples, Chapter 39
- James E. Thornton, Design of a Computer: The Control Data 6600, 1970, scoreboard section (Computer History Museum scan)
- Centre for Computing History catalog record for CDC 6600 Central Processor, publication 020167