本書第一篇系統(tǒng)地介紹GPU編程的相關(guān)知識,幫助讀者快速入門,并構(gòu)建GPU知識體系;第二篇和第三篇給出大量實例,對每個實例進(jìn)行循序漸進(jìn)的并行和優(yōu)化實踐,為讀者提供GPU編程和優(yōu)化參考;第四篇總結(jié)影響GPU性能的關(guān)鍵要素(執(zhí)行核心和存儲體系),量化測評GPU的核心性能參數(shù),給出CPU/GPU異構(gòu)系統(tǒng)上覆蓋完全的各種混合并行模式及其實踐,幫助讀者真正透徹理解GPU。
本書適合作為計算機(jī)及相關(guān)專業(yè)的教材,也可作為GPU程序開發(fā)人員和科研人員的參考書。本書封面貼有清華大學(xué)出版社防偽標(biāo)簽,無標(biāo)簽者不得銷售。
系統(tǒng)全面的GPU知識體系
實踐引導(dǎo)的有效優(yōu)化方法
切中要害的性能影響因素
通俗翔實的異構(gòu)協(xié)同并行
循序漸進(jìn)的優(yōu)化實例解析
精煉真實的GPU性能測評
方民權(quán),國防科學(xué)技術(shù)大學(xué)計算機(jī)科學(xué)與技術(shù)專業(yè)博士,研究方向是高性能計算、異構(gòu)計算,涉及領(lǐng)域包括遙感圖像處理、計算微電子學(xué)、聲吶信號處理和地震模擬等。張衛(wèi)民博士,研究員,博士生導(dǎo)師,任國防科學(xué)技術(shù)大學(xué)海洋科學(xué)與工程研究院總工程師、湖南省氣象協(xié)會副理事長、湖南省計算數(shù)學(xué)協(xié)會理事,研究方向是數(shù)值天氣預(yù)報、海洋環(huán)境數(shù)值模擬、衛(wèi)星資料、并行算法,科研成果獲部委級一等獎7項、二等獎8項、三等獎1項,出版著作5部,發(fā)表論文80余篇。
第一篇理論篇
第1章高性能計算概述3
1.1高性能計算概念辨析3
1.1.1并行計算、高性能計算和超級計算3
1.1.2超級計算機(jī)與超級計算中心4
1.2計算科學(xué)5
1.3高性能計算發(fā)展史5
1.4高性能計算簡介6
1.5向量機(jī)與陣列機(jī)8
1.6本章小結(jié)9
第2章GPU概述10
2.1GPU是什么10
2.2協(xié)處理器10
2.3GPU與顯卡的關(guān)系11
2.4GPU/顯卡購買注意事項11
2.5為什么要學(xué)GPU編程12
2.6GPU與CPU辨析13
2.7GPU發(fā)展簡史14
2.8GPU編程方法14
2.9CPU/GPU異構(gòu)系統(tǒng)16
第3章GPU硬件架構(gòu)17
3.1GPU架構(gòu)17
3.1.1Tesla架構(gòu)18
3.1.2Fermi架構(gòu)20
3.1.3Kepler架構(gòu)21
3.1.4Maxwell架構(gòu)23
3.1.5Pascal架構(gòu)243.2Kernel的硬件映射28
3.3GPU存儲體系29
3.4GPU計算能力30
GPU編程與優(yōu)化——大眾高性能計算目錄第4章GPU軟件體系33
4.1GPU軟件生態(tài)系統(tǒng)33
4.2CUDA Toolkit34
4.2.1NVCC編譯器34
4.2.2cuobjdump35
4.3CUDA環(huán)境安裝36
4.3.1Windows 7安裝CUDA 4.236
4.3.2Linux下安裝CUDA38
第5章CUDA C編程41
5.1CUDA編程模型41
5.2CUDA編程七步曲42
5.3驅(qū)動API與運行時API42
5.4CUDA運行時函數(shù)43
5.4.1設(shè)備管理函數(shù)43
5.4.2存儲管理函數(shù)45
5.4.3數(shù)據(jù)傳輸函數(shù)48
5.4.4線程管理函數(shù)51
5.4.5流管理函數(shù)52
5.4.6事件管理函數(shù)52
5.4.7紋理管理函數(shù)53
5.4.8執(zhí)行控制函數(shù)55
5.4.9錯誤處理函數(shù)55
5.4.10圖形學(xué)互操作函數(shù)57
5.4.11OpenGL互操作函數(shù)58
5.4.12Direct3D互操作函數(shù)59
5.5CUDA C語言擴(kuò)展60
5.6gridblockthread三維模型61
第二篇入門篇
第6章向量加法67
6.1向量加法及其串行代碼67
6.2單block單thread向量加68
6.3單block多thread向量加68
6.4多block多thread向量加69
6.5CUBLAS庫向量加法70
6.6實驗結(jié)果分析與結(jié)論71
6.6.1本書實驗平臺71
6.6.2實驗結(jié)果71
6.6.3結(jié)論71
6.7知識點總結(jié)72
6.8擴(kuò)展練習(xí)75
第7章歸約: 向量內(nèi)積76
7.1向量內(nèi)積及其串行代碼76
7.2單block分散歸約向量內(nèi)積77
7.3單block低線程歸約向量內(nèi)積78
7.4多block向量內(nèi)積(CPU二次歸約)79
7.5多block向量內(nèi)積(GPU二次歸約)81
7.6基于原子操作的多block向量內(nèi)積81
7.7計數(shù)法實現(xiàn)多block向量內(nèi)積84
7.8CUBLAS庫向量內(nèi)積85
7.9實驗結(jié)果與結(jié)論86
7.9.1實驗結(jié)果86
7.9.2結(jié)論86
7.10歸約的深入優(yōu)化探討87
7.10.1block數(shù)量和thread數(shù)量對歸約性能的影響87
7.10.2算術(shù)運算優(yōu)化88
7.10.3減少同步開銷89
7.10.4循環(huán)展開90
7.10.5總結(jié)91
7.11知識點總結(jié)91
7.12擴(kuò)展練習(xí)94
第8章矩陣乘法95
8.1矩陣乘法及其3種串行代碼95
8.1.1一般矩陣乘法95
8.1.2循環(huán)交換矩陣乘法97
8.1.3轉(zhuǎn)置矩陣乘法98
8.1.4實驗結(jié)果與最優(yōu)串行矩陣乘99
8.2grid線程循環(huán)矩陣乘法100
8.3block線程循環(huán)矩陣乘法101
8.4行共享存儲矩陣乘法101
8.5棋盤陣列矩陣乘法103
8.6判斷移除105
8.7CUBLAS矩陣乘法106
8.8實驗結(jié)果分析與結(jié)論108
8.8.1矩陣乘精度分析108
8.8.2實驗結(jié)果分析110
8.8.3浮點運算能力分析111
8.9行共享存儲矩陣乘法改進(jìn)111
8.10知識點總結(jié)113
8.11擴(kuò)展練習(xí)115
第9章矩陣轉(zhuǎn)置116
9.1矩陣轉(zhuǎn)置及其串行代碼116
9.21D矩陣轉(zhuǎn)置117
9.32D矩陣轉(zhuǎn)置118
9.4共享存儲2D矩陣轉(zhuǎn)置119
9.5共享存儲2D矩陣轉(zhuǎn)置diagonal優(yōu)化120
9.6實驗結(jié)果分析與結(jié)論121
9.7共享存儲2D矩陣轉(zhuǎn)置的深入優(yōu)化122
9.8知識點總結(jié)124
9.9擴(kuò)展練習(xí)125
第三篇提高篇
第10章卷積129
10.1卷積及其串行實現(xiàn)129
10.1.1一維卷積129
10.1.2二維卷積131
10.2GPU上1D卷積134
10.3M常量1D卷積135
10.4M共享1D卷積136
10.5N共享1D卷積137
10.6實驗結(jié)果分析139
10.6.1擴(kuò)展法1D卷積實驗結(jié)果分析139
10.6.2判斷法與擴(kuò)展法1D卷積對比140
10.6.3加速比分析141
10.6.4線程維度對性能的影響141
10.72D卷積的GPU移植與優(yōu)化142
10.7.1GPU上2D卷積142
10.7.2M常量2D卷積143
10.7.3M常量N共享2D卷積143
10.7.42D卷積實驗結(jié)果分析145
10.8知識點總結(jié)145
10.9擴(kuò)展練習(xí)147
第11章曼德博羅特集148
11.1曼德博羅特集及其串行實現(xiàn)148
11.2曼德博羅特集的GPU映射150
11.3一些優(yōu)化嘗試及效果152
11.3.1訪存連續(xù)152
11.3.2uchar4訪存合并153
11.3.34種零拷貝153
11.3.4總結(jié)分析155
11.4計算通信重疊優(yōu)化156
11.5突破kernel執(zhí)行時間限制159
11.6知識點總結(jié)160
11.7擴(kuò)展練習(xí)162
第12章掃描: 前綴求和163
12.1前綴求和及其串行代碼163
12.2KoggeStone并行前綴和164
12.2.1直接KoggeStone分段前綴和164
12.2.2交錯KoggeStone分段前綴和165
12.2.3完整KoggeStone前綴和166
12.3BrentKung并行前綴和168
12.3.1BrentKung分段前綴和169
12.3.2兩倍數(shù)據(jù)的BrentKung分段前綴和170
12.3.3避免bank conflict的兩倍數(shù)據(jù)BrentKung分段前綴和171
12.3.4完整BrentKung前綴和173
12.4warp分段的KoggeStone前綴求和174
12.5實驗結(jié)果分析與結(jié)論177
12.6知識點總結(jié)179
12.7擴(kuò)展練習(xí)180第13章排序181
13.1串行排序及其性能181
13.1.1選擇排序181
13.1.2冒泡排序182
13.1.3快速排序182
13.1.4基數(shù)排序183
13.1.5雙調(diào)排序網(wǎng)絡(luò)185
13.1.6合并排序186
13.1.7串行排序性能對比187
13.2基數(shù)排序188
13.2.1基數(shù)排序概述188
13.2.2單block基數(shù)排序189
13.2.3基于thrust庫的基數(shù)排序196
13.3雙調(diào)排序網(wǎng)絡(luò)197
13.3.1雙調(diào)排序網(wǎng)絡(luò)概述197
13.3.2單block雙調(diào)排序網(wǎng)絡(luò)199
13.3.3多block雙調(diào)排序網(wǎng)絡(luò)202
13.4快速排序206
13.5合并排序207
13.6實驗結(jié)果分析與結(jié)論208
13.7知識點總結(jié)209
13.8擴(kuò)展練習(xí)210
第14章幾種簡單圖像處理211
14.1圖像直方圖統(tǒng)計211
14.1.1串行直方圖統(tǒng)計211
14.1.2并行直方圖統(tǒng)計211
14.1.3實驗結(jié)果與分析212
14.2中值濾波213
14.2.1串行中值濾波214
14.2.21D并行中值濾波215
14.2.3共享1D中值濾波216
14.2.4雙重共享1D中值濾波218
14.2.52D并行中值濾波221
14.2.6共享2D中值濾波222
14.2.7共享2D中值濾波的改進(jìn)227
14.2.8實驗結(jié)果與分析229
14.3均值濾波231
14.3.1串行均值濾波231
14.3.2并行均值濾波232
14.3.3實驗結(jié)果與分析233
第四篇核心篇
第15章GPU執(zhí)行核心237
15.1概述237
15.2算術(shù)運算支持238
15.2.1整數(shù)運算238
15.2.2浮點運算239
15.3算術(shù)運算性能240
15.4分支處理242
15.5同步與測時246
15.5.1同步246
15.5.2測時247
15.6數(shù)學(xué)函數(shù)247
15.7warp與block原語249
15.7.1warp原語249
15.7.2block原語250
15.8kernel啟動、線程切換和循環(huán)處理251
第16章GPU存儲體系254
16.1概述254
16.2寄存器259
16.3局部存儲261
16.4共享存儲器264
16.4.1共享存儲使用264
16.4.2bank conflict265
16.4.3volatile關(guān)鍵字266
16.4.4共享存儲原子操作267
16.5常量存儲268
16.6全局存儲269
16.6.1全局存儲的使用269
16.6.2全局存儲的合并訪問271
16.6.3利用紋理緩存通道訪問全局存儲271
16.7紋理存儲273
16.7.1CUDA數(shù)組273
16.7.2紋理存儲的操作和限制274
16.7.3讀取模式、紋理坐標(biāo)、濾波模式和尋址模式276
16.7.4表面存儲278
16.8主機(jī)端內(nèi)存281
16.9零拷貝操作283
第17章GPU關(guān)鍵性能測評284
17.1GPU性能測評概述284
17.2GPU參數(shù)獲取286
17.2.1GPU選擇286
17.2.2詳細(xì)設(shè)備參數(shù)獲取287
17.3精確測時方法匯總288
17.3.1clock測時289
17.3.2gettimeofday測時289
17.3.3CUDA事件測時289
17.3.4cutil庫函數(shù)測時290
17.4GPU預(yù)熱與啟動開銷290
17.5GPU浮點運算能力291
17.6GPU訪存帶寬293
17.7GPU通信帶寬295
17.8NVIDIA Visual Profiler296
17.9程序性能對比約定298
第18章CPUs和GPUs協(xié)同299
18.1協(xié)同優(yōu)化基點299
18.1.1CPU并行矩陣乘基點299
18.1.2GPU并行矩陣乘基點300
18.2CPU/GPU協(xié)同300
18.3多GPU協(xié)同305
18.3.1CUDA版本306
18.3.2OpenMP+CUDA308
18.3.3MPI+CUDA311
18.4CPUs/GPUs協(xié)同314
18.4.1CUDA版本314
18.4.2OpenMP+CUDA319
18.4.3MPI+OpenMP+CUDA324
18.5本章小結(jié)329
附錄
附錄A判斷法1D卷積代碼333
附錄A.1判斷法1D卷積basic版333
附錄A.2判斷法1D卷積constant版334
附錄A.3判斷法1D卷積shared版336
附錄A.4判斷法1D卷積cache版337
附錄B曼德博羅特集的系列優(yōu)化代碼340
附錄B.1完整版串行C代碼340
附錄B.2cuda_1_0343
附錄B.3cuda_0_2345
附錄B.4cuda_zerocopy346
附錄B.5cuda_1_0_zerocopy348
附錄B.6cuda_0_0_zerocopy349
附錄B.7cuda_0_2_zerocopy351
附錄B.8cuda_2352
附錄B.9cuda_1_2354
附錄C幾種圖像處理完整源碼357
附錄C.1BMP圖像讀寫頭文件357
附錄C.2圖像直方圖串行代碼373
附錄C.3串行中值濾波代碼374
附錄C.4并行均值濾波相關(guān)代碼376
附錄Dnvprof幫助菜單383
附錄ENVCC幫助菜單388
附錄F幾種排序算法源代碼399
附錄F.1bitonic_sort_block函數(shù)399
附錄F.2GPU快速排序完整代碼400
附錄F.3GPU合并排序完整代碼408
參考文獻(xiàn)417