1964 - CDC 6600 超級電腦:scoreboard 與亂序的雛形#
案件摘要#
1964 年,Seymour Cray 在 Control Data Corporation 推出 CDC 6600——全球第一台超級電腦, 3 MFLOPS 的速度是 IBM 7090 的三倍。它的祕訣不是更快的零件,而是架構: 十個功能單元並行運作,由 scoreboard(記分板) 追蹤相依性、讓指令亂序完成。 Cray 只為科學計算優化、砍掉一切通用包袱——超級電腦產業自此誕生。
前因 -- 為什麼會有這個案子#
- 商用電腦不夠快:科學計算(核武模擬、氣象)需要的算力遠超 IBM 7090 等通用機;通用設計的 I/O 與相容包袱拖慢了數值運算。
- 功能單元閒置:單一 ALU 依序執行時,加法器與乘法器輪流上班,硬體利用率低。
- Cray 的關鍵推理:砍掉通用性、讓簡單指令 + 多功能單元並行取代複雜指令:
\[ \text{性能} = \underbrace{\text{簡單指令}}_{\text{易解碼}} \times \underbrace{\text{多功能單元}}_{\text{並行}} \times \underbrace{\text{scoreboard}}_{\text{相依性管理}} \]
- I/O 卸載:10 顆週邊處理器(PPU)獨立處理輸出入,中央處理器只管計算。
線索與推理 -- 數學式、程式、理論#
1. 案件現場:十個功能單元與 scoreboard#
CDC 6600 的 CPU 有 10 個獨立功能單元(2 個浮點加、2 個浮點乘、除法、移位、布林、遞增×2), 由 scoreboard 決定每條指令何時發射、何時寫回:
\[ \text{IPC} = \frac{\text{完成的指令數}}{\text{總 cycle 數}},\qquad U = \frac{\text{功能單元忙碌時間}}{\text{總時間}} \]
- scoreboard 三份表格:指令狀態(issue/read/execute/write-back)、功能單元狀態(忙?目的暫存器?來源就緒?)、暫存器結果狀態(誰會寫我?)。
- 亂序完成(out-of-order completion):長延遲指令先發射、短指令後發射先完成——硬體利用率大增。
2. 三種相依性:hazard 檢測的數學#
| 相依 | 意義 | 例子 | scoreboard 的處理 |
|---|---|---|---|
| RAW | 真相依(讀後寫) | R1 ← R2+R3 之後 R4 ← R1×R5 | 等結果就緒才 read |
| WAR | 反相依(寫後讀) | R4 ← R1×R5 之後 R1 ← R2+R3 | 等讀完才寫回 |
| WAW | 輸出相依 | 兩條指令寫同一暫存器 | 等前一條寫完 |
- RAW 是真相依,無法消除;WAR/WAW 是假相依(只是名字撞到),可由 renaming 消除——這正是 Tomasulo(見 1967 案)接手的方向。
- scoreboard 逐項檢查 hazard,發射條件:功能單元閒置 + 無 WAW + 來源無 RAW(CDC 6600 用「等讀完才寫」規避 WAR)。
3. 週邊處理器:I/O 卸載#
10 顆 PPU 輪流服務 I/O 與作業系統,中央處理器的計算不被打斷:
\[ T_{\text{wall}} = T_{\text{compute}} + \underbrace{T_{\text{I/O}}}_{\text{由 PPU 承擔}} \quad\Longrightarrow\quad T_{\text{wall}} \approx T_{\text{compute}} \]
這是「異構分工」的最早實踐——I/O 交給小處理器,計算交給大處理器,GPU/NPU 的異構概念由此發芽。
4. 工藝與冷卻:速度不只靠架構#
- Si 電晶體 + cordwood 模組:元件密度高、走線短,時脈 10 MHz(當時最快)。
- Freon 液冷:3 MFLOPS 的發熱需要冷卻系統——Cray 機器的標誌造型(C 形座椅環繞機櫃)兼具散熱與美學。
- 關鍵教訓:超級電腦的戰場是「架構 × 工藝 × 散熱」三線作戰。
5. Python 實作:scoreboard 亂序模擬#
units = { # 功能單元:名稱 → (延遲, 數量)
'fp_add': (2, 2), 'fp_mul': (4, 2), 'div': (14, 1), 'bool': (1, 1),
}
prog = [ # (單元, 目的, 來源)
('fp_add', 'R1', ['R2', 'R3']), # RAW 之後的指令要等 R1
('fp_mul', 'R4', ['R1', 'R5']),
('fp_add', 'R6', ['R7', 'R8']), # 無相依,另一顆加法器可並行
('bool', 'R9', ['R4', 'R6']),
]
avail = {u: [0] * n for u, (d, n) in units.items()} # 各單元下次空閒時間
done, busy_time = {}, 0
for i, (u, dst, srcs) in enumerate(prog):
delay, _ = units[u]
start = avail[u][0]; avail[u].pop(0)
start = max(start, max([done.get(s, 0) for s in srcs])) # RAW:等來源完成
finish = start + delay
done[dst] = finish # 目的暫存器完成時間
avail[u].append(finish)
print(f"i{i} {u:6s} {dst:3s}: start={start:2d} finish={finish:2d}")
print(f"總完成時間 = {max(done.values())} cycles")
# i0 fp_add R1: start= 0 finish= 2
# i1 fp_mul R4: start= 2 finish= 6 ← 等 R1(RAW),但 2 顆乘法器仍可用
# i2 fp_add R6: start= 0 finish= 2 ← 與 i0 並行(第二顆加法器)
# i3 bool R9: start= 6 finish= 7
# 總完成時間 = 7 cycles(in-order 序列執行需 2+4+2+1=9)
(同序執行需 9 cycles,scoreboard 並行只需 7——亂序完成的價值一目了然。)
結案 -- 後果與影響#
- 超級電腦誕生:CDC 6600 賣出約 100 台,CDC 一度成為 IBM 之外最大電腦公司;Cray 繼而打造 CDC 7600,1972 年獨立創業 Cray Research。
- scoreboard 傳世:相依性檢查、亂序完成、功能單元排程——Tomasulo(1967)、現代亂序處理器的直系祖先。
- 異構分工的起點:PPU 卸載 I/O 的思想延續到協同處理器、GPU 與 NPU。
- HPC 文化:LINPACK、TOP500(1993)、超算中心——源頭都在 1964 這台機器。
關鍵人物與文獻#
- Seymour Cray:CDC 6600/7600 設計者;Cray Research 創辦人(1972)。
- James Thornton:CDC 6600 scoreboard 架構的工程負責人,《Design of a Computer: The Control Data 6600》, 1970。
- R. M. Tomasulo, "An Efficient Algorithm for Exploiting Multiple Arithmetic Units", IBM Journal, 1967。
- J. Hennessy, D. Patterson, Computer Architecture: A Quantitative Approach, 1990——scoreboard 與 Tomasulo 的標準教材。