CUDA并行編程實(shí)戰(zhàn) [英]理查德·安索奇
定 價(jià):139 元
- 作者:[英]理查德·安索奇
- 出版時(shí)間:2024/11/1
- ISBN:9787111764632
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書是一本深入淺出的CUDA編程實(shí)踐指南。由CUDA編程領(lǐng)域的資深專家撰寫,主要介紹使用C++對NVIDIA GPU進(jìn)行編程,覆蓋了GPU內(nèi)核與硬件、并行思維與編程、warp和協(xié)作組、并行模板、紋理、蒙特卡羅應(yīng)用等內(nèi)容,旨在幫助讀者快速掌握CUDA編程的核心技能。書中詳細(xì)介紹了CUDA的基本概念、架構(gòu)和編程模型,并通過豐富的實(shí)戰(zhàn)案例和詳細(xì)解析,指導(dǎo)讀者如何編寫、優(yōu)化和調(diào)試CUDA程序。本書注重理論與實(shí)踐相結(jié)合,旨在培養(yǎng)讀者解決實(shí)際問題的能力。無論讀者是初學(xué)者還是有一定經(jīng)驗(yàn)的開發(fā)者,都能從本書中獲益。掌握CUDA編程技能將為讀者的職業(yè)發(fā)展增添重要競爭力,助力讀者在科學(xué)研究、工程開發(fā)、數(shù)據(jù)分析等領(lǐng)域中脫穎而出。
CUDA是目前用于GPU編程的主流工具,而GPU是近幾十年來最令人振奮的硬件發(fā)展成果之一。通過CUDA,你可以用臺(tái)式計(jì)算機(jī)去完成原本需要大型計(jì)算機(jī)集群或高性能計(jì)算設(shè)施才能完成的工作。因此CUDA在整個(gè)科學(xué)、技術(shù)、工程和數(shù)學(xué)界的科學(xué)計(jì)算方面變得越來越重要,包括從醫(yī)學(xué)物理學(xué)到金融建模,再到大數(shù)據(jù)應(yīng)用等領(lǐng)域。 本書匯集了作者長期開發(fā)和使用計(jì)算機(jī)來獲取和分析科學(xué)數(shù)據(jù)的豐富經(jīng)驗(yàn),內(nèi)容翔實(shí)。同時(shí),本書也是一本具有創(chuàng)新性的著作,相較于其他同類GPU計(jì)算相關(guān)的圖書,本書提供了更為豐富的示例。作者非常注重緊湊、優(yōu)雅和高效的C++編碼風(fēng)格,本書配套的示例代碼庫和支持材料都可以在線獲取,讀者可以基于這些去構(gòu)建自己的項(xiàng)目。通過閱讀本書,你將能夠: 迅速掌握GPU與CUDA的基礎(chǔ)及編程模型。 學(xué)習(xí)并行編程及背后的思想。 掌握CUDA程序的調(diào)試與性能分析技巧。 了解如何將CUDA應(yīng)用于實(shí)戰(zhàn)項(xiàng)目中。 提升解決并行計(jì)算問題的能力。
前 言
本書主要是為需要強(qiáng)大計(jì)算能力的人編寫的,包括那些需要這種能力對數(shù)據(jù)進(jìn)行獲取、處理、分析或建模的科研人員。對于需要處理更大數(shù)據(jù)集與更復(fù)雜圖像數(shù)據(jù)的醫(yī)療數(shù)據(jù)人員,他們也會(huì)發(fā)現(xiàn)本書對其很有幫助。
在我的整個(gè)研究生涯中,我一直在面對復(fù)雜而苛刻的計(jì)算,首先是在高能物理學(xué)實(shí)驗(yàn)中,最近是在醫(yī)學(xué)成像的各種應(yīng)用中。GPU計(jì)算的出現(xiàn)是我所見過的最激動(dòng)人心的發(fā)展之一,撰寫本書的一個(gè)原因就是要與讀者分享這種興奮。
這似乎是摩爾定律的必然結(jié)果——對計(jì)算能力的需求增長總是超過當(dāng)前可用的水平。自20世紀(jì)80年代初期PC時(shí)代開啟以來,供應(yīng)商一直在提供附加卡以提高渲染顯示的速度。這些卡現(xiàn)在被稱為圖形處理單元(Graphic Processing Unit, GPU),在PC游戲行業(yè)需求的推動(dòng)下,它們已經(jīng)成為非常強(qiáng)大的計(jì)算引擎。2007年,NVIDIA推出的CUDA工具包徹底改變了游戲規(guī)則,該工具包可以用來編寫出利用GPU強(qiáng)大性能的科學(xué)應(yīng)用軟件。我們的計(jì)算能力突然提高了100倍,不再遵循過去每18個(gè)月翻一倍的規(guī)律。從那時(shí)起,GPU性能也隨著時(shí)間的推移繼續(xù)呈指數(shù)級增長,超越了摩爾定律。因此,現(xiàn)在開始了解如何在GPU上進(jìn)行編程,與在2007年一樣有用。事實(shí)上,你現(xiàn)在想在世界級超級計(jì)算機(jī)上進(jìn)行高性能計(jì)算(HPC),就必須了解如何使用GPU。
大約在2002年之前,PC計(jì)算能力的指數(shù)級增長主要依賴于時(shí)鐘速度的提高。然而從那時(shí)候起,時(shí)鐘速度穩(wěn)定在3.5 GHz左右,但CPU芯片中的核心數(shù)量在穩(wěn)步增加。因此,并行編程(使用同時(shí)運(yùn)行的多個(gè)協(xié)作核心來分擔(dān)單個(gè)任務(wù)的計(jì)算負(fù)載)對于從現(xiàn)代硬件中獲益至關(guān)重要。GPU將并行編程提升到一個(gè)新的水平,允許數(shù)千甚至數(shù)百萬個(gè)并行線程在計(jì)算中進(jìn)行協(xié)作。
科學(xué)研究難度大并且競爭激烈,可用的計(jì)算能力往往是一個(gè)限制因素。將一個(gè)重要的計(jì)算加快200倍可能會(huì)改變游戲規(guī)則,將原本需要一周的運(yùn)行時(shí)間縮短到1 h以內(nèi),那么一天之內(nèi)就可以進(jìn)行結(jié)果分析。將需要1 h的運(yùn)行時(shí)間縮短到18 s,這樣就可以探索復(fù)雜模型的參數(shù)空間。將幾s的運(yùn)行時(shí)間縮短到幾ms,就可以對計(jì)算機(jī)模型進(jìn)行交互式研究。本書對個(gè)人研究者和小團(tuán)隊(duì)?wèi)?yīng)該特別有用,他們可以為自己的內(nèi)部PC配備GPU,并獲得這些性能上的好處。即使是可以輕松訪問大型HPC設(shè)施的團(tuán)隊(duì),也可以從在他們自己的臺(tái)式機(jī)上使用非?焖俚墓ぞ邅硖剿髌浣Y(jié)果而受益。
當(dāng)然,本書也適合任何有興趣深入了解GPU和并行編程的讀者。即使你已經(jīng)對該主題有所了解,我們相信你也可以從研究我們的編碼風(fēng)格與選擇的示例中受益。
具體而言,本書主要介紹使用C++對NVIDIA GPU進(jìn)行編程。自2007年以來,NVIDIA已成為HPC領(lǐng)域的主導(dǎo)力量,最近還成為AI領(lǐng)域的主導(dǎo)力量,這不僅由于GPU的成本效益,還由于CUDA語言使用類似于C++的優(yōu)雅特效。我知道一些科學(xué)編程仍然使用Fortran的各種版本(包括Fortran IV,這是我在20世紀(jì)80年代初期非常喜歡的一種語言), 但在我看來,C++更具表現(xiàn)力。Fortran的粉絲可能會(huì)指出使用指針優(yōu)化C++代碼存在技術(shù)問題,但這些問題隨著在C11中引入restrict關(guān)鍵字,已在C++11中得到解決,F(xiàn)代C++編譯器也支持這個(gè)關(guān)鍵字,并且在我們的許多示例中都使用它。
示例是本書區(qū)別于當(dāng)前其他關(guān)于CUDA書籍的一個(gè)特點(diǎn),我們的示例是從有趣的現(xiàn)實(shí)世界應(yīng)用中精心制作的,包括物理和醫(yī)學(xué)成像,而不是在其他地方找到的相當(dāng)基礎(chǔ)的常見問題。本書區(qū)別于其他書籍的另一個(gè)特點(diǎn)是,我們在編寫代碼的外觀方面是非常用心的,在適當(dāng)?shù)牡胤绞褂矛F(xiàn)代的C++來減少冗余并保持簡潔,我認(rèn)為這真的很重要。根據(jù)我的經(jīng)驗(yàn),許多人會(huì)通過修改其他人的代碼來學(xué)習(xí)計(jì)算機(jī)編程,盡管目前流通的大部分CUDA示例代碼都有效,但談不上優(yōu)雅。這可能是因?yàn)樵?007年推出CUDA時(shí),是作為C的擴(kuò)展而不是C++,最初的SDK示例大多以冗長的C風(fēng)格編寫。不幸的是,許多在線的CUDA教程和書籍中仍然是這種風(fēng)格。事實(shí)上,CUDA一直支持一些C++,現(xiàn)在CUDA完全支持C++17(盡管有一些限制)。2019年11月,(NVIDIA C Programmers Guide)被更名為(NVIDIA C++ Programmers Guide),盡管指南的內(nèi)容沒有發(fā)生重大變化,但它標(biāo)志著NVIDIA對代碼的態(tài)度改變了,自2020年以來,一些更高級的C++用法開始出現(xiàn)在SDK示例中。
本書的目標(biāo)不是從零開始教授C++,我們假設(shè)你具有一些C++的基本知識。然而附錄I會(huì)討論我們示例中使用的一些C++特性,F(xiàn)代C++實(shí)際上有點(diǎn)龐大,具有許多支持面向?qū)ο蠛推渌呒壘幊田L(fēng)格的新特性。在本書中不使用這些特性,因?yàn)槲覀冋J(rèn)為它們不適合實(shí)現(xiàn)在GPU上運(yùn)行的算法代碼,我們還是更喜歡模板函數(shù)而不是虛擬函數(shù)。
要充分利用本書,你需要使用配備支持CUDA的NVIDIA GPU的PC(許多PC都支持)。這些示例是在配備4核Intel CPU和NVIDIA RTX 2070 GPU(2019年價(jià)格為480英鎊)的Windows 10 PC上開發(fā)的。Linux系統(tǒng)也可以,我們所有的示例都可以在不需要修改的情況下運(yùn)行。無論你使用什么系統(tǒng),都需要一個(gè)當(dāng)前版本的(免費(fèi))NVIDIA CUDA Toolkit。在Windows上,你還需要Visual Studio C++(免費(fèi)的社區(qū)版也可以)。在Linux上,gcc或g++都可以。
不幸的是,我們
理查德·安索奇(Richard Ansorge)是劍橋大學(xué)卡文迪什實(shí)驗(yàn)室(Cavendish Laboratory)的榮譽(yù)大學(xué)高級講師,也是劍橋大學(xué)菲茨威廉學(xué)院(Fitzwilliam College)的榮譽(yù)導(dǎo)師和研究員。他發(fā)表了170多篇經(jīng)過同行評審的論文,并與他人合著了The Physics and Mathematics of MRI (2016)一書。
目 錄 Contents
譯者序
前言
第1章 GPU內(nèi)核與硬件介紹1
1.1?背景1
1.2?第一個(gè)CUDA示例2
1.3?CPU架構(gòu)9
1.4?CPU的計(jì)算能力10
1.5?CPU內(nèi)存管理:利用緩存隱藏延遲11
1.6?CPU:并行指令集13
1.7?GPU架構(gòu)13
1.7.1?回顧歷史13
1.7.2 NVIDIA的GPU型號14
1.8?Pascal架構(gòu)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 啟動(dòng)三維內(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)計(jì)算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 三維圖像配準(zhǔn)156
5.10 圖像配準(zhǔn)結(jié)果164
第5章尾注166
第6章 蒙特卡羅應(yīng)用167
6.1 簡介167
6.2 cuRAND庫173
6.2.1 cuRAND的主機(jī)API173
6.2.2 cuRAND的設(shè)備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掃描儀的應(yīng)用225
8.1 PET簡介225
8.2 數(shù)據(jù)存儲(chǔ)和掃描儀的幾何結(jié)構(gòu)
的定義227
8.3 模擬PET掃描儀233
8.4 建立系統(tǒng)矩陣244
8.5 PET重建246
8.6 結(jié)果250
8.7 OSEM的實(shí)現(xiàn)252
8.8 交互作用的深度254
8.9 使用交互作用的深度的PET
結(jié)果257
8.10 塊探測器258
8.11 Richardson-Lucy圖像去模糊268
第8章尾注273
第9章 擴(kuò)展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進(jìn)行分析311
10.3 用NVIDIA Visual Profiler進(jìn)行
分析314
10.4 Nsight Systems316
10.5 Nsight Compute319
10.6 Nsight Compute部分320
10.6.1 GPU光速320
10.6.2 計(jì)算工作負(fù)載分析321
10.6.3 內(nèi)存工作負(fù)載分析322
10.6.4 調(diào)度器統(tǒng)計(jì)信息323
10.6.5 warp狀態(tài)統(tǒng)計(jì)323
10.6.6 指令統(tǒng)計(jì)信息324
10.6.7 啟動(dòng)統(tǒng)計(jì)信息324
10.6.8 占用率326
10.6.9 源計(jì)數(shù)器327
10.7 使用printf進(jìn)行調(diào)試328
10.8 通過Microsoft Visual Studio
進(jìn)行調(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計(jì)算過濾器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