本書的整體目標與組織架構 (Goals & Book Organization)
重點總覽 (Overview)
本筆記涵蓋 PMPP 的三大整體目標 (overarching goals)、貫穿全書的計算思維 (computational thinking),以及全書四個部分 (Part I–IV)、Chapters 2–23 的組織架構與學習路徑。
| 項目 | 內容 | 對應章節 |
|---|---|---|
| 目標 1:high performance | 教你寫出高效能平行程式;需對硬體有概念性理解 | Ch.4 (架構)、Ch.5–6 (記憶體/效能) |
| 目標 2:correctness & reliability | 用簡單的 barrier sync / memory consistency / atomicity 達成可除錯、可維護 | 工具與 data parallelism |
| 目標 3:future scalability | 讓程式在更平行的未來硬體上自動跑更快 | 關鍵 = regularize + localize 記憶體存取 |
| 核心方法 | computational thinking — 用適合 HPC 的方式重構問題 | Ch.19 深入探討 |
| Part I (Ch.2–6) | 基礎:data parallelism、CUDA C、GPU 架構、效能優化 | 必修地基 |
| Part II (Ch.7–12) | primitive parallel patterns | convolution…merge |
| Part III (Ch.13–19) | 進階 patterns + 應用 | sorting…computational thinking |
| Part IV (Ch.20–22) | advanced practices(專家級) | cluster / dynamic / future |
三大目標並非獨立:用來達成 high performance 的技術(regularize、localize memory access)同時也是 future scalability 的關鍵;而專注 data parallelism 則能同時換取 high performance 與 high reliability。
三大整體目標 (Three Overarching Goals)
| 目標 | 主張 | 達成手段 | 警示 / 例外 |
|---|---|---|---|
| ① High performance | 主要目標:教你把 massively parallel processor 寫到快 | 不需深厚硬體專業,但需直覺式架構理解才能推理效能 | 完全不懂硬體的「全自動工具」可能還要很多年;懂硬體的人用工具更有效 |
| ② Correctness & reliability | 初次跑得快不夠,要能除錯、支援使用者 | CUDA 鼓勵簡單的 barrier synchronization、memory consistency、atomicity;並提供功能與效能瓶頸雙重除錯工具 | reliability 在平行運算中是「subtle issue」,易被忽略 |
| ③ Future scalability | 未來機器更平行 → 同一份程式應自動更快 | 關鍵:regularize + localize 記憶體存取,降低 critical resource 消耗與更新資料結構的衝突 | 同樣的高效能技術 = 可擴展性技術,兩者不可分 |
為了目標 ①,本書特地以 Chapter 4 (Compute Architecture and Scheduling) 專章建立 GPU 架構的直覺;其餘架構概念則在「需要時」隨高效能技術一併引入,而非孤立教學。
計算思維 (Computational Thinking)
- 定義:formulating and solving computational problems in ways amenable to high-performance execution(以利於平行高效執行的方式來重構與求解問題)。
- 本書不「為原則而教原則」,而是在平行化實用應用 (useful applications) 的脈絡中傳授 principles & patterns。
- 完整、系統化的討論留到 19-Parallel-Programming-And-Computational-Thinking/04-Computational-Thinking-and-Parallelization-Approaches。
全書四個部分 (Four-Part Organization)
Programming Massively Parallel Processors (PMPP)
│
┌───────────────┬──────────────┴───────────────┬──────────────────┐
▼ ▼ ▼ ▼
PART I PART II PART III PART IV
基礎概念 primitive patterns 進階 patterns advanced
(Ch.2–6) (Ch.7–12) + 應用 (Ch.13–19) practices
(Ch.20–22)
│ │ │ │
學會當 套用 Part I 知識, 把所有材料 邁向
GPU 程式員 邊用邊引入新架構特性 整合到真實應用 專家
┌──────────────────────────────────────┐
│ Ch.23 Conclusion & Outlook (目標回顧) │
└──────────────────────────────────────┘
Part I 打地基;Part II/III 「用中學」——只在 pattern 需要某硬體特性或優化技術時才引入它。Part III 相較 Part II 更著重**「先列出多種平行化方案 → 比較優缺 → 程式碼轉換」**的應用導向流程。
Part I — 基礎概念 (Fundamental Concepts, Ch.2–6)
| 章 | 主題 | 引入的關鍵概念 |
|---|---|---|
| Ch.2 Heterogeneous Data Parallel Computing | data parallelism + CUDA C(以 vector addition 貫穿) | 平行化六步驟(見下) |
| Ch.3 Multidimensional Grids and Data | 多維 thread/data 組織與執行模型 | grid/block、resource & data binding |
| Ch.4 Compute Architecture and Scheduling | GPU 核心組織、thread 排程 | transparent scalability、SIMD & control divergence、multithreading & latency tolerance、occupancy |
| Ch.5 Memory Architecture and Data Locality | GPU 記憶體階層、特殊記憶體 | CUDA 變數記憶體類型、data locality |
| Ch.6 Performance Considerations | thread 執行與記憶體存取的理想模式 | optimization checklist(後兩部分反覆使用) |
Ch.2 的 CUDA 平行化六步驟(以 vector addition 示範):
// (1) 找出可平行化的部分;(2) 隔離資料 + 在 device 配置記憶體
cudaMalloc((void**)&d_A, size); // device global memory
cudaMalloc((void**)&d_B, size);
cudaMalloc((void**)&d_C, size);
// (3) 把資料傳到 device
cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);
// (4) 把平行部分寫成 kernel function
// __global__ void vecAddKernel(float* A, float* B, float* C, int n){ ... }
// (5) 啟動 kernel 交由平行 threads 執行
vecAddKernel<<<ceil(n/256.0), 256>>>(d_A, d_B, d_C, n);
// (6) 把結果傳回 host
cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);
Part I 刻意使用顯式 (explicit) 的 cudaMemcpy 來傳資料,目的是讓讀者理解「底層發生什麼」。unified virtual memory / zero-copy memory 等可自動共享 CPU/GPU 資料的特性,要到 Ch.22 才引入——不要在初學階段就跳過顯式傳輸。
Part II — Primitive Parallel Patterns (Ch.7–12)
| 章 | Pattern | 順帶引入的技術 |
|---|---|---|
| Ch.7 Convolution | 訊號/視覺常見 pattern,重 data access locality | constant memory、caching |
| Ch.8 Stencil | 解微分方程,類似 convolution 但有額外優化空間 | 3D thread/data 組織、thread granularity (coarsening) |
| Ch.9 Parallel Histogram | 統計分析、模式辨識 | atomic operations、privatization |
| Ch.10 Reduction (and Minimizing Divergence) | reduction tree 彙總資料 | control divergence 的影響與緩解 |
| Ch.11 Prefix Sum (Scan) | 把本質序列的計算轉成平行 | work efficiency 概念 |
| Ch.12 Merge | divide-and-conquer 分工 | dynamic input data identification |
Part III — 進階 Patterns 與應用 (Advanced Patterns & Applications, Ch.13–19)
| 章 | 主題 | 借用 / 引入 |
|---|---|---|
| Ch.13 Sorting | radix sort + merge sort | 借用 prefix sum、parallel merge |
| Ch.14 Sparse Matrix Computation | 大型資料集 | 資料重排:compression、padding、sorting、transposition、regularization |
| Ch.15 Graph Traversal | 圖搜尋;圖結構影響演算法選擇 | 借用 histogram、merge |
| Ch.16 Deep Learning | CNN 高效實作 | 借用 tiling、convolution pattern |
| Ch.17 Iterative MRI Reconstruction | 非笛卡爾 MRI 重建 | loop fusion、scatter-to-gather 轉換 |
| Ch.18 Electrostatic Potential Map | 分子視覺化/分析,不規則資料 | 借用 sparse matrix 的經驗 |
| Ch.19 Parallel Programming & Computational Thinking | 計算思維、平行演算法結構 | 高層 case study,跨多種程式模型 |
Part IV — Advanced Practices (Ch.20–22) 與結語
| 章 | 主題 | 重點特性 |
|---|---|---|
| Ch.20 Heterogeneous Computing Cluster | 每節點含 CPU+GPU 的叢集 | MPI + CUDA 協同、通訊議題 |
| Ch.21 CUDA Dynamic Parallelism | GPU 自行依資料/結構產生工作 | 不必每次都等 CPU 派工 |
| Ch.22 Advanced Practices & Future Evolution | 雜項進階特性 | zero-copy memory、unified virtual memory、多 kernel 同時執行、debugging、profiling、double-precision… |
| Ch.23 Conclusion & Outlook | 回顧目標、總結章節如何拼合 | 預測 massively parallel computing 為未來十年最精彩領域之一 |
全書以 CUDA 為唯一範例載體,但目的是建立通用平行程式設計的地基:先在具體模型中學透,再把知識遷移到 OpenMP / OpenCL / MPI 等(見 01-Introduction/02-Speedup-Challenges-and-Related-Interfaces)。
考試/面試重點 (Exam / Test Patterns)
| 情境 / 關鍵字 | 答案 / 技巧 |
|---|---|
| 「本書的三大目標?」 | ① high performance ② correctness/reliability ③ future scalability |
| 「達成 future scalability 的關鍵?」 | regularize 與 localize 記憶體存取,降低 critical resource 消耗與更新衝突(= 高效能技術) |
| 「為何高效能技術 = 可擴展性技術?」 | 兩者都靠規律化、局部化記憶體存取;最佳化既加速也讓未來更平行硬體自動受益 |
| 「computational thinking 是什麼?」 | 以適合 HPC 的方式重構與求解問題;Ch.19 深入 |
| 「CUDA 怎麼兼顧 correctness?」 | 提供簡單的 barrier synchronization、memory consistency、atomicity + 功能/效能除錯工具;聚焦 data parallelism |
| 「四個部分各是什麼?」 | I 基礎(2–6)、II primitive patterns(7–12)、III 進階+應用(13–19)、IV advanced practices(20–22) |
| 「CUDA 平行化六步驟?」 | identify → isolate+cudaMalloc → cudaMemcpy H2D → 寫 kernel → 啟動 kernel → cudaMemcpy D2H |
| 「哪章講 GPU 架構地基?」 | Ch.4(transparent scalability、SIMD/control divergence、latency tolerance、occupancy) |
| 「unified/zero-copy memory 在哪章?」 | Ch.22;Part I 刻意用顯式 cudaMemcpy 讓讀者懂底層 |
| 「需要硬體專業才能寫高效能?」 | 否,但需概念性/直覺式架構理解才能推理效能 |
Related Notes
- 01-Introduction/01-Heterogeneous-Parallel-Computing-and-the-Demand-for-Speed
- 01-Introduction/02-Speedup-Challenges-and-Related-Interfaces
- 04-Compute-Architecture-And-Scheduling/01-GPU-Architecture-and-Block-Scheduling
- 19-Parallel-Programming-And-Computational-Thinking/04-Computational-Thinking-and-Parallelization-Approaches
- 23-Conclusion-And-Outlook/01-Goals-Revisited
- 23-Conclusion-And-Outlook/02-Future-Outlook