天天看點

cuda c語言程式設計指南,CUDA C程式設計權威指南

譯者序

推薦序

自序

作者簡介

技術審校者簡介

前言

緻謝

章基于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.3CUDA:一種異構計算平台10

1.3用GPU輸出HelloWorld12

1.4使用CUDAC程式設計難嗎15

1.5總結16

1.6習題16

第2章CUDA程式設計模型18

2.1CUDA程式設計模型概述18

2.1.1CUDA程式設計結構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.1CUDA執行模型概述56

3.1.1GPU架構概述57

3.1.2Fermi架構59

3.1.3Kepler架構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上嵌套HelloWorld106

3.6.3嵌套歸約109

3.7總結113

3.8習題113

第4章全局記憶體115

4.1CUDA記憶體模型概述115

4.1.1記憶體層次結構的優點116

4.1.2CUDA記憶體模型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.1CUDA共享記憶體概述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.1CUDA流231

6.1.2流排程234

6.1.3流的優先級235

6.1.4CUDA事件235

6.1.5流同步237

6.2并發核心執行240

6.2.1非空流中的并發核心240

6.2.2FermiGPU上的虛假依賴關系242

6.2.3使用OpenMP的排程操作244

6.2.4用環境變量調整流行為245

6.2.5GPU資源的并發限制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.1CUDA指令概述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.1CUDA庫概述282

8.1.1CUDA庫支援的作用域283

8.1.2通用的CUDA庫工作流283

8.2cuSPARSE庫285

8.2.1cuSPARSE資料存儲格

8.2.2用cuSPARSE進行格式轉換

8.2.3cuSPARSE功能示例

8.2.4cuSPARSE發展中的重要主題

8.2.5cuSPARSE小結

8.3cuBLAS庫

8.3.1管理cuBLAS資料

8.3.2cuBLAS功能示例

8.3.3cuBLAS發展中的重要主題

8.3.4cuBLAS小結

8.4cuFFT庫

8.4.1使用cuFFTAPI

8.4.2cuFFT功能示例

8.4.3cuFFT小結

8.5cuRAND庫

8.5.1拟随機數或僞随機數的選擇

8.5.2cuRAND庫概述

8.5.3cuRAND介紹

8.5.4cuRAND發展中的重要主題

8.6CUDA6.0中函數庫的介紹

8.6.1Drop—In庫

8.6.2多GPU庫

8.7CUDA函數庫的性能研究

8.7.1cuSPARSE與MKL的比較

8.7.2cuBLAS與MKLBLAS的比較

8.7.3cuFFT與FFTW及MKL的比較

8.7.4CUDA庫性能小結

8.8OpenACC的使用

8.8.1OpenACC計算指令的使用

8.8.2OpenACC資料指令的使用

8.8.3OpenACC運作時API

8.8.4OpenACC和CUDA庫的結合

8.8.5OpenACC小結

8.9總結

8.10習題

第9章多GPU程式設計

9.1從一個GPU到多GPU

9.1.1在多GPU上執行

9.1.2點對點通信

9.1.3多GPU間的同步

9.2多GPU間細分計算

9.2.1在多裝置上配置設定記憶體

9.2.2單主機線程配置設定工作

9.2.3編譯和執行

9.3多GPU上的點對點通信

9.3.1實作點對點通路

9.3.2點對點的記憶體複制

9.3.3統一虛拟尋址的點對點記憶體通路

9.4多GPU上的有限差分

9.4.1二維波動方程的模闆計算

9.4.2多GPU程式的典型模式

9.4.3多GPU上的二維模闆計算

9.4.4重疊計算與通信

9.4.5編譯和執行

9.5跨GPU叢集擴充應用程式

9.5.1CPU到CPU的資料傳輸

9.5.2使用傳統MPI在GPU和GPU間傳輸資料

9.5.3使用CUDA—awareMPI進行GPU到GPU的資料傳輸

9.5.4使用CUDA—awareMPI進行節點内GPU到GPU的資料傳輸

9.5.5調整消息塊大小

行GPU到GPU的資料傳輸

9.6總結

9.7習題

……

0章程式實作的注意事項

附錄推薦閱讀顯示全部>>隐藏全部>>