本書是CUDA並行程序設計領域最全面、最詳實和最具權威性的著作之一,由CUDA開發者社區技術總監親自撰寫,英偉達中國首批CUDA官方認證工程師翻譯,詳實地講解了CUDA並行程序設計的技術知識點(平台、架構、硬件知識、開發工具和熱點技術)和編程方法,包含大量實用代碼示例,實踐性非常強。
全書共分為12章。
第1章從宏觀上介紹流處理器演變歷史。
第2章詳解GPU並行機制,深入理解串行與並行程序,以辯證地求解問題。
第3章講解CUDA設備及相關的硬件和體系結構,以實現最優CUDA程序性能。
第4章介紹CUDA開發環境搭建和可用調試環境。
第5章介紹與CUDA編程緊密相關的核心概念——網格、線程塊與線程,並通過示例說明線程模型與性能的關系。
第6章借助實例詳細講解了不同類型內存的工作機制,並指出實踐中容易出現的誤區。
第7章細述多任務的CPU和GPU協同,並介紹多個CPU/GPU編程秘技。
第8章介紹如何在應用程序中編寫和使用多GPU。
第9章詳述CUDA編程性能限制因素、分析CUDA代碼的工具和技術。
第10章介紹編程實踐中的庫與軟件開發工具包。
第11章講解如何設計基於GPU的系統。
第12章總結CUDA應用中易犯錯誤以及應對建議。
Shane Cook CUDA開發者社區技術總監,有20余年行業經驗。當認識到異構系統以及CUDA對於已有串行和並行編程技術的革命性沖擊時,創立了CUDA開發者社區(歐洲的咨詢公司,專門幫助企業重構代碼以充分利用GPU硬件的威力)。他專注於高性能軟件開發、GPU利用、嵌入式系統,並參與了多個C語言編程標准的建設,包括廣泛應用於汽車軟件行業的汽車工業軟件MISRA Safer
C。他常為德國汽車行業、國防承包行業、北電網絡以及福特汽車公司等機構或藍籌股公司提供專業咨詢服務和軟件定制開發。
目錄
致中國讀者
譯者序
前 言
第1章 超級計算簡史 1
1.1 簡介 1
1.2 馮·諾依曼計算機架構 2
1.3 克雷 4
1.4 連接機 5
1.5 Cell處理器 6
1.6 多點計算 8
1.7 早期的GPGPU編程 10
1.8 單核解決方案的消亡 11
1.9 英偉達和CUDA 12
1.10 GPU硬件 13
1.11 CUDA的替代選擇 15
1.11.1 OpenCL 15
1.11.2 DirectCompute 16
1.11.3 CPU的替代選擇 16
1.11.4 編譯指令和庫 17
1.12 本章小結 18
第2章 使用GPU理解並行計算 19
2.1 簡介 19
2.2 傳統的串行代碼 19
2.3 串行/並行問題 21
2.4 並發性 22
2.5 並行處理的類型 25
2.5.1 基於任務的並行處理 25
2.5.2 基於數據的並行處理 27
2.6 弗林分類法 29
2.7 常用的並行模式 30
2.7.1 基於循環的模式 30
2.7.2 派生/匯集模式 31
2.7.3 分條/分塊 33
2.7.4 分而治之 34
2.8 本章小結 34
第3章 CUDA硬件概述 35
3.1 PC架構 35
3.2 GPU硬件結構 39
3.3 CPU與GPU 41
3.4 GPU計算能力 42
3.4.1 計算能力1.0 42
3.4.2 計算能力1.1 43
3.4.3 計算能力1.2 44
3.4.4 計算能力1.3 44
3.4.5 計算能力2.0 44
3.4.6 計算能力2.1 46
第4章 CUDA環境搭建 48
4.1 簡介 48
4.2 在Windows下安裝軟件開發工具包 48
4.3 Visual Studio 49
4.3.1 工程 49
4.3.2 64位用戶 49
4.3.3 創建工程 51
4.4 Linux 52
4.5 Mac 55
4.6 安裝調試器 56
4.7 編譯模型 58
4.8 錯誤處理 59
4.9 本章小結 60
第5章 線程網格、線程塊以及線程 61
5.1 簡介 61
5.2 線程 61
5.2.1 問題分解 62
5.2.2 CPU與GPU的不同 63
5.2.3 任務執行模式 64
5.2.4 GPU線程 64
5.2.5 硬件初窺 66
5.2.6 CUDA內核 69
5.3 線程塊 70
5.4 線程網格 74
5.4.1 跨幅與偏移 76
5.4.2 X與Y方向的線程索引 77
5.5 線程束 83
5.5.1 分支 83
5.5.2 GPU的利用率 85
5.6 線程塊的調度 88
5.7 一個實例——統計直方圖 89
5.8 本章小結 96
第6章 CUDA內存處理 99
6.1 簡介 99
6.2 高速緩存 100
6.3 寄存器的用法 103
6.4 共享內存 112
6.4.1 使用共享內存排序 113
6.4.2 基數排序 117
6.4.3 合並列表 123
6.4.4 並行合並 128
6.4.5 並行歸約 131
6.4.6 混合算法 134
6.4.7 不同GPU上的共享內存 138
6.4.8 共享內存小結 139
6.5 常量內存 140
6.5.1 常量內存高速緩存 140
6.5.2 常量內存廣播機制 142
6.5.3 運行時進行常量內存更新 152
6.6 全局內存 157
6.6.1 記分牌 165
6.6.2 全局內存排序 165
6.6.3 樣本排序 168
6.7 紋理內存 188
6.7.1 紋理緩存 188
6.7.2 基於硬件的內存獲取操作 189
6.7.3 使用紋理的限制 190
6.8 本章小結 190
第7章 CUDA實踐之道 191
7.1 簡介 191
7.2 串行編碼與並行編碼 191
7.2.1 CPU與GPU的設計目標 191
7.2.2 CPU與GPU上的最佳算法對比 194
7.3 數據集處理 197
7.4 性能分析 206
7.5 一個使用AES的示例 218
7.5.1 算法 219
7.5.2 AES的串行實現 223
7.5.3 初始內核函數 224
7.5.4 內核函數性能 229
7.5.5 傳輸性能 233
7.5.6 單個執行流版本 234
7.5.7 如何與CPU比較 235
7.5.8 考慮在其他GPU上運行 244
7.5.9 使用多個流 248
7.5.10 AES總結 249
7.6 本章小結 249
第8章 多CPU和多GPU解決方案 252
8.1 簡介 252
8.2 局部性 252
8.3 多CPU系統 252
8.4 多GPU系統 253
8.5 多GPU算法 254
8.6 按需選用GPU 255
8.7 單節點系統 258
8.8 流 259
8.9 多節點系統 273
8.10 本章小結 284
第9章 應用程序性能優化 286
9.1 策略1:並行/串行在GPU/CPU上的問題分解 286
9.1.1 分析問題 286
9.1.2 時間 286
9.1.3 問題分解 288
9.1.4 依賴性 289
9.1.5 數據集大小 292
9.1.6 分辨率 293
9.1.7 識別瓶頸 294
9.1.8 CPU和GPU的任務分組 297
9.1.9 本節小結 299
9.2 策略2:內存因素 299
9.2.1 內存帶寬 299
9.2.2 限制的來源 300
9.2.3 內存組織 302
9.2.4 內存訪問以計算比率 303
9.2.5 循環融合和內核融合 308
9.2.6 共享內存和高速緩存的使用 309
9.2.7 本節小結 311
9.3 策略3:傳輸 311
9.3.1 鎖頁內存 311
9.3.2 零復制內存 315
9.3.3 帶寬限制 322
9.3.4 GPU計時 327
9.3.5 重疊GPU傳輸 330
9.3.6 本節小結 334
9.4 策略4:線程使用、計算和分支 335
9.4.1 線程內存模式 335
9.4.2 非活動線程 337
9.4.3 算術運算密度 338
9.4.4 一些常見的編譯器優化 342
9.4.5 分支 347
9.4.6 理解底層匯編代碼 351
9.4.7 寄存器的使用 355
9.4.8 本節小結 357
9.5 策略5:算法 357
9.5.1 排序 358
9.5.2 歸約 363
9.5.3 本節小結 384
9.6 策略6:資源競爭 384
9.6.1 識別瓶頸 384
9.6.2 解析瓶頸 396
9.6.3 本節小結 403
9.7 策略7:自調優應用程序 403
9.7.1 識別硬件 404
9.7.2 設備的利用 405
9.7.3 性能采樣 407
9.7.4 本節小結 407
9.8 本章小結 408
第10章 函數庫和SDK 410
10.1 簡介 410
10.2 函數庫 410
10.2.1 函數庫通用規范 411
10.2.2 NPP 411
10.2.3 Thrust 419
10.2.4 CuRAND 434
10.2.5 CuBLAS庫 438
10.3 CUDA運算SDK 442
10.3.1 設備查詢 443
10.3.2 帶寬測試 445
10.3.3 SimpleP2P 446
10.3.4 asyncAPI和cudaOpenMP 448
10.3.5 對齊類型 455
10.4 基於指令的編程 457
10.5 編寫自己的內核 464
10.6 本章小結 466
第11章 規划GPU硬件系統 467
11.1 簡介 467
11.2 CPU處理器 469
11.3 GPU設備 470
11.3.1 大容量內存的支持 471
11.3.2 ECC內存的支持 471
11.3.3 Tesla計算集群驅動程序 471
11.3.4 更高雙精度數學運算 472
11.3.5 大內存總線帶寬 472
11.3.6 系統管理中斷 472
11.3.7 狀態指示燈 472
11.4 PCI-E總線 472
11.5 GeForce板卡 473
11.6 CPU內存 474
11.7 風冷 475
11.8 液冷 477
11.9 機箱與主板 479
11.10 大容量存儲 481
11.10.1 主板上的輸入/輸出接口 481
11.10.2 專用RAID控制器 481
11.10.3 HDSL 483
11.10.4 大容量存儲需求 483
11.10.5 聯網 483
11.11 電源選擇 484
11.12 操作系統 487
11.12.1 Windows 487
11.12.2 Linux 488
11.13 本章小結 488
第12章 常見問題、原因及解決方案 489
12.1 簡介 489
12.2 CUDA指令錯誤 489
12.2.1 CUDA錯誤處理 489
12.2.2 內核啟動和邊界檢查 490
12.2.3 無效的設備操作 491
12.2.4 volatile限定符 492
12.2.5 計算能力依賴函數 494
12.2.6 設備函數、全局函數和主機函數 495
12.2.7 內核中的流 496
12.3 並行編程問題 497
12.3.1 競爭冒險 497
12.3.2 同步 498
12.3.3 原子操作 502
12.4 算法問題 504
12.4.1 對比測試 504
12.4.2 內存泄漏 506
12.4.3 耗時的內核程序 506
12.5 查找並避免錯誤 507
12.5.1 你的GPU程序有多少錯誤 507
12.5.2 分而治之 508
12.5.3 斷言和防御型編程 509
12.5.4 調試級別和打印 511
12.5.5 版本控制 514
12.6 為未來的GPU進行開發 515
12.6.1 開普勒架構 515
12.6.2 思考 518
12.7 后續學習資源 519
12.7.1 介紹 519
12.7.2 在線課程 519
12.7.3 教學課程 520
12.7.4 書籍 521
12.7.5 英偉達CUDA資格認證 521
12.8 本章小結 522
譯者序
前 言
第1章 超級計算簡史 1
1.1 簡介 1
1.2 馮·諾依曼計算機架構 2
1.3 克雷 4
1.4 連接機 5
1.5 Cell處理器 6
1.6 多點計算 8
1.7 早期的GPGPU編程 10
1.8 單核解決方案的消亡 11
1.9 英偉達和CUDA 12
1.10 GPU硬件 13
1.11 CUDA的替代選擇 15
1.11.1 OpenCL 15
1.11.2 DirectCompute 16
1.11.3 CPU的替代選擇 16
1.11.4 編譯指令和庫 17
1.12 本章小結 18
第2章 使用GPU理解並行計算 19
2.1 簡介 19
2.2 傳統的串行代碼 19
2.3 串行/並行問題 21
2.4 並發性 22
2.5 並行處理的類型 25
2.5.1 基於任務的並行處理 25
2.5.2 基於數據的並行處理 27
2.6 弗林分類法 29
2.7 常用的並行模式 30
2.7.1 基於循環的模式 30
2.7.2 派生/匯集模式 31
2.7.3 分條/分塊 33
2.7.4 分而治之 34
2.8 本章小結 34
第3章 CUDA硬件概述 35
3.1 PC架構 35
3.2 GPU硬件結構 39
3.3 CPU與GPU 41
3.4 GPU計算能力 42
3.4.1 計算能力1.0 42
3.4.2 計算能力1.1 43
3.4.3 計算能力1.2 44
3.4.4 計算能力1.3 44
3.4.5 計算能力2.0 44
3.4.6 計算能力2.1 46
第4章 CUDA環境搭建 48
4.1 簡介 48
4.2 在Windows下安裝軟件開發工具包 48
4.3 Visual Studio 49
4.3.1 工程 49
4.3.2 64位用戶 49
4.3.3 創建工程 51
4.4 Linux 52
4.5 Mac 55
4.6 安裝調試器 56
4.7 編譯模型 58
4.8 錯誤處理 59
4.9 本章小結 60
第5章 線程網格、線程塊以及線程 61
5.1 簡介 61
5.2 線程 61
5.2.1 問題分解 62
5.2.2 CPU與GPU的不同 63
5.2.3 任務執行模式 64
5.2.4 GPU線程 64
5.2.5 硬件初窺 66
5.2.6 CUDA內核 69
5.3 線程塊 70
5.4 線程網格 74
5.4.1 跨幅與偏移 76
5.4.2 X與Y方向的線程索引 77
5.5 線程束 83
5.5.1 分支 83
5.5.2 GPU的利用率 85
5.6 線程塊的調度 88
5.7 一個實例——統計直方圖 89
5.8 本章小結 96
第6章 CUDA內存處理 99
6.1 簡介 99
6.2 高速緩存 100
6.3 寄存器的用法 103
6.4 共享內存 112
6.4.1 使用共享內存排序 113
6.4.2 基數排序 117
6.4.3 合並列表 123
6.4.4 並行合並 128
6.4.5 並行歸約 131
6.4.6 混合算法 134
6.4.7 不同GPU上的共享內存 138
6.4.8 共享內存小結 139
6.5 常量內存 140
6.5.1 常量內存高速緩存 140
6.5.2 常量內存廣播機制 142
6.5.3 運行時進行常量內存更新 152
6.6 全局內存 157
6.6.1 記分牌 165
6.6.2 全局內存排序 165
6.6.3 樣本排序 168
6.7 紋理內存 188
6.7.1 紋理緩存 188
6.7.2 基於硬件的內存獲取操作 189
6.7.3 使用紋理的限制 190
6.8 本章小結 190
第7章 CUDA實踐之道 191
7.1 簡介 191
7.2 串行編碼與並行編碼 191
7.2.1 CPU與GPU的設計目標 191
7.2.2 CPU與GPU上的最佳算法對比 194
7.3 數據集處理 197
7.4 性能分析 206
7.5 一個使用AES的示例 218
7.5.1 算法 219
7.5.2 AES的串行實現 223
7.5.3 初始內核函數 224
7.5.4 內核函數性能 229
7.5.5 傳輸性能 233
7.5.6 單個執行流版本 234
7.5.7 如何與CPU比較 235
7.5.8 考慮在其他GPU上運行 244
7.5.9 使用多個流 248
7.5.10 AES總結 249
7.6 本章小結 249
第8章 多CPU和多GPU解決方案 252
8.1 簡介 252
8.2 局部性 252
8.3 多CPU系統 252
8.4 多GPU系統 253
8.5 多GPU算法 254
8.6 按需選用GPU 255
8.7 單節點系統 258
8.8 流 259
8.9 多節點系統 273
8.10 本章小結 284
第9章 應用程序性能優化 286
9.1 策略1:並行/串行在GPU/CPU上的問題分解 286
9.1.1 分析問題 286
9.1.2 時間 286
9.1.3 問題分解 288
9.1.4 依賴性 289
9.1.5 數據集大小 292
9.1.6 分辨率 293
9.1.7 識別瓶頸 294
9.1.8 CPU和GPU的任務分組 297
9.1.9 本節小結 299
9.2 策略2:內存因素 299
9.2.1 內存帶寬 299
9.2.2 限制的來源 300
9.2.3 內存組織 302
9.2.4 內存訪問以計算比率 303
9.2.5 循環融合和內核融合 308
9.2.6 共享內存和高速緩存的使用 309
9.2.7 本節小結 311
9.3 策略3:傳輸 311
9.3.1 鎖頁內存 311
9.3.2 零復制內存 315
9.3.3 帶寬限制 322
9.3.4 GPU計時 327
9.3.5 重疊GPU傳輸 330
9.3.6 本節小結 334
9.4 策略4:線程使用、計算和分支 335
9.4.1 線程內存模式 335
9.4.2 非活動線程 337
9.4.3 算術運算密度 338
9.4.4 一些常見的編譯器優化 342
9.4.5 分支 347
9.4.6 理解底層匯編代碼 351
9.4.7 寄存器的使用 355
9.4.8 本節小結 357
9.5 策略5:算法 357
9.5.1 排序 358
9.5.2 歸約 363
9.5.3 本節小結 384
9.6 策略6:資源競爭 384
9.6.1 識別瓶頸 384
9.6.2 解析瓶頸 396
9.6.3 本節小結 403
9.7 策略7:自調優應用程序 403
9.7.1 識別硬件 404
9.7.2 設備的利用 405
9.7.3 性能采樣 407
9.7.4 本節小結 407
9.8 本章小結 408
第10章 函數庫和SDK 410
10.1 簡介 410
10.2 函數庫 410
10.2.1 函數庫通用規范 411
10.2.2 NPP 411
10.2.3 Thrust 419
10.2.4 CuRAND 434
10.2.5 CuBLAS庫 438
10.3 CUDA運算SDK 442
10.3.1 設備查詢 443
10.3.2 帶寬測試 445
10.3.3 SimpleP2P 446
10.3.4 asyncAPI和cudaOpenMP 448
10.3.5 對齊類型 455
10.4 基於指令的編程 457
10.5 編寫自己的內核 464
10.6 本章小結 466
第11章 規划GPU硬件系統 467
11.1 簡介 467
11.2 CPU處理器 469
11.3 GPU設備 470
11.3.1 大容量內存的支持 471
11.3.2 ECC內存的支持 471
11.3.3 Tesla計算集群驅動程序 471
11.3.4 更高雙精度數學運算 472
11.3.5 大內存總線帶寬 472
11.3.6 系統管理中斷 472
11.3.7 狀態指示燈 472
11.4 PCI-E總線 472
11.5 GeForce板卡 473
11.6 CPU內存 474
11.7 風冷 475
11.8 液冷 477
11.9 機箱與主板 479
11.10 大容量存儲 481
11.10.1 主板上的輸入/輸出接口 481
11.10.2 專用RAID控制器 481
11.10.3 HDSL 483
11.10.4 大容量存儲需求 483
11.10.5 聯網 483
11.11 電源選擇 484
11.12 操作系統 487
11.12.1 Windows 487
11.12.2 Linux 488
11.13 本章小結 488
第12章 常見問題、原因及解決方案 489
12.1 簡介 489
12.2 CUDA指令錯誤 489
12.2.1 CUDA錯誤處理 489
12.2.2 內核啟動和邊界檢查 490
12.2.3 無效的設備操作 491
12.2.4 volatile限定符 492
12.2.5 計算能力依賴函數 494
12.2.6 設備函數、全局函數和主機函數 495
12.2.7 內核中的流 496
12.3 並行編程問題 497
12.3.1 競爭冒險 497
12.3.2 同步 498
12.3.3 原子操作 502
12.4 算法問題 504
12.4.1 對比測試 504
12.4.2 內存泄漏 506
12.4.3 耗時的內核程序 506
12.5 查找並避免錯誤 507
12.5.1 你的GPU程序有多少錯誤 507
12.5.2 分而治之 508
12.5.3 斷言和防御型編程 509
12.5.4 調試級別和打印 511
12.5.5 版本控制 514
12.6 為未來的GPU進行開發 515
12.6.1 開普勒架構 515
12.6.2 思考 518
12.7 后續學習資源 519
12.7.1 介紹 519
12.7.2 在線課程 519
12.7.3 教學課程 520
12.7.4 書籍 521
12.7.5 英偉達CUDA資格認證 521
12.8 本章小結 522
網路書店
類別
折扣
價格
-
新書87折$517