異質平行運算與對運算速度的需求 練習題 (Practice - Heterogeneous Parallel Computing and the Demand for Speed)
Related Concepts
- 01-Introduction/01-Heterogeneous-Parallel-Computing-and-the-Demand-for-Speed
- 01-Introduction/02-Speedup-Challenges-and-Related-Interfaces
- 01-Introduction/03-Overarching-Goals-and-Book-Organization
| 關鍵字 / 情境 | 答案重點 |
|---|---|
| CPU 為何延遲低? | latency-oriented:大 last-level cache + branch prediction + 少而大 ALU |
| GPU 為何峰值吞吐高? | throughput-oriented:大量小 ALU + 多 memory channel + 小 cache,大量 thread 隱藏延遲 |
| Multicore vs Many-thread (2003 起) | multicore = 維持序列速度(少而強核);many-thread = 最大化吞吐(多而簡單核) |
| 「延遲減半」vs「吞吐加倍」哪個貴? | 延遲減半:2× 電流 → >2× 面積、4× 功耗;吞吐加倍只要 2× 面積/功耗 |
| Memory bandwidth GPU/CPU 比值 | 約 ~10×(遊戲 relaxed memory model 助力) |
| CUDA 推出年份 / 解決什麼 | 2007;擺脫 graphics API(GPGPU),支援 CPU-GPU 聯合執行 |
| Speedup 公式 | Speedup_{A/B} = T_B / T_A |
| Amdahl's Law | 1/((1-p) + p/s);s→∞ 時上限 = 1/(1-p) |
| p=30% 上限 / p=99% (s=100) | 1.43× / ~50× |
| 為何只拿 ~10× 加速? | 飽和 DRAM bandwidth → 用 on-chip memory 減少 DRAM 存取 |
| 四大挑戰 | work efficiency、memory- vs compute-bound、input 特性、synchronization |
| 相關介面 | OpenMP(shared mem)、MPI(cluster)、OpenCL(跨廠商,似 CUDA) |
| 三大整體目標 | high performance、correctness & reliability、future scalability |
Question 1 - CPU 與 GPU 的設計哲學 [recall]
情境/題目:為什麼 GPU 與 CPU 在峰值 floating-point throughput 上有如此巨大的差距?分別描述兩者的設計哲學與晶片資源分配。
CPU 是 latency-oriented:用大 last-level cache、複雜 branch prediction / execution control、少而大的低延遲 ALU,來降低單一 thread 的延遲。GPU 是 throughput-oriented:用大量小 ALU + 大量 memory channel + 小 cache,靠大量 threads 隱藏長 latency,最大化整體吞吐。差距來自這兩種根本不同的設計取捨 (Fig. 1.1)。
Question 2 - Multicore vs Many-thread 路線 [recall]
情境/題目:自 2003 年起(因 clock frequency 受能耗與散熱限制),半導體業分成哪兩條設計路線?各自的訴求與代表處理器為何?
Multicore trajectory:維持序列程式的執行速度,用少而強的 out-of-order、multiple-issue、hyperthreading 核心(例:Intel 24-core server、ARM Ampere 128-core)。Many-thread trajectory:最大化平行應用的吞吐量,用大量簡單的 in-order pipeline(例:NVIDIA A100,數萬個 threads)。自 2003 年起 many-thread GPU 在 FP 效能上持續領先。
Question 3 - CUDA 的誕生與 GPGPU 的限制 [recall]
情境/題目:CUDA 在哪一年由誰推出?它解決了先前 GPGPU 程式設計的什麼根本限制?
NVIDIA 於 2007 年推出 CUDA。GPGPU 時代運算必須透過 graphics API (OpenGL / Direct3D) 偽裝成「畫 pixel」的函式,應用種類受限、未普及。CUDA 不只是軟體改變 — NVIDIA 投入晶片面積 (silicon) 提供通用平行程式介面,程式不再經過 graphics interface,可直接用 C/C++ 並支援 CPU-GPU 聯合執行。
Question 4 - 平行程式設計的四大挑戰 [recall]
情境/題目:本章指出要在平行程式中達到高效能會遇到哪四大挑戰?
(1) Work efficiency — 有些平行演算法比 sequential 做更多 work,大輸入時反而更慢(recurrence 問題常需冗餘計算);(2) Memory-bound vs compute-bound — 執行受 memory 頻寬/延遲或受每 byte 指令數限制;(3) Input 資料特性 — 大小不規則、分布不均造成各 thread 工作量不均 (load imbalance);(4) Synchronization — barrier / atomic operations 造成 thread 互等的 overhead。
Question 5 - 相關平行程式介面 [recall]
情境/題目:比較 OpenMP、MPI、OpenCL 三種平行程式介面的目標系統與運作機制。
OpenMP:shared-memory 多處理器;用 directives(命令)與 pragmas(提示)標註 loop,compiler + runtime 自動產生平行碼(強調 performance portability)。MPI:不共享記憶體的 cluster(可達 >100,000 nodes);一切靠 explicit message passing,需手動 domain decomposition + MPI_Send/MPI_Recv。OpenCL:2009 年跨廠商標準,更依賴 API、較少語言擴充,概念與 CUDA 高度相似。
Question 6 - 本書的三大整體目標 [recall]
情境/題目:PMPP 提出的三大整體目標 (overarching goals) 是什麼?達成 future scalability 的關鍵手段為何?
① High performance(教你寫高效能平行程式,需直覺式硬體理解才能推理效能);② Correctness & reliability(用簡單的 barrier synchronization、memory consistency、atomicity,使程式可除錯、可維護);③ Future scalability(讓更平行的未來硬體自動跑更快)。Future scalability 的關鍵是 regularize 與 localize 記憶體存取,降低 critical resource 消耗與更新資料結構的衝突 — 與高效能技術其實是同一套。
Question 7 - Amdahl's Law(p = 30%) [application]
情境/題目:某應用 30% 的執行時間可被平行化。若把這部分加速到「無限大」,整體最多能得到多少倍加速?縮短多少執行時間?
Amdahl 上限 = 1/(1-p) = 1/(1-0.30) = 1/0.70 ≈ 1.43×,最多只能縮短 30% 的執行時間。即使 parallel 部分加速 100×,整體也只有 1/(0.7 + 0.30/100) = 1/0.703 ≈ 1.42×。原因:serial 的 70% 完全沒變,卡死整體加速。
Question 8 - Speedup 定義與 Amdahl's Law(p = 99%) [application]
情境/題目:某應用在 system B 執行 200 秒、在 system A 執行 10 秒,A 對 B 的 speedup 是多少?另外,若 99% 可平行且該部分加速 100×,整體加速約多少?
Speedup = T_B / T_A = 200 / 10 = 20×。當 p=99%、s=100:1/((1-0.99) + 0.99/100) = 1/(0.01 + 0.0099) ≈ 50×。對比 Q7 的 p=30%,凸顯 Amdahl 的啟示:必須讓絕大多數(實務上 >99.9%)執行時間落在 parallel 部分,massively parallel processor 才能真正發揮。
Question 9 - 降低延遲 vs 提高吞吐的成本取捨 [analysis]
情境/題目:從晶片面積與功耗的角度,比較「把算術吞吐量加倍」與「把算術延遲減半」兩種做法的成本,並說明這如何決定 GPU 的設計取捨。
吞吐加倍:把 ALU 數量加倍 → 約 2× 面積、2× 功耗(線性)。延遲減半:需把電流加倍 → >2× 面積、4× 功耗(超線性,昂貴得多)。因為降低延遲遠比提高吞吐昂貴,GPU 選擇為大量 threads 的吞吐量做優化、容忍長 latency,把省下的面積與功耗用來放更多小 ALU 與 memory channel;CPU 則反向地花資源在低延遲。這正是兩種設計哲學分歧的量化根源。
Question 10 - 為何只有 ~10× 加速:memory-bound vs compute-bound [analysis]
情境/題目:為什麼「直接 (straightforward) 平行化」一個應用往往只拿到約 10× 加速?要再突破需要做什麼?並比較 memory-bound 與 compute-bound 的差異。
直接平行化常飽和 DRAM memory bandwidth,使應用成為 memory-bound → 通常只剩 ~10×。突破方法:做資料搬移的 transformation,改用 GPU 的 on-chip memory(shared memory / cache)大幅減少對 DRAM 的存取次數,但 on-chip 容量有限需進一步優化(如 tiling)。Memory-bound 受 memory 頻寬/延遲限制(瓶頸是搬多少 bytes);compute-bound 受每 byte 資料所做的指令數限制(arithmetic intensity, OP/B)。提高 arithmetic intensity 是把 memory-bound 推向 compute-bound 的關鍵。
| 主題 | 核心結論 |
|---|---|
| CPU vs GPU 設計 | CPU = latency-oriented(大 cache/control,少大 ALU);GPU = throughput-oriented(多小 ALU + 多 channel,大量 thread 隱藏延遲) |
| 兩條路線 (2003) | multicore = 維持序列速度;many-thread = 最大化平行吞吐 |
| 成本取捨 | 延遲減半(>2× 面積、4× 功耗)比吞吐加倍(2× 面積/功耗)貴 → GPU 偏吞吐 |
| Memory bandwidth | GPU 約為同期 CPU 的 ~10×;直接平行化易飽和 DRAM → 只剩 ~10× 加速 |
| CUDA | 2007 推出,投入 silicon 擺脫 graphics API,支援 CPU-GPU 聯合執行 |
| Speedup / Amdahl | T_B/T_A;1/((1-p)+p/s);p=30%→1.43×、p=99%→50× |
| 四大挑戰 | work efficiency、memory/compute-bound、input 特性、synchronization |
| 相關介面 | OpenMP(directive/pragma)、MPI(message passing)、OpenCL(跨廠商,似 CUDA) |
| 三大目標 | high performance、correctness & reliability、future scalability(regularize + localize) |