CUDA并行編程實(shí)戰(zhàn) [英]理查德·安索奇
定 價(jià):139 元
當(dāng)前圖書(shū)已被 3 所學(xué)校薦購(gòu)過(guò)!
查看明細(xì)
- 作者:[英]理查德·安索奇
- 出版時(shí)間:2024/11/1
- ISBN:9787111764632
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP311.11
- 頁(yè)碼:
- 紙張:膠版紙
- 版次:
- 開(kāi)本:16開(kāi)
本書(shū)是一本深入淺出的CUDA編程實(shí)踐指南。由CUDA編程領(lǐng)域的資深專家撰寫,主要介紹使用C++對(duì)NVIDIA GPU進(jìn)行編程,覆蓋了GPU內(nèi)核與硬件、并行思維與編程、warp和協(xié)作組、并行模板、紋理、蒙特卡羅應(yīng)用等內(nèi)容,旨在幫助讀者快速掌握CUDA編程的核心技能。書(shū)中詳細(xì)介紹了CUDA的基本概念、架構(gòu)和編程模型,并通過(guò)豐富的實(shí)戰(zhàn)案例和詳細(xì)解析,指導(dǎo)讀者如何編寫、優(yōu)化和調(diào)試CUDA程序。本書(shū)注重理論與實(shí)踐相結(jié)合,旨在培養(yǎng)讀者解決實(shí)際問(wèn)題的能力。無(wú)論讀者是初學(xué)者還是有一定經(jīng)驗(yàn)的開(kāi)發(fā)者,都能從本書(shū)中獲益。掌握CUDA編程技能將為讀者的職業(yè)發(fā)展增添重要競(jìng)爭(zhēng)力,助力讀者在科學(xué)研究、工程開(kāi)發(fā)、數(shù)據(jù)分析等領(lǐng)域中脫穎而出。
CUDA是目前用于GPU編程的主流工具,而GPU是近幾十年來(lái)最令人振奮的硬件發(fā)展成果之一。通過(guò)CUDA,你可以用臺(tái)式計(jì)算機(jī)去完成原本需要大型計(jì)算機(jī)集群或高性能計(jì)算設(shè)施才能完成的工作。因此CUDA在整個(gè)科學(xué)、技術(shù)、工程和數(shù)學(xué)界的科學(xué)計(jì)算方面變得越來(lái)越重要,包括從醫(yī)學(xué)物理學(xué)到金融建模,再到大數(shù)據(jù)應(yīng)用等領(lǐng)域。 本書(shū)匯集了作者長(zhǎng)期開(kāi)發(fā)和使用計(jì)算機(jī)來(lái)獲取和分析科學(xué)數(shù)據(jù)的豐富經(jīng)驗(yàn),內(nèi)容翔實(shí)。同時(shí),本書(shū)也是一本具有創(chuàng)新性的著作,相較于其他同類GPU計(jì)算相關(guān)的圖書(shū),本書(shū)提供了更為豐富的示例。作者非常注重緊湊、優(yōu)雅和高效的C++編碼風(fēng)格,本書(shū)配套的示例代碼庫(kù)和支持材料都可以在線獲取,讀者可以基于這些去構(gòu)建自己的項(xiàng)目。通過(guò)閱讀本書(shū),你將能夠: 迅速掌握GPU與CUDA的基礎(chǔ)及編程模型。 學(xué)習(xí)并行編程及背后的思想。 掌握CUDA程序的調(diào)試與性能分析技巧。 了解如何將CUDA應(yīng)用于實(shí)戰(zhàn)項(xiàng)目中。 提升解決并行計(jì)算問(wèn)題的能力。
前 言
本書(shū)主要是為需要強(qiáng)大計(jì)算能力的人編寫的,包括那些需要這種能力對(duì)數(shù)據(jù)進(jìn)行獲取、處理、分析或建模的科研人員。對(duì)于需要處理更大數(shù)據(jù)集與更復(fù)雜圖像數(shù)據(jù)的醫(yī)療數(shù)據(jù)人員,他們也會(huì)發(fā)現(xiàn)本書(shū)對(duì)其很有幫助。
在我的整個(gè)研究生涯中,我一直在面對(duì)復(fù)雜而苛刻的計(jì)算,首先是在高能物理學(xué)實(shí)驗(yàn)中,最近是在醫(yī)學(xué)成像的各種應(yīng)用中。GPU計(jì)算的出現(xiàn)是我所見(jiàn)過(guò)的最激動(dòng)人心的發(fā)展之一,撰寫本書(shū)的一個(gè)原因就是要與讀者分享這種興奮。
這似乎是摩爾定律的必然結(jié)果——對(duì)計(jì)算能力的需求增長(zhǎng)總是超過(guò)當(dāng)前可用的水平。自20世紀(jì)80年代初期PC時(shí)代開(kāi)啟以來(lái),供應(yīng)商一直在提供附加卡以提高渲染顯示的速度。這些卡現(xiàn)在被稱為圖形處理單元(Graphic Processing Unit, GPU),在PC游戲行業(yè)需求的推動(dòng)下,它們已經(jīng)成為非常強(qiáng)大的計(jì)算引擎。2007年,NVIDIA推出的CUDA工具包徹底改變了游戲規(guī)則,該工具包可以用來(lái)編寫出利用GPU強(qiáng)大性能的科學(xué)應(yīng)用軟件。我們的計(jì)算能力突然提高了100倍,不再遵循過(guò)去每18個(gè)月翻一倍的規(guī)律。從那時(shí)起,GPU性能也隨著時(shí)間的推移繼續(xù)呈指數(shù)級(jí)增長(zhǎng),超越了摩爾定律。因此,現(xiàn)在開(kāi)始了解如何在GPU上進(jìn)行編程,與在2007年一樣有用。事實(shí)上,你現(xiàn)在想在世界級(jí)超級(jí)計(jì)算機(jī)上進(jìn)行高性能計(jì)算(HPC),就必須了解如何使用GPU。
大約在2002年之前,PC計(jì)算能力的指數(shù)級(jí)增長(zhǎng)主要依賴于時(shí)鐘速度的提高。然而從那時(shí)候起,時(shí)鐘速度穩(wěn)定在3.5 GHz左右,但CPU芯片中的核心數(shù)量在穩(wěn)步增加。因此,并行編程(使用同時(shí)運(yùn)行的多個(gè)協(xié)作核心來(lái)分擔(dān)單個(gè)任務(wù)的計(jì)算負(fù)載)對(duì)于從現(xiàn)代硬件中獲益至關(guān)重要。GPU將并行編程提升到一個(gè)新的水平,允許數(shù)千甚至數(shù)百萬(wàn)個(gè)并行線程在計(jì)算中進(jìn)行協(xié)作。
科學(xué)研究難度大并且競(jìng)爭(zhēng)激烈,可用的計(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,就可以對(duì)計(jì)算機(jī)模型進(jìn)行交互式研究。本書(shū)對(duì)個(gè)人研究者和小團(tuán)隊(duì)?wèi)?yīng)該特別有用,他們可以為自己的內(nèi)部PC配備GPU,并獲得這些性能上的好處。即使是可以輕松訪問(wèn)大型HPC設(shè)施的團(tuán)隊(duì),也可以從在他們自己的臺(tái)式機(jī)上使用非?焖俚墓ぞ邅(lái)探索其結(jié)果而受益。
當(dāng)然,本書(shū)也適合任何有興趣深入了解GPU和并行編程的讀者。即使你已經(jīng)對(duì)該主題有所了解,我們相信你也可以從研究我們的編碼風(fēng)格與選擇的示例中受益。
具體而言,本書(shū)主要介紹使用C++對(duì)NVIDIA GPU進(jìn)行編程。自2007年以來(lái),NVIDIA已成為HPC領(lǐng)域的主導(dǎo)力量,最近還成為AI領(lǐng)域的主導(dǎo)力量,這不僅由于GPU的成本效益,還由于CUDA語(yǔ)言使用類似于C++的優(yōu)雅特效。我知道一些科學(xué)編程仍然使用Fortran的各種版本(包括Fortran IV,這是我在20世紀(jì)80年代初期非常喜歡的一種語(yǔ)言), 但在我看來(lái),C++更具表現(xiàn)力。Fortran的粉絲可能會(huì)指出使用指針優(yōu)化C++代碼存在技術(shù)問(wèn)題,但這些問(wèn)題隨著在C11中引入restrict關(guān)鍵字,已在C++11中得到解決,F(xiàn)代C++編譯器也支持這個(gè)關(guān)鍵字,并且在我們的許多示例中都使用它。
示例是本書(shū)區(qū)別于當(dāng)前其他關(guān)于CUDA書(shū)籍的一個(gè)特點(diǎn),我們的示例是從有趣的現(xiàn)實(shí)世界應(yīng)用中精心制作的,包括物理和醫(yī)學(xué)成像,而不是在其他地方找到的相當(dāng)基礎(chǔ)的常見(jiàn)問(wèn)題。本書(shū)區(qū)別于其他書(shū)籍的另一個(gè)特點(diǎn)是,我們?cè)诰帉懘a的外觀方面是非常用心的,在適當(dāng)?shù)牡胤绞褂矛F(xiàn)代的C++來(lái)減少冗余并保持簡(jiǎn)潔,我認(rèn)為這真的很重要。根據(jù)我的經(jīng)驗(yàn),許多人會(huì)通過(guò)修改其他人的代碼來(lái)學(xué)習(xí)計(jì)算機(jī)編程,盡管目前流通的大部分CUDA示例代碼都有效,但談不上優(yōu)雅。這可能是因?yàn)樵?007年推出CUDA時(shí),是作為C的擴(kuò)展而不是C++,最初的SDK示例大多以冗長(zhǎng)的C風(fēng)格編寫。不幸的是,許多在線的CUDA教程和書(shū)籍中仍然是這種風(fēng)格。事實(shí)上,CUDA一直支持一些C++,現(xiàn)在CUDA完全支持C++17(盡管有一些限制)。2019年11月,(NVIDIA C Programmers Guide)被更名為(NVIDIA C++ Programmers Guide),盡管指南的內(nèi)容沒(méi)有發(fā)生重大變化,但它標(biāo)志著NVIDIA對(duì)代碼的態(tài)度改變了,自2020年以來(lái),一些更高級(jí)的C++用法開(kāi)始出現(xiàn)在SDK示例中。
本書(shū)的目標(biāo)不是從零開(kāi)始教授C++,我們假設(shè)你具有一些C++的基本知識(shí)。然而附錄I會(huì)討論我們示例中使用的一些C++特性。現(xiàn)代C++實(shí)際上有點(diǎn)龐大,具有許多支持面向?qū)ο蠛推渌呒?jí)編程風(fēng)格的新特性。在本書(shū)中不使用這些特性,因?yàn)槲覀冋J(rèn)為它們不適合實(shí)現(xiàn)在GPU上運(yùn)行的算法代碼,我們還是更喜歡模板函數(shù)而不是虛擬函數(shù)。
要充分利用本書(shū),你需要使用配備支持CUDA的NVIDIA GPU的PC(許多PC都支持)。這些示例是在配備4核Intel CPU和NVIDIA RTX 2070 GPU(2019年價(jià)格為480英鎊)的Windows 10 PC上開(kāi)發(fā)的。Linux系統(tǒng)也可以,我們所有的示例都可以在不需要修改的情況下運(yùn)行。無(wú)論你使用什么系統(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é)高級(jí)講師,也是劍橋大學(xué)菲茨威廉學(xué)院(Fitzwilliam College)的榮譽(yù)導(dǎo)師和研究員。他發(fā)表了170多篇經(jīng)過(guò)同行評(píng)審的論文,并與他人合著了The Physics and Mathematics of MRI (2016)一書(shū)。
目 錄 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型號(hào)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)用語(yǔ)法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對(duì)象71
3.2 分塊分區(qū)75
3.3 向量加載81
3.4 warp級(jí)內(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 二維模板的級(jí)聯(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 簡(jiǎn)介167
6.2 cuRAND庫(kù)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 磁盤的開(kāi)銷212
7.7 CUDA圖219
第7章尾注224
第8章 PET掃描儀的應(yīng)用225
8.1 PET簡(jiǎn)介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 塊探測(cè)器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訪問(wèn)282
9.4 CUDA零拷貝內(nèi)存284
9.5 統(tǒng)一內(nèi)存285
9.6 MPI的簡(jiǎn)要介紹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 通過(guò)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ì)算過(guò)濾器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簡(jiǎn)史352
附錄B 原子操作361
附錄C NVCC編譯器366
附錄D AVX與Intel編譯器372
附錄E 數(shù)字格式380
附錄F CUDA文檔和庫(kù)384
附錄G CX頭文件387
附錄H AI和Python410
附錄I C++的主題413