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