内容簡介
本書主要介紹了如何使用GPU和利用CUDAC語言對其進行程式設計的。首先從基本的CUDA概念及結構講起,一步一步地引導讀者進入CUDA的内部世界,由淺入深地介紹了其程式設計要求及其内部架構,使讀者對其有了整體印象後,逐漸深入了解其内部機能,後介紹了GPU的一些專用函數和注意事項。
目錄
譯者序
推薦序
自序
作者簡介
技術審校者簡介
前言
緻謝
第1章 基于CUDA的異構并行計算1
1.1 并行計算1
1.1.1 串行程式設計和并行程式設計2
1.1.2 并行性3
1.1.3 計算機架構4
1.2 異構計算6
1.2.1 異構架構7
1.2.2 異構計算範例9
1.2.3 CUDA:一種異構計算平台10
1.3 用GPU輸出Hello World12
1.4 使用CUDA C程式設計難嗎15
1.5 總結16
1.6 習題16
第2章 CUDA程式設計模型18
2.1 CUDA程式設計模型概述18
2.1.1 CUDA程式設計結構19
2.1.2 記憶體管理20
2.1.3 線程管理24
2.1.4 啟動一個CUDA核函數29
2.1.5 編寫核函數30
2.1.6 驗證核函數31
2.1.7 處理錯誤32
2.1.8 編譯和執行32
2.2 給核函數計時35
2.2.1 用CPU計時器計時35
2.2.2 用nvprof工具計時39
2.3 組織并行線程40
2.3.1 使用塊和線程建立矩陣索引40
2.3.2 使用二維網格和二維塊對矩陣求和44
2.3.3 使用一維網格和一維塊對矩陣求和47
2.3.4 使用二維網格和一維塊對矩陣求和48
2.4 裝置管理50
2.4.1 使用運作時API查詢GPU資訊50
2.4.2 确定最優GPU53
2.4.3 使用nvidia-smi查詢GPU資訊53
2.4.4 在運作時設定裝置54
2.5 總結54
2.6 習題55
第3章 CUDA執行模型56
3.1 CUDA執行模型概述56
3.1.1 GPU架構概述57
3.1.2 Fermi架構59
3.1.3 Kepler架構61
3.1.4 配置檔案驅動優化65
3.2 了解線程束執行的本質67
3.2.1 線程束和線程塊67
3.2.2 線程束分化69
3.2.3 資源配置設定74
3.2.4 延遲隐藏76
3.2.5 占用率78
3.2.6 同步81
3.2.7 可擴充性82
3.3 并行性的表現83
3.3.1 用nvprof檢測活躍的線程束84
3.3.2 用nvprof檢測記憶體操作85
3.3.3 增大并行性86
3.4 避免分支分化88
3.4.1 并行歸約問題88
3.4.2 并行歸約中的分化89
3.4.3 改善并行歸約的分化93
3.4.4 交錯配對的歸約95
3.5 展開循環97
3.5.1 展開的歸約97
3.5.2 展開線程的歸約99
3.5.3 完全展開的歸約101
3.5.4 模闆函數的歸約102
3.6 動态并行104
3.6.1 嵌套執行105
3.6.2 在GPU上嵌套Hello World106
3.6.3 嵌套歸約109
3.7 總結113
3.8 習題113
第4章 全局記憶體115
4.1 CUDA記憶體模型概述115
4.1.1 記憶體層次結構的優點116
4.1.2 CUDA記憶體模型117
4.2 記憶體管理124
4.2.1 記憶體配置設定和釋放124
4.2.2 記憶體傳輸125
4.2.3 固定記憶體127
4.2.4 零拷貝記憶體128
4.2.5 統一虛拟尋址133
4.2.6 統一記憶體尋址134
4.3 記憶體通路模式135
4.3.1 對齊與合并通路135
4.3.2 全局記憶體讀取137
4.3.3 全局記憶體寫入145
4.3.4 結構體數組與數組結構體147
4.3.5 性能調整151
4.4 核函數可達到的帶寬154
4.4.1 記憶體帶寬154
4.4.2 矩陣轉置問題155
4.5 使用統一記憶體的矩陣加法167
4.6 總結171
4.7 習題172
第5章 共享記憶體和常量記憶體174
5.1 CUDA共享記憶體概述174
5.1.1 共享記憶體175
5.1.2 共享記憶體配置設定176
5.1.3 共享記憶體存儲體和通路模式176
5.1.4 配置共享記憶體量181
5.1.5 同步183
5.2 共享記憶體的資料布局185
5.2.1 方形共享記憶體185
5.2.2 矩形共享記憶體193
5.3 減少全局記憶體通路199
5.3.1 使用共享記憶體的并行歸約199
5.3.2 使用展開的并行歸約202
5.3.3 使用動态共享記憶體的并行歸約204
5.3.4 有效帶寬205
5.4 合并的全局記憶體通路205
5.4.1 基準轉置核心205
5.4.2 使用共享記憶體的矩陣轉置207
5.4.3 使用填充共享記憶體的矩陣轉置210
5.4.4 使用展開的矩陣轉置211
5.4.5 增大并行性214
5.5 常量記憶體215
5.5.1 使用常量記憶體實作一維模闆215
5.5.2 與隻讀緩存的比較217
5.6 線程束洗牌指令219
5.6.1 線程束洗牌指令的不同形式220
5.6.2 線程束内的共享資料222
5.6.3 使用線程束洗牌指令的并行歸約226
5.7 總結227
5.8 習題228
第6章 流和并發230
6.1 流和事件概述231
6.1.1 CUDA流231
6.1.2 流排程234
6.1.3 流的優先級235
6.1.4 CUDA事件235
6.1.5 流同步237
6.2 并發核心執行240
6.2.1 非空流中的并發核心240
6.2.2 Fermi GPU上的虛假依賴關系242
6.2.3 使用OpenMP的排程操作244
6.2.4 用環境變量調整流行為245
6.2.5 GPU資源的并發限制246
6.2.6 預設流的阻塞行為247
6.2.7 建立流間依賴關系248
6.3 重疊核心執行和資料傳輸249
6.3.1 使用深度優先排程重疊249
6.3.2 使用廣度優先排程重疊252
6.4 重疊GPU和CPU執行254
6.5 流回調255
6.6 總結256
6.7 習題257
第7章 調整指令級原語258
7.1 CUDA指令概述259
7.1.1 浮點指令259
7.1.2 内部函數和标準函數261
7.1.3 原子操作指令262
7.2 程式優化指令264
7.2.1 單精度與雙精度的比較264
7.2.2 标準函數與内部函數的比較266
7.2.3 了解原子指令272
7.2.4 綜合範例277
7.3 總結279
7.4 習題280
第8章 GPU加速庫和OpenACC281
8.1 CUDA庫概述282
8.1.1 CUDA庫支援的作用域283
8.1.2 通用的CUDA庫工作流283
8.2 cuSPARSE庫285
8.2.1 cuSPARSE資料存儲格
前言/序言
歡迎來到用CUDA C進行異構并行程式設計的奇妙世界!
現代的異構系統正朝一個充滿無限計算可能性的未來發展。異構計算正在不斷被應用到新的計算領域—從科學到資料庫,再到機器學習的方方面面。程式設計的未來将是異構并行程式設計的天下!
本書将引領你通過使用CUDA平台、CUDA工具包和CUDA C語言快速上手GPU(圖形處理單元)計算。本書中設定的範例與練習也将帶你快速了解CUDA的專業知識,助你早日達到專業水準!
本書寫給誰本書适用于任何想要利用GPU計算能力來提高應用效率的人。它涵蓋了CUDA C程式設計領域最前沿的技術,并有着以下突出的優勢:
風格簡潔描述透徹大量範例優質習題覆寫面廣内容聚焦高性能計算的需求如果你是一個經驗豐富的C程式員,并且想要通過學習CUDA C來提高高性能計算的專業才能,本書中建立在你現有知識之上的例題和習題,将使掌握CUDA C程式設計更加簡單。僅需掌握一些C語言延伸的CUDA知識,你便可以從大量的并行硬體中獲益。CUDA平台、程式設計模型、工具和庫将使得異構架構程式設計變得簡捷且高效。
如果你是計算機科學領域以外的專業人士,而且想要通過GPU上的并行程式設計來最大限度地提高工作效率,并提高應用性能,那麼本書正是為你量身打造的。書中的闡述清晰而簡明,專人精心設計的示例,使用配置檔案驅動的方法,這些都将幫助你深入了解GPU程式設計并迅速掌握CUDA。
如果你是教授或任何學科的研究者,希望通過GPU計算推進科學發現和創新,本書中将有你找到解決方案的捷徑。即使你沒有多少程式設計經驗,在并行計算概念和計算機科學的知識方面也不夠精通,本書也可帶你快速入門異構架構并行程式設計。
如果你是C語言初學者并且有興趣探索異構程式設計,本書也完全适合你,因為它不強制要求讀者有豐富的C語言程式設計經驗。即使CUDA C和C語言使用相同的文法,二者的抽象概念和底層硬體也是全然不同的,因而對其中之一的經驗并不足以使你在學習另一個時感到輕松。是以,隻要你對異構程式設計有濃厚的興趣,隻要你樂于學習新事物且樂于嘗試全新的思維方式,隻要你對技術相關的話題有深入探索的熱情,本書也完全适合你。
即使你有不少關于CUDA C的經驗,本書還是有助于知識更新、探索新工具以及了解最新CUDA功能。雖然本書旨在從零開始培養CUDA的專業人才,但它也含有許多先進的CUDA概念、工具和架構的概述,它們将對CUDA開發人員大有裨益。
本書的内容本書講解了CUDA C程式設計的基本概念與技術,用于大幅加速應用程式的性能,并包含了随着CUDA工具包6.0和NVIDIA Kepler GPU一起釋出的最新功能。在對從同質架構到異構架構的并行程式設計模式轉變進行了簡要介紹之後,本書将引導你學習必要的CUDA程式設計技能和最佳的練習實踐,包含但不僅限于CUDA程式設計模型、GPU執行模型、GPU記憶體模型、CUDA流和事件、多GPU程式設計的相關技術、CUDA感覺MPI程式設計和NVIDIA開發工具。
本書采用一種獨特的方法來教授CUDA知識,即将基礎性的概念講解與生動形象的示例相結合,這些示例使用配置檔案驅動的方法來指導你實作最佳性能。我們對每一個主題都進行了詳盡的講解,清晰地展示出了采用代碼示例形式詳細操作的過程。書中不僅教授如何使用基于CUDA的工具,還介紹了如何以抽象程式設計模型為基礎并憑借悟性與直覺對開發過程每一步驟的結果做出解釋,進而幫助你快速掌握CUDA的開發流程。
每章圍繞一個主題展開講解,運用可行的代碼示例來示範GPU程式設計的基本功能和技術,這之後就是我們精心設計的練習,以便你進一步探索加深了解。
所有的程式設計示例都是在裝有CUDA 5.0(或更高版本)和Kepler或Fermi GPU的Linux系統上運作的。由于CUDA C是一種跨平台的語言,因而書中的示例在其他平台上也同樣适用,比如嵌入式系統、平闆電腦、筆記本電腦、個人電腦、工作站以及高性能計算伺服器。許多OEM供應商支援各種類型的NVIDIA GPU。
本書的結構本書共有10章,包含了以下主題。
第1章:基于CUDA的異構并行計算本章首先簡要介紹了使用GPU來完善CPU的異構架構,以及向異構并行程式設計進行的模式轉變。
第2章:CUDA程式設計模型本章介紹了CUDA程式設計模型和CUDA程式的通用架構,從邏輯視角解釋了在CUDA中的大規模并行計算:通過程式設計模型直覺展示的兩層線程層次結構。同時也探讨了線程配置啟發性方法和它們對性能的影響。
第3章:CUDA執行模型本章通過研究成千上萬的線程是如何在GPU中排程的,來探讨硬體層面的核心執行問題。解釋了計算資源是如何在多粒度線程間配置設定的,也從硬體視角說明了它如何被用于指導核心設計,以及如何用配置檔案驅動方法來開發和優化核心程式。另外,本章還結合示例闡述了CUDA的動态并行化和嵌套執行。
第4章:全局記憶體本章介紹了CUDA記憶體模型,探讨全局記憶體資料布局,并分析了全局記憶體的通路模式。本章介紹了各種記憶體通路模式的性能表現,闡述了統一記憶體和CUDA 6.0中的新功能是如何簡化CUDA程式設計的,以及如何提高程式員工作效率。
第5章:共享記憶體和常量記憶體本章闡釋了共享記憶體,即管理程式的低延遲緩存,是如何提高核心性能的。它描述了共享記憶體的優化資料布
CUDA C程式設計權威指南 下載下傳 mobi epub pdf txt