CUDA并行編程實戰(zhàn) [英]理查德·安索奇
定 價:139 元
- 作者:[英]理查德·安索奇
- 出版時間:2024/11/1
- ISBN:9787111764632
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書是一本深入淺出的CUDA編程實踐指南。由CUDA編程領域的資深專家撰寫,主要介紹使用C++對NVIDIA GPU進行編程,覆蓋了GPU內(nèi)核與硬件、并行思維與編程、warp和協(xié)作組、并行模板、紋理、蒙特卡羅應用等內(nèi)容,旨在幫助讀者快速掌握CUDA編程的核心技能。書中詳細介紹了CUDA的基本概念、架構和編程模型,并通過豐富的實戰(zhàn)案例和詳細解析,指導讀者如何編寫、優(yōu)化和調(diào)試CUDA程序。本書注重理論與實踐相結(jié)合,旨在培養(yǎng)讀者解決實際問題的能力。無論讀者是初學者還是有一定經(jīng)驗的開發(fā)者,都能從本書中獲益。掌握CUDA編程技能將為讀者的職業(yè)發(fā)展增添重要競爭力,助力讀者在科學研究、工程開發(fā)、數(shù)據(jù)分析等領域中脫穎而出。
CUDA是目前用于GPU編程的主流工具,而GPU是近幾十年來最令人振奮的硬件發(fā)展成果之一。通過CUDA,你可以用臺式計算機去完成原本需要大型計算機集群或高性能計算設施才能完成的工作。因此CUDA在整個科學、技術、工程和數(shù)學界的科學計算方面變得越來越重要,包括從醫(yī)學物理學到金融建模,再到大數(shù)據(jù)應用等領域。 本書匯集了作者長期開發(fā)和使用計算機來獲取和分析科學數(shù)據(jù)的豐富經(jīng)驗,內(nèi)容翔實。同時,本書也是一本具有創(chuàng)新性的著作,相較于其他同類GPU計算相關的圖書,本書提供了更為豐富的示例。作者非常注重緊湊、優(yōu)雅和高效的C++編碼風格,本書配套的示例代碼庫和支持材料都可以在線獲取,讀者可以基于這些去構建自己的項目。通過閱讀本書,你將能夠: 迅速掌握GPU與CUDA的基礎及編程模型。 學習并行編程及背后的思想。 掌握CUDA程序的調(diào)試與性能分析技巧。 了解如何將CUDA應用于實戰(zhàn)項目中。 提升解決并行計算問題的能力。
前 言
本書主要是為需要強大計算能力的人編寫的,包括那些需要這種能力對數(shù)據(jù)進行獲取、處理、分析或建模的科研人員。對于需要處理更大數(shù)據(jù)集與更復雜圖像數(shù)據(jù)的醫(yī)療數(shù)據(jù)人員,他們也會發(fā)現(xiàn)本書對其很有幫助。
在我的整個研究生涯中,我一直在面對復雜而苛刻的計算,首先是在高能物理學實驗中,最近是在醫(yī)學成像的各種應用中。GPU計算的出現(xiàn)是我所見過的最激動人心的發(fā)展之一,撰寫本書的一個原因就是要與讀者分享這種興奮。
這似乎是摩爾定律的必然結(jié)果——對計算能力的需求增長總是超過當前可用的水平。自20世紀80年代初期PC時代開啟以來,供應商一直在提供附加卡以提高渲染顯示的速度。這些卡現(xiàn)在被稱為圖形處理單元(Graphic Processing Unit, GPU),在PC游戲行業(yè)需求的推動下,它們已經(jīng)成為非常強大的計算引擎。2007年,NVIDIA推出的CUDA工具包徹底改變了游戲規(guī)則,該工具包可以用來編寫出利用GPU強大性能的科學應用軟件。我們的計算能力突然提高了100倍,不再遵循過去每18個月翻一倍的規(guī)律。從那時起,GPU性能也隨著時間的推移繼續(xù)呈指數(shù)級增長,超越了摩爾定律。因此,現(xiàn)在開始了解如何在GPU上進行編程,與在2007年一樣有用。事實上,你現(xiàn)在想在世界級超級計算機上進行高性能計算(HPC),就必須了解如何使用GPU。
大約在2002年之前,PC計算能力的指數(shù)級增長主要依賴于時鐘速度的提高。然而從那時候起,時鐘速度穩(wěn)定在3.5 GHz左右,但CPU芯片中的核心數(shù)量在穩(wěn)步增加。因此,并行編程(使用同時運行的多個協(xié)作核心來分擔單個任務的計算負載)對于從現(xiàn)代硬件中獲益至關重要。GPU將并行編程提升到一個新的水平,允許數(shù)千甚至數(shù)百萬個并行線程在計算中進行協(xié)作。
科學研究難度大并且競爭激烈,可用的計算能力往往是一個限制因素。將一個重要的計算加快200倍可能會改變游戲規(guī)則,將原本需要一周的運行時間縮短到1 h以內(nèi),那么一天之內(nèi)就可以進行結(jié)果分析。將需要1 h的運行時間縮短到18 s,這樣就可以探索復雜模型的參數(shù)空間。將幾s的運行時間縮短到幾ms,就可以對計算機模型進行交互式研究。本書對個人研究者和小團隊應該特別有用,他們可以為自己的內(nèi)部PC配備GPU,并獲得這些性能上的好處。即使是可以輕松訪問大型HPC設施的團隊,也可以從在他們自己的臺式機上使用非?焖俚墓ぞ邅硖剿髌浣Y(jié)果而受益。
當然,本書也適合任何有興趣深入了解GPU和并行編程的讀者。即使你已經(jīng)對該主題有所了解,我們相信你也可以從研究我們的編碼風格與選擇的示例中受益。
具體而言,本書主要介紹使用C++對NVIDIA GPU進行編程。自2007年以來,NVIDIA已成為HPC領域的主導力量,最近還成為AI領域的主導力量,這不僅由于GPU的成本效益,還由于CUDA語言使用類似于C++的優(yōu)雅特效。我知道一些科學編程仍然使用Fortran的各種版本(包括Fortran IV,這是我在20世紀80年代初期非常喜歡的一種語言), 但在我看來,C++更具表現(xiàn)力。Fortran的粉絲可能會指出使用指針優(yōu)化C++代碼存在技術問題,但這些問題隨著在C11中引入restrict關鍵字,已在C++11中得到解決,F(xiàn)代C++編譯器也支持這個關鍵字,并且在我們的許多示例中都使用它。
示例是本書區(qū)別于當前其他關于CUDA書籍的一個特點,我們的示例是從有趣的現(xiàn)實世界應用中精心制作的,包括物理和醫(yī)學成像,而不是在其他地方找到的相當基礎的常見問題。本書區(qū)別于其他書籍的另一個特點是,我們在編寫代碼的外觀方面是非常用心的,在適當?shù)牡胤绞褂矛F(xiàn)代的C++來減少冗余并保持簡潔,我認為這真的很重要。根據(jù)我的經(jīng)驗,許多人會通過修改其他人的代碼來學習計算機編程,盡管目前流通的大部分CUDA示例代碼都有效,但談不上優(yōu)雅。這可能是因為在2007年推出CUDA時,是作為C的擴展而不是C++,最初的SDK示例大多以冗長的C風格編寫。不幸的是,許多在線的CUDA教程和書籍中仍然是這種風格。事實上,CUDA一直支持一些C++,現(xiàn)在CUDA完全支持C++17(盡管有一些限制)。2019年11月,(NVIDIA C Programmers Guide)被更名為(NVIDIA C++ Programmers Guide),盡管指南的內(nèi)容沒有發(fā)生重大變化,但它標志著NVIDIA對代碼的態(tài)度改變了,自2020年以來,一些更高級的C++用法開始出現(xiàn)在SDK示例中。
本書的目標不是從零開始教授C++,我們假設你具有一些C++的基本知識。然而附錄I會討論我們示例中使用的一些C++特性,F(xiàn)代C++實際上有點龐大,具有許多支持面向?qū)ο蠛推渌呒壘幊田L格的新特性。在本書中不使用這些特性,因為我們認為它們不適合實現(xiàn)在GPU上運行的算法代碼,我們還是更喜歡模板函數(shù)而不是虛擬函數(shù)。
要充分利用本書,你需要使用配備支持CUDA的NVIDIA GPU的PC(許多PC都支持)。這些示例是在配備4核Intel CPU和NVIDIA RTX 2070 GPU(2019年價格為480英鎊)的Windows 10 PC上開發(fā)的。Linux系統(tǒng)也可以,我們所有的示例都可以在不需要修改的情況下運行。無論你使用什么系統(tǒng),都需要一個當前版本的(免費)NVIDIA CUDA Toolkit。在Windows上,你還需要Visual Studio C++(免費的社區(qū)版也可以)。在Linux上,gcc或g++都可以。
不幸的是,我們
理查德·安索奇(Richard Ansorge)是劍橋大學卡文迪什實驗室(Cavendish Laboratory)的榮譽大學高級講師,也是劍橋大學菲茨威廉學院(Fitzwilliam College)的榮譽導師和研究員。他發(fā)表了170多篇經(jīng)過同行評審的論文,并與他人合著了The Physics and Mathematics of MRI (2016)一書。
目 錄 Contents
譯者序
前言
第1章 GPU內(nèi)核與硬件介紹1
1.1?背景1
1.2?第一個CUDA示例2
1.3?CPU架構9
1.4?CPU的計算能力10
1.5?CPU內(nèi)存管理:利用緩存隱藏延遲11
1.6?CPU:并行指令集13
1.7?GPU架構13
1.7.1?回顧歷史13
1.7.2 NVIDIA的GPU型號14
1.8?Pascal架構14
1.9?GPU內(nèi)存類型16
1.10?warp和wave17
1.11?線程塊與網(wǎng)格18
1.12 占用率19
第1章尾注20
第2章 并行思維與編程21
2.1?Flynn分類法21
2.2 內(nèi)核函數(shù)調(diào)用語法28
2.3 啟動三維內(nèi)核函數(shù)29
2.4 延遲隱藏和占用率35
2.5 并行模式36
2.6 并行歸約37
2.7 共享內(nèi)存48
2.8 矩陣乘法51
2.9 分塊矩陣乘法58
2.10 BLAS62
第2章尾注66
第3章 warp和協(xié)作組68
3.1 協(xié)作組中的CUDA對象71
3.2 分塊分區(qū)75
3.3 向量加載81
3.4 warp級內(nèi)部函數(shù)和子warp84
3.5 線程分歧和同步85
3.6 避免死鎖87
3.7 協(xié)同組91
3.8 HPC特性97
第3章尾注98
第4章 并行模板100
4.1 二維模板100
4.2 二維模板的級聯(lián)計算112
4.3 三維模板116
4.4 數(shù)字圖像處理119
4.5 Sobel濾波器127
4.6 中值濾波器127
第4章尾注132
第5章 紋理133
5.1 圖像插值134
5.2 GPU紋理135
5.3 圖像旋轉(zhuǎn)137
5.4 lerp函數(shù)138
5.5 紋理硬件141
5.6 彩色圖像146
5.7 圖像查看148
5.8 立體圖像的仿射變換151
5.9 三維圖像配準156
5.10 圖像配準結(jié)果164
第5章尾注166
第6章 蒙特卡羅應用167
6.1 簡介167
6.2 cuRAND庫173
6.2.1 cuRAND的主機API173
6.2.2 cuRAND的設備API178
6.3 生成其他分布184
6.4 伊辛模型186
第6章尾注194
第7章 使用CUDA流和事件的
并發(fā)196
7.1 并發(fā)內(nèi)核函數(shù)執(zhí)行196
7.2 CUDA管道示例198
7.3 thrust與cudaDeviceReset202
7.4 管道示例的結(jié)果203
7.5 CUDA事件205
7.6 磁盤的開銷212
7.7 CUDA圖219
第7章尾注224
第8章 PET掃描儀的應用225
8.1 PET簡介225
8.2 數(shù)據(jù)存儲和掃描儀的幾何結(jié)構
的定義227
8.3 模擬PET掃描儀233
8.4 建立系統(tǒng)矩陣244
8.5 PET重建246
8.6 結(jié)果250
8.7 OSEM的實現(xiàn)252
8.8 交互作用的深度254
8.9 使用交互作用的深度的PET
結(jié)果257
8.10 塊探測器258
8.11 Richardson-Lucy圖像去模糊268
第8章尾注273
第9章 擴展276
9.1 GPU的選型278
9.2 CUDA統(tǒng)一虛擬尋址281
9.3 CUDA的P2P訪問282
9.4 CUDA零拷貝內(nèi)存284
9.5 統(tǒng)一內(nèi)存285
9.6 MPI的簡要介紹295
第9章尾注305
第10章 性能分析和調(diào)試工具306
10.1 gpulog示例306
10.2 使用nvprof進行分析311
10.3 用NVIDIA Visual Profiler進行
分析314
10.4 Nsight Systems316
10.5 Nsight Compute319
10.6 Nsight Compute部分320
10.6.1 GPU光速320
10.6.2 計算工作負載分析321
10.6.3 內(nèi)存工作負載分析322
10.6.4 調(diào)度器統(tǒng)計信息323
10.6.5 warp狀態(tài)統(tǒng)計323
10.6.6 指令統(tǒng)計信息324
10.6.7 啟動統(tǒng)計信息324
10.6.8 占用率326
10.6.9 源計數(shù)器327
10.7 使用printf進行調(diào)試328
10.8 通過Microsoft Visual Studio
進行調(diào)試330
10.9 調(diào)試內(nèi)核函數(shù)代碼332
10.10 內(nèi)存檢查334
10.10.1 cuda-memcheck334
10.10.2 Linux工具336
10.10.3 CUDA計算過濾器336
第10章尾注337
第11章 張量核心338
11.1 張量核心與FP16338
11.2 warp矩陣函數(shù)340
11.3 支持的數(shù)據(jù)類型345
11.4 張量核心的歸約算法346
11.5 結(jié)論351
第11章尾注351
附錄352
附錄A CUDA簡史352
附錄B 原子操作361
附錄C NVCC編譯器366
附錄D AVX與Intel編譯器372
附錄E 數(shù)字格式380
附錄F CUDA文檔和庫384
附錄G CX頭文件387
附錄H AI和Python410
附錄I C++的主題413