跳轉到

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 的標準教材。