內容簡介
本書是CUDA並行程式設計領域最全面、最詳實和最具權威性的著作之一,由CUDA開發者社區技術總監親自撰寫,英偉達中國首批CUDA官方認證工程師翻譯,詳實地講解了CUDA並行程式設計的技術知識點(平台、架構、硬體知識、開發工具和熱點技術)和編程方法,包含大量實用代碼示例,實踐性非常強。
作者簡介
Shane Cook CUDA開發者社區技術總監,有20餘年行業經驗。當認識到異構系統以及CUDA對於已有串列和並行編程技術的革命性衝擊時,創立了CUDA開發者社區(歐洲的諮詢公司,專門幫助企業重構代碼以充分利用GPU硬體的威力)。他專注於高性能軟體開發、GPU利用、嵌入式系統,並參與了多個C語言編程標準的建設,包括廣泛套用於汽車軟體行業的汽車工業軟體MISRA Safer C。他常為德國汽車行業、國防承包行業、北電網路以及福特汽車公司等機構或藍籌股公司提供專業諮詢服務和軟體定製開發。
譯者:蘇統華,博士,英偉達中國首批CUDA官方認證工程師,主要研究領域包括大規模並行計算、模式識別、物聯網智慧型信息處理、智慧型媒體互動與計算等。2013年,其所開發的CUDA識別算法,在文檔分析和識別國際會議(ICDAR’ 2013)上獲得手寫漢字識別競賽的雙料冠軍。另外,他在手寫漢字識別領域建立了里程碑式的工作,論文他引300餘次;他所建立的HIT-MW庫,為全世界100多家科研院所採用;目前負責國家自然科學基金項目2項。著有英文專著《Chinese Handwriting Recognition: An Algorithmic Perspective》(德國施普林格出版社),CUDA相關譯作2本(機械工業出版社)。現任哈爾濱工業大學軟體學院高級講師、碩士生導師。
目錄
致中國讀者
譯者序
前 言
第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英偉達和CUDA12
1.10GPU硬體13
1.11CUDA的替代選擇15
1.11.1 OpenCL15
1.11.2DirectCompute16
1.11.3CPU的替代選擇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.1PC架構35
3.2GPU硬體結構39
3.3CPU與GPU41
3.4GPU計算能力42
3.4.1計算能力1.042
3.4.2計算能力1.143
3.4.3計算能力1.244
3.4.4計算能力1.344
3.4.5計算能力2.044
3.4.6計算能力2.146
第4章 CUDA環境搭建48
4.1簡介48
4.2在Windows下安裝軟體開發工具包48
4.3VisualStudio49
4.3.1工程49
4.3.264位用戶49
4.3.3創建工程51
4.4Linux52
4.5Mac55
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 按需選用GPU255
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章 函式館和SDK410
10.1 簡介410
10.2 函式館410
10.2.1 函式館通用規範411
10.2.2 NPP411
10.2.3 Thrust419
10.2.4 CuRAND434
10.2.5 CuBLAS庫438
10.3 CUDA運算SDK442
10.3.1 設備查詢443
10.3.2 頻寬測試445
10.3.3 SimpleP2P446
10.3.4 asyncAPI和cudaOpenMP448
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 HDSL483
11.10.4 大容量存儲需求483
11.10.5 聯網483
11.11 電源選擇484
11.12 作業系統487
11.12.1 Windows487
11.12.2 Linux488
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