CUDA 並行程序設計 : GPU 編程指南 (CUDA Programming: A Developer's Guide to Parallel Computing with GPUs) CUDA并行程序设计:GPU编程指南

庫克 (Shane Cook)

買這商品的人也買了...

商品描述

<內容簡介>

CUDA並行程序設計(GPU編程指南)》是CUDA並行程序設計領域最全面、最詳實和最具權威性的著作之一,由CUDA開發者社區技術總監庫克親自撰寫,英偉達中國首批CUDA官方認證工程師翻譯,詳實地講解了CUDA並行程序設計的技術知識點(平臺、架構、硬件知識、開發工具和熱點技術)和編程方法,包含大量實用代碼示例,實踐性非常強。
    CUDA並行程序設計(GPU編程指南)》共分為12章。第1章從宏觀上介紹流處理器演變歷史。第2章詳解GPU並行機制,深入理解串行與並行程序,以辯證地求解問題。第3章講解CUDA設備及相關的硬件和體系結構,以實現最優CUDA程序性能。第4章介紹CUDA開發環境搭建和可用調試環境。第5章介紹與CUDA編程緊密相關的核心概念——網格、線程塊與線程,並通過示例說明線程模型與性能的關係。第6章借助實例詳細講解了不同類型內存的工作機制,並指出實踐中容易出現的誤區。第7章細述多任務的CPUGPU協同,並介紹多個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英偉達和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.3 VisualStudio49 
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