1976 - Cray-1 向量處理器:一條指令算一整個向量#
案件摘要#
1976 年,Seymour Cray 的 Cray-1 問世——80 MHz、160 MFLOPS、液冷、C 形座椅造型, 是當時全球最快的電腦。它的祕訣是向量處理器:一條指令處理一整個向量, 以深流水線與鏈結(chaining)榨盡記憶體頻寬。HPC(高效能運算)的黃金年代自此展開, LINPACK、TOP500、甚至今天的 GPU,都是它的精神後代。
前因 -- 為什麼會有這個案子#
- scalar 處理器的罩門:迴圈處理陣列時,每個元素都要一次 fetch-decode-execute——指令頻寬不足、迴圈開銷吃掉性能。
- 記憶體頻寬浪費:scalar 機器一次搬一個字,記憶體系統的潛力沒榨乾。
- Cray 的關鍵推理:科學計算的熱點是規律的陣列運算——一條指令交辦整個向量:
\[ \text{scalar}:\ C_i \leftarrow A_i + B_i\ \forall i \quad\Longrightarrow\quad \text{vector}:\ V_3 \leftarrow V_1 + V_2\ \text{(一條指令,} N \text{ 個元素)} \]
- Cray Research(1972):Cray 離開 CDC 後自創公司,賭注是「最貴的電腦賣給最需要算力的客戶」。
線索與推理 -- 數學式、程式、理論#
1. 案件現場:向量暫存器與深流水線#
Cray-1 有 8 個向量暫存器(各 64 個 64-bit 元素)、12 個功能單元,全部深流水線:
- vector load/store:一次從記憶體串流搬整個向量進向量暫存器。
- vector add:一條指令讓 64 個元素流過流水線——每 cycle 產出一個結果。
- chaining(鏈結):
V3 ← V1+V2的結果邊產出邊餵給V4 ← V3×V5——兩條向量指令像接力一樣並行。
\[ T_{\text{vector}} = \underbrace{T_{\text{startup}}}_{\text{流水線填滿}} + N \times \underbrace{1}_{\text{每 cycle 一結果}} \quad\Longrightarrow\quad N \text{ 越大,每元素成本越低} \]
2. Amdahl 的向量版:加速比的極限#
\[ S = \frac{1}{(1-f) + f/r} \]
- \(f\) = 可向量化比例, \(r\) = 向量加速比(10–50 倍)。
- 教訓:程式的标量尾巴決定上限——90% 向量化 + 50 倍加速,總加速也只有 9 倍。
- 這逼出了 Fortran 向量編譯器(自動向量化迴圈)與 Cray 客戶的「向量化競賽」。
3. LINPACK 與 Roofline:性能的度量衡#
- LINPACK(1979):解線性方程組的 benchmark,成為超級電腦的測量標準;1993 年起 TOP500 榜單以它排名。
- Roofline 模型(2009)的先驅:性能被算力峰值與記憶體頻寬夾擊——
\[ \text{perf} = \min(\text{peak FLOPS},\ \text{BW} \times \text{arithmetic intensity}) \]
- Cray-1 的記憶體設計(多 bank 交錯、雙向流水線)正是為了餵飽向量單元。
4. 工藝與造型:速度的三線作戰#
- IC 化:Cray-1 用 SSI/MSI 積體電路(約 200,000 顆閘),時脈 80 MHz(1976 最快)。
- 液冷:115 kW 的發熱靠 freon 冷卻;C 形座椅造型不只是美學——底部是電源與冷卻系統。
- 關鍵教訓:超級電腦 = 架構 × 工藝 × 散熱(見 1964-CDC6600 案的三線作戰傳統)。
5. Python 實作:向量化加速比#
def vector_time(n, startup, per_element):
return startup + n * per_element
def scalar_time(n, per_loop_overhead, per_element):
return n * (per_loop_overhead + per_element)
def amdahl(f, r):
return 1 / ((1 - f) + f / r)
n, startup = 64, 10
for scalar_cycle in [2, 4]:
t_s = scalar_time(n, 1, scalar_cycle) # 每元素:迴圈開銷+運算
t_v = vector_time(n, startup, 1) # 向量:每 cycle 一結果
print(f"scalar_cycle={scalar_cycle}: scalar={t_s} cycles, vector={t_v} cycles, "
f"加速 {t_s/t_v:.1f}x")
# scalar_cycle=2: scalar=192 cycles, vector=74 cycles, 加速 2.6x
# scalar_cycle=4: scalar=320 cycles, vector=74 cycles, 加速 4.3x
for f, r in [(0.5, 10), (0.9, 10), (0.95, 50)]:
print(f"向量化比例 {f:.0%}, 向量加速 {r}x → 總加速 {amdahl(f, r):.1f}x")
# 50% / 10x → 1.8x
# 90% / 10x → 5.3x
# 95% / 50x → 10.8x ← 標量尾巴才是真正瓶頸
結案 -- 後果與影響#
- HPC 產業誕生:Cray-2/X-MP/C90 系列、日本 FESP(Fujitsu VP、NEC SX)競逐、國家超算中心文化。
- LINPACK 與 TOP500:1979 的 benchmark 成為 1993 年起的全球排名標準。
- 向量→SIMD→GPU:x86 MMX/SSE/AVX 的「一條指令多資料」、GPU 的 SIMT——精神源頭都在 Cray-1。
- 編譯器並行化:自動向量化、迴圈變換——現代編譯器優化的先驅。
關鍵人物與文獻#
- Seymour Cray:Cray-1 設計者;「cray-1 hardware reference manual」, 1977。
- Jack Dongarra(1979):LINPACK benchmark 作者;TOP500 促成者。
- Richard Russell 等(Cray):Fortran 向量編譯器(CFT)團隊。
- R. W. Hockney, C. R. Jesshope, Parallel Computers, 1981——向量處理的標準教材。
- 相關案件:
1964-CDC6600超級電腦.md、1993-GPU圖形處理器.md、2012-GPU深度學習算力.md。