跳轉到

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。