本書內容簡潔、直觀、實用,強調計算思維能力和并行編程技巧。本書主要分為四個部分:第 一部分介紹異構并行計算編程的基礎概念,包括數(shù)據并行化、GPU架構、CUDA編程及程序性能優(yōu)化方法等內容;第二部分介紹并行模式,包括卷積、模板、并行直方圖、歸約、前綴和、歸并等內容;第三部分介紹高級模式及應用,包括排序、稀疏矩陣計算、圖遍歷、深度學習、迭代式磁共振成像重建、靜電勢能圖和計算思維等內容;第四部分介紹高級編程實踐,包括異構計算集群編程、CUDA動態(tài)并行化等內容。本書不僅適合高等院校計算機相關專業(yè)的學生學習,也適合并行計算領域的技術人員參考。
第4版重要更新:·增加關于CUDA的新內容,包括較新的庫,如CUDNN!ば略鲫P于常用并行模式(模板、歸約、排序)的章節(jié),并對之前的章節(jié)(卷積、直方圖、稀疏矩陣、圖遍歷、深度學習)進行了全面更新!ば略鲆徽聦iT討論GPU架構,包含Ampere等新的架構示例!(yōu)化關于問題分解策略和性能方面的討論,增加新的優(yōu)化檢查清單。
前 言
Programming Massively Parallel Processors: A Hands-on Approach, Fourth Edition
我們非常自豪地向你介紹本書。
融合多核CPU和多線程GPU的大眾市場計算系統(tǒng)已經將萬億級別的計算能力引入筆記本電腦中,將億億級別的計算能力引入計算集群中。在如此強大的計算動能下,我們正處于科學、工程、醫(yī)學以及商業(yè)領域廣泛應用計算實驗的黎明。我們也親歷了GPU計算在金融、電子商務、石油與天然氣、制造等關鍵產業(yè)垂直市場的廣泛滲透。通過具有前所未有的規(guī)模、精確度、安全性、可控性與可視性的計算實驗,這些領域的突破將得以實現(xiàn)。本書為這一愿景提供了關鍵要素,即將并行編程教授給數(shù)百萬研究生和本科生,使得計算思維和并行編程技能能夠與微積分技能一樣廣泛普及。
本書的主要讀者是所有需要通過計算思維和并行編程技能來取得科學與工程學科上的突破的研究生和本科生。此外,本書還被業(yè)內專業(yè)開發(fā)人員廣泛使用,目標是在并行計算領域學習新的技能,與技術的飛速進步保持同步。這些專業(yè)開發(fā)人員涵蓋機器學習、網絡安全、自動駕駛、計算金融、數(shù)據分析、認知計算、機械工程、土木工程、電氣工程、生物工程、物理學、化學、天文學以及地理學等領域,他們運用計算推動著各自領域前沿技術的發(fā)展。因此,這些開發(fā)人員既需要是領域專家,同時也必須是編程專家。本書通過逐步建立對技術的直觀理解這一方式講授并行編程。我們假設讀者至少具備基本的C編程經驗。我們選用了CUDA C這一并行編程環(huán)境,該環(huán)境需要NVIDIA GPU的支持。在大眾消費者和專業(yè)人員手中已有超過10億臺這樣的處理器,而超過40萬名程序員在積極地運用CUDA進行開發(fā)。你在學習過程中開發(fā)出的應用程序,將有可能被非常龐大的用戶社群所使用。
自2016年第3版上市以來,我們收到了許多來自讀者和教師的寶貴意見。其中,很多人肯定了本書現(xiàn)有的非常重要的特點,其他人則提供了關于如何擴展本書內容以使其更具價值的建議。與此同時,自2016年以來,用于異構并行計算的硬件和軟件技術已經取得了巨大的進步。在硬件領域,GPU計算架構已經推出了三代新版本,分別是Volta、Turing和Ampere。在軟件領域,從CUDA 9到CUDA 11的發(fā)展使程序員得以訪問新的硬件和系統(tǒng)功能。同時,新的算法也得到了開發(fā)。為適應這些變化,我們新增了四章,并對大部分現(xiàn)有章節(jié)進行了重寫。
新增的四章包括一個基礎性章節(jié)(第4章),以及三個關于并行模式和應用的章節(jié)(第8章、第10章和第13章)。我們增加這些章節(jié)的初衷如下:
第4章:在之前的版本中,關于架構和調度方面的討論分布在多個章節(jié)中。在這一版中,我們將這些討論集中在一起,以便感興趣的讀者學習。
第8章:在之前的版本中,模板模式在關于卷積的章節(jié)中略有提及,因為這兩種模式有相似之處。在這一版中,第8章對模板模式進行了更為全面的介紹,強調其背后的數(shù)學原理,突出其與卷積不同的方面,從而為進一步的優(yōu)化提供了可能。這一章還提供了處理三維網格和數(shù)據的示例。
第10章:在之前的版本中,歸約模式在關于性能的章節(jié)中略有提及。在這一版中,第10章更為全面地呈現(xiàn)了歸約模式,采用漸進的方式應用優(yōu)化方法,并更深入地分析了相關的性能權衡。
第13章:在之前的版本中,歸并排序在關于歸并模式的章節(jié)中略有提及。在這一版中,第13章將基數(shù)排序作為一種極其適用于GPU并行化的非比較排序算法進行介紹。第13章采用漸進的方式進行優(yōu)化,并分析了性能權衡。此外,這一章還對歸并排序進行了探討。
除了新增的章節(jié)外,所有章節(jié)都經過了修訂,部分章節(jié)經過了大幅修改。這些章節(jié)包括:
第6章:之前在本章中的關于架構的內容已經移到第4章,歸約示例部分則移至第10章。對于刪改的部分,我們進行了重寫以更全面地處理線程粒度問題,更為重要的是,提供一份常見的性能優(yōu)化策略清單,并討論了每種策略所解決的性能瓶頸。這份清單在本書的其余部分中被用來優(yōu)化各種并行模式和應用程序的代碼。我們的目標是強調一種用于優(yōu)化并行程序性能的系統(tǒng)且漸進的方法。
第7章:在之前的版本中,關于卷積模式的章節(jié)以一維卷積作為示例,對二維卷積僅進行了簡要處理。在這一版中,我們對本章進行了重寫,從一開始就更加注重討論二維卷積。這一變化使我們能夠更全面地探討更高維度平鋪的復雜性和細節(jié),并為讀者學習卷積神經網絡(第16章)提供更好的背景。
第9章:在之前的版本中,關于直方圖模式的章節(jié)從一開始就應用了線程粗化優(yōu)化,并將私有化優(yōu)化與共享內存的使用相結合。在這一版中,我們對本章進行了重寫,采用更漸進的方式進行性能優(yōu)化,F(xiàn)在介紹的初始實現(xiàn)不再應用線程粗化,并將私有化和在私有bin中使用共享內存區(qū)分為兩種獨立的優(yōu)化方式,前者旨在減少原子操作的爭用,后者旨在減少訪問延遲。線程粗化在私有化后應用,因為粗化的一個主要優(yōu)點是減少提交到公共副本的私有副本數(shù)量。這種新的章節(jié)組織方式更加貼合本書始終遵循的系統(tǒng)化和漸進化的性能優(yōu)化方法。此外,由于原子操作被用于多塊歸約和單次掃描核函數(shù)中,因此為了更早地引入原
胡文美(Wen-mei W. Hwu)
NVIDIA公司杰出研究科學家兼高級研究總監(jiān)。伊利諾伊大學厄巴納-香檳分校榮休教授,并行計算研究中心首席科學家。他在編譯器設計、計算機體系結構、微體系結構和并行計算方面做出了卓越貢獻,是IEEE Fellow、ACM Fellow,榮獲了包括ACM-IEEE CS Eckert-Mauchly獎、ACM Grace Murray Hopper獎、ACM SIGARCH Maurice Wilkes獎在內的眾多獎項。他擁有加州大學伯克利分校計算機科學博士學位。
大衛(wèi)·B. 柯克(David B. Kirk)
美國國家工程院院士,NVIDIA Fellow,曾任NVIDIA公司首席科學家。2002年,他榮獲ACM SIGGRAPH計算機圖形學成就獎,以表彰其在把高性能計算機圖形系統(tǒng)推向大眾市場方面做出的杰出貢獻。他擁有加州理工學院計算機科學博士學位。
伊扎特·埃爾·哈吉(Izzat El Hajj)
貝魯特美國大學計算機科學系助理教授。他的研究方向是針對新興并行處理器和內存技術的應用加速和編程支持,特別是GPU和存算一體。他擁有伊利諾伊大學厄巴納-香檳分校電氣與計算機工程博士學位。
目 錄
Programming Massively Parallel Processors: A Hands-on Approach, Fourth Edition
譯者序
推薦序
前言
致謝
第1章 引言 1
1.1 異構并行計算 2
1.2 為什么需要速度與并行性 5
1.3 加快實際應用的速度 6
1.4 并行編程中的挑戰(zhàn) 7
1.5 相關的并行編程接口 8
1.6 本書的總體目標 9
1.7 本書的章節(jié)安排 10
參考文獻 12
第一部分 基本概念
第2章 異構數(shù)據并行計算 14
2.1 數(shù)據并行性 14
2.2 CUDA C程序結構 16
2.3 向量加法核 17
2.4 設備全局存儲和數(shù)據傳輸 19
2.5 核函數(shù)和線程 22
2.6 調用核函數(shù) 25
2.7 編譯 27
2.8 總結 27
2.8.1 函數(shù)聲明 27
2.8.2 內核調用和網格啟動 27
2.8.3 內置(預定義)變量 28
2.8.4 運行時應用程序編程接口 28
練習 28
參考文獻 30
第3章 多維網格和數(shù)據 31
3.1 多維網格組織 31
3.2 將線程映射到多維數(shù)據 33
3.3 圖像模糊:更復雜的內核 38
3.4 矩陣乘法 41
3.5 總結 44
練習 44
第4章 計算架構和調度 46
4.1 現(xiàn)代GPU架構 46
4.2 塊調度 47
4.3 同步和透明可擴展性 47
4.4 線程束和SIMD硬件 49
4.5 控制發(fā)散 53
4.6 線程束調度和延遲容忍 55
4.7 資源劃分和占用率 56
4.8 查詢設備屬性 58
4.9 總結 60
練習 60
參考文獻 61
第5章 內存架構和數(shù)據局部性 62
5.1 內存訪問效率的重要性 62
5.2 CUDA內存類型 64
5.3 利用平鋪減少內存流量 68
5.4 平鋪的矩陣乘法內核 70
5.5 邊界檢查 74
5.6 內存使用對占用率的影響 76
5.7 總結 78
練習 78
第6章 性能方面的考慮 81
6.1 內存合并 81
6.2 隱藏內存延遲 87
6.3 線程粗化 91
6.4 優(yōu)化清單 93
6.5 了解計算瓶頸 96
6.6 總結 96
練習 96
參考文獻 97
第二部分 并行模式
第7章 卷積:常量內存和緩存 100
7.1 背景 100
7.2 并行卷積:一種基本算法 103
7.3 常量內存和緩存:概念與實例 105
7.4 邊緣單元平鋪卷積 108
7.5 使用邊緣單元緩存的平鋪卷積 111
7.6 總結 113
練習 113
第8章 模板 115
8.1 背景 115
8.2 并行模板:基本算法 118
8.3 用于模板掃描的共享內存平鋪 119
8.4 線程粗化 121
8.5 寄存器平鋪 123
8.6 總結 125
練習 125
第9章 并行直方圖:原子操作和
私有化 126
9.1 背景 126
9.2 原子操作與基本直方圖內核 128
9.3 原子操作的延遲和吞吐量 131
9.4 私有化 132
9.5 粗化 134
9.6 聚合 137
9.7 總結 138
練習 138
參考文獻 139
第10章 歸約和最小化發(fā)散 140
10.1 背景 140
10.2 歸約樹 141
10.3 一個簡單的歸約內核 143
10.4 最小化控制發(fā)散 145
10.5 最小化內存發(fā)散 148
10.6 最小化全局內存訪問 149
10.7 對任意輸入長度進行分層歸約 150
10.8 利用線程粗化減少開銷 152
10.9 總結 154
練習 154
第11章 前綴和(掃描):并行算法的工作效率 156
11.1 背景 156
11.2 基于Kogge-Stone算法的并行
掃描 158
11.3 關于速度與工作效率的考慮 162
11.4 基于Brent-Kung算法的并行
掃描 163
11.5 利用粗化提高工作效率 167
11.6 任意長度輸入的分段并行掃描 168
11.7 利用單次掃描提高內存訪問
效率 171
11.8 總結 172
練習 173
參考文獻 173
第12章 歸并:動態(tài)輸入數(shù)據
識別 175
12.1 背景 175
12.2 串行歸并算法 176
12.3 并行化方法 177
12.4 共秩函數(shù)的實現(xiàn) 178
12.5 基本并行歸并內核 182
12.6 用于改進內存合并的平鋪歸并
內核 183
12.7 循環(huán)緩沖區(qū)歸并內核 187
12.8 用于歸并的線程粗化 192
12.9 總結 192
練習 193
參考文獻 193
第三部分 高級模式及應用
第13章 排序 196
13.1 背景 196
13.2 基數(shù)排序 197
13.3 并行基數(shù)排序 198
13.4 內存合并優(yōu)化 200
13.5 基值的選擇 202
13.6 利用線程粗化改善合并 204
13.7 并行歸并排序 205
13.8 其他并行排序方法 205
13.9 總結 206
練習 207
參考文獻 207
第14章 稀疏矩陣計算 208
14.1 背景 208
14.2 具有COO格式的簡單SpMV
內核 209
14.3 利用CSR格式分組非零行 211