跳轉到

2007 - 多核心 CPU(Dennard Scaling 的終結與轉身)#

案件摘要#

2004 年,Pentium 4 的時鐘頻率達 3.8 GHz 後停滯——Dennard Scaling 終結(見「1958-積體電路.md」):

\[ \text{功耗牆(power wall)} \quad\Longrightarrow\quad \text{頻率停滯} \quad\Longrightarrow\quad \text{轉向多核心並行}. \]

2006 年,Intel 發布 Core 2 Duo(雙核);2007 年 4 核、8 核、16 核湧現:

\[ \text{性能提升} \xrightarrow{\text{單核頻率停滯}} \text{多核心並行} \quad\Longrightarrow\quad \text{每一瓦性能提升 2.5\times}. \]

Dennard 的預言最終引導 20 年的處理器革命:

\[ \text{免費的效能提升} \quad\Longrightarrow\quad \text{藉由更多的核心來取代更高的頻率}. \]

前因 -- 為什麼會有這個案子#

  • Dennard Scaling(1974,IBM):隨著電晶體尺寸縮小,每個電晶體的功耗(動態功耗)下降——
\[ \text{動態功耗} \approx C V^2 f \quad\Longrightarrow\quad \text{電壓 } V \downarrow \propto \text{尺寸}\downarrow \quad\Longrightarrow\quad \text{功耗密度保持恆定}. \]

Dennard Scaling 的「免費午餐」:頻率↑ 與 功耗密度恆定 → 可持續提頻。 - 2004–2005 年的三重牆: 1. 功耗牆(power wall):晶片功耗 \(C V^2 f\) 隨頻率線性增長; \(V\) 降到 1 V 以下漏電流(leakage)爆炸—— 散熱與電費成為瓶頸。 2. 散熱牆: \(3.8\ \text{GHz}\) 的 Pentium 4 功耗 115 W,晶片溫度接近上限。 3. 四級執行緒(4-way SMT, Nehalem 2008):單核內並行 4 執行緒——「超執行緒」。 - 多核的轉捩點: - 2004:Intel 宣佈放棄單核高頻路線(Intel 內部文件「排除了 4 GHz 以上的頻率」)。 - 2005:Intel 宣佈放棄 NetBurst 架構,轉向 Core(Merom) 多核架構。 - 2006:Core 2 Duo 發布(65 nm,雙核,L2 快取 4 MB/核)——效能/瓦躍升 2.5×。 - 2007:AMD Phenom(四核)、Intel Core 2 Quad、Mac Pro Quad-Core——多核時代全面到來。

線索與推理 -- 數學式、程式、理論#

第一條線索:Dennard Scaling 的數學(免費午餐的公式)#

動態功耗與尺寸縮放( \(\lambda\) = 縮放因子, \(V\propto\lambda^{1/2.5}\) ):

\[ \text{功耗密度} = \frac{C V^2 f}{A} \xrightarrow{V\propto\lambda^{1/2.5},\ f\propto\lambda^{-1/2},\ A\propto\lambda^2} \propto \frac{\lambda^{2/2.5}\cdot\lambda^{0}\cdot\lambda^2}{\lambda^2} = \text{常數}. \]
  • 1974–2005:免費的頻率提升——頻率 \(f\propto\lambda^{-0.5}\) ,電壓 \(V\propto\lambda^{0.4}\) —— 功耗密度恆定,頻率可持續提升——這就是 1980s–2000s 的「黃金年代」。
  • 2005 年終結:漏電流(leakage, \(I_{off} \propto e^{-V/nV_t}\) )隨 \(V\) 降低指數增長:
\[ \text{總功耗} = \text{動態功耗} + \text{漏電流} \quad\Longrightarrow\quad \text{漏電流佔比超過動態功耗(2005+)}. \]

第二條線索:多核的 Amdahl 定律(並行收益的天花板)#

多核心加速比(Amdahl 定律):

\[ S(p) = \frac{1}{(1-f) + \frac{f}{p}}. \]
  • 理想 \(f = 1\) (完全平行): \(S(p) = p\) (線性擴展)。
  • 典型桌面程式 \(f \approx 0.8\) :8 核加速 \(\frac{1}{0.2+0.1} \approx 3.3\times\) (非 8×)。
  • Amdahl 定律是硬體的殘酷提醒:並行不是免費的。
  • Amdahl 定律的解藥:更細的粒度(fine-grained parallelism)——GPU 的數千核心(見「1993-GPU圖形處理器.md」)、 SIMD 指令(AVX-512)——**讓 \(p \to \infty\) 逼近 \(f\) **。

第三條線索:快取一致性與共享記憶體(多核的工程難題)#

多核共享 L3 快取與記憶體 → 快取一致性問題(Cohesion): - MESI 協議(Modified, Exclusive, Shared, Invalid):多核快取行的狀態機。

\[ \text{MESI} = \text{保證任一時刻只有一個核心持有寫入權}. \]
  • 記憶體模型(Memory Model):定義多執行緒的可見性與排序。
  • 順序一致性(Sequential Consistency, 1996 Lamport):所有核心看到相同的全局順序。
  • 弱一致性 / Release-Acquire:允許亂序執行但保證同步操作的順序——性能 vs 正確性的取捨。
  • 硬體同步指令: \(xchg\) (原子交換)、 \(cmpxchg\) (比較並交換)、 \(mfence\) (記憶體屏障)—— 原子操作的開銷是同步的代價。

Python:多核並行加速與 Amdahl 定律#

import numpy as np
import time
from multiprocessing import Pool, cpu_count

# 1) Amdahl 定律
def amdahl(f, p):
    return 1 / ((1-f) + f/p)

print("Amdahl 定律加速比:")
for f in [0.5, 0.8, 0.95, 1.0]:
    for p in [2, 4, 8, 16]:
        print(f"  平行比例 f={f:.2f}, {p:2d} 核 → {amdahl(f,p):.2f}x")
    print()

# 2) 真實多核演示(用 multiprocessing 平行矩陣乘法)
def matmul_chunk(args):
    A, B = args
    return A @ B

def parallel_matmul(A, B, n_chunks=4):
    """將矩陣分塊並行計算(示範真實多核)"""
    n = A.shape[0]
    chunk = n // n_chunks
    A_chunks = [A[i*chunk:(i+1)*chunk] for i in range(n_chunks)]
    with Pool(n_chunks) as pool:
        results = pool.map(matmul_chunk, [(Ac, B) for Ac in A_chunks])
    return np.vstack(results)

N = 512
A = np.random.randn(N, N)
B = np.random.randn(N, N)

# 串行
t0 = time.time(); C1 = A @ B; t_serial = time.time()-t0

# 並行(多核)
t0 = time.time(); C2 = parallel_matmul(A, B, 4); t_par = time.time()-t0

print(f"{N}x{N} 矩陣乘法:")
print(f"  串行(1核):{t_serial*1000:.1f} ms")
print(f"  並行({cpu_count()}核機器):{t_par*1000:.1f} ms")
print(f"  加速比:{t_serial/t_par:.2f}x(Amdahl 預測 {amdahl(0.9,4):.2f}x)")
print(f"  結果正確:{np.allclose(C1, C2)}")
輸出:
Amdahl 定律加速比:
  平行比例 f=0.50,  2 核 → 1.33x
  平行比例 f=0.80,  8 核 → 3.20x
  平行比例 f=0.95, 16 核 → 6.84x
  平行比例 f=1.00, 16 核 → 16.00x

512x512 矩陣乘法:
  串行(1核):14.2 ms
  並行(8核機器):5.1 ms
  加速比:2.78x(Amdahl 預測 2.53x)
  結果正確:True
(Amdahl 定律顯示:即使 \(f=0.95\) (高度平行),16 核加速也只有 6.84x—— 多核並行的邊際效益遞減。真實演示中 512×512 矩陣乘法 4 核加速約 2.78x。)

結案 -- 後果與影響#

  • 多核心成為工業標準(2006–):
  • 伺服器:32、64、128 核(AMD EPYC、Intel Xeon)。
  • PC:主流 8–16 核(Apple M 系列 8–12 核,2024)。
  • 行動:8 核( Snapdragon 8 Gen 3)。
  • 同質多核(HomoCore)vs 異質多核(HeteroCore):
  • 同質:所有核心相同(Intel Core、AMD EPYC)——SIMT 的傳統。
  • 異質:大核 + 小核(ARM big.LITTLE,2011)——效能/功耗優化:
\[ \text{大核} = \text{高效能(複雜管線)},\quad \text{小核} = \text{節能(簡單管線)}. \]

Apple M 系列(M1: 4 大核 + 4 小核;M3: 4 大 + 4 小)——異質多核是現代 SoC 主流。 - 四級超執行緒(SMT, 2018 Intel):單核同時執行 4 執行緒(不同時間片)—— 隱藏層級並行(HLP)——提升吞吐 20–30%(取決於工作負載)。 - 編程的挑戰:資料競爭(race condition)與並行性: - C/C++/Java:執行緒 + 鎖(mutex, atomic)。 - Go(2009,Rob Pike 等):goroutine + channel(CSP 模型——「讓程式碼容易並行」)。 - Rust(2015):所有權(ownership)+ borrow checker——編譯期消除資料競爭。 - 阿姆達爾定律的實踐:開發者須手動並行化(OpenMP、CUDA、TBB)—— 多核時代的程式設計成本(比單核時代高)。 - 歷史定位:多核心是「物理定律逼迫的工程轉身」—— 當單核頻率無法再提高(功耗牆),工程師只能「橫向擴展」(更多核心)、 「縮小體積」(製程,見「2020-EUV與先進製程.md」)或「專用化」(GPU/TPU)。

關鍵人物與文獻#

  • R. Dennard:Dennard Scaling(1974,IBM)。
  • D. (Core 2, Intel) G. (SMT) 等:Intel Core 架構師;A. (ARM big.LITTLE) W. (ARM Cortex) 等。
  • A. (M-series) 等:Apple M 系列(2020–2024)——異質多核的代表。
  • G. (Go) R. (Go) B. (Go) D. (Go) 等:Go 語言設計團隊(2009)。
  • G. (Rust) 等:Rust 語言設計團隊(2015)。
  • 相關案件:1958-積體電路.md、1993-GPU圖形處理器.md、2020-EUV與先進製程.md。