多核與GPU編程:工具、方法及實踐 | 生病了怎麼辦 - 2024年11月
多核與GPU編程:工具、方法及實踐
本書從並行軟件的實現、調試、優化和剖析四個方面,詳細討論了當前主要的並行計算關鍵技術,主要內容包括:多核和並行程序設計、共享內存編程中的線程與 OpenMP、分布式內存編程、GPU編程、Thrust模板庫、負載均衡等。本書結合具體的代碼和案例分析,揭示了如何使用庫或者指令創建多核應用,如 何使用MPI開發分布式應用程序,如何使用CUDA開發高性能GPU程序,如何實現負載均衡,以及如何針對目標多核平台進行程序剖析和調試等。本書可供從 事高性能計算技術研究的專業人員參考,也可作為高校相關專業的教學用書。Gerassimos Barlas 沙迦美國大學計算機科學與工程系教授。他的研究興趣包括並行算法、開發、分析,以及負載平衡的建模框架,分布式視頻點播。Barlas教授講授並行編程課 程已有12年時間,早在20世紀90年代,他就開始研究並行計算,並積極參與並行和分布式系統可分負載理論這一新領域的研究工作。
譯者序前言第1章概述11.1多核計算機時代11.2並行計算機的分類31.3現代計算機概覽41.3.1CellBE處理器51.3.2NVIDIA Kepler61.3.3AMD APU91.3.4從多核到眾核:Tilera TILE—Gx8072和Intel Xeon Phi101.4性能指標121.5並行程序性能的預測與測量161.5.1Amdahl定律181.5.2Gustafson—Barsis定律20第2章多核和並行程序設計232.1引言232.2PCAM方法學242.3分解模式262.3.1任務並行272.3.2分而治之分解282.3.3幾何分解302.3.4遞歸數據分解322.3.5流水線分解352.3.6基於事件的合作分解392.4程序結構模式392.4.1單程序多數據402.4.2多程序多數據402.4.3主/從412.4.4map—reduce412.4.5fork/join422.4.6循環並行442.5匹配分解模式和程序結構模式44第3章共享內存編程:線程463.1引言463.2線程483.2.1線程的定義483.2.2線程的作用493.2.3線程的生成和初始化493.2.4在線程間共享數據553.3設計考慮573.4信號量583.5經典問題中的信號量623.5.1生產者—消費者633.5.2終止處理663.5.3理發師問題:引入公平性753.5.4讀者—寫者問題803.6monitor843.6.1設計方法1:monitor內部的關鍵區873.6.2設計方法2:monitor控制關鍵區的入口873.7經典問題中的monitor913.7.1重新考慮生產者–消費者問題913.7.2重新考慮讀者–寫者問題953.8動態線程管理與靜態線程管理1023.8.1Qt線程池1023.8.2線程池的創建和管理1033.9調試多線程應用1113.10高層次結構:無須顯式利用線程的多線程編程1153.10.1並發map1163.10.2map—reduce1183.10.3並發過濾1203.10.4filter—reduce1213.10.5案例研究:多線程存儲1223.10.6案例研究:多線程圖像匹配131第4章共享內存編程:OpenMP1404.1引言1404.2第一個OpenMP程序1414.3變量作用域1444.3.1定積分OpenMP版本V.0:人工划分1464.3.2定積分OpenMP版本V.1:無競爭條件的人工划分1474.3.3定積分OpenMP V.2:基於鎖的隱式划分1484.3.4定積分OpenMP V.3:基於歸約的隱式划分1504.3.5變量作用域總結1514.4循環級並行1524.4.1數據依賴1544.4.2嵌套循環1624.4.3調度1624.5任務並行1664.5.1sections指令1664.5.2task指令1714.6同步結構1774.7正確性與優化問題1834.7.1線程安全1834.7.2假共享1874.8案例研究:OpenMP中的排序算法1924.8.1自下而上歸並排序算法的OpenMP實現1924.8.2自上而下歸並排序算法的OpenMP實現1954.8.3性能評估200第5章分布式內存編程2035.1通信進程2035.2MPI2045.3核心概念2055.4你的第一個MPI程序2065.5程序體系結構2085.5.1SPMD2085.5.2MPMD2095.6點對點通信2105.7可選的點對點通信模式2145.8非阻塞通信2165.9點對點通信小結2205.10錯誤報告與處理2205.11集合通信簡介2225.11.1分發2265.11.2收集2315.11.3歸約2335.11.4多對多收集2375.11.5多對多分發2405.11.6多對多歸約2455.11.7全局同步2455.12通信對象2455.12.1派生數據類型2465.12.2打包/解包2535.13節點管理:通信器和組2545.13.1創建組2555.13.2建立內部通信器2575.14單邊通信2595.14.1RMA通信函數2615.14.2RMA同步函數2625.15I/O注意事項2705.16MPI多進程和多線程混合編程2765.17時序和性能測量2795.18調試和分析MPI程序2795.19Boost.MPI庫2835.19.1阻塞和非阻塞通信2855.19.2?數據串行化2895.19.3?集合通信2925.20案例研究:有限擴散聚合模型2955.21案例研究:暴力加密破解3005.21.1版本1:「基本型」MPI3005.21.2版本2:MPI與OpenMP的結合3055.22案例研究:主/從式並行模型的MPI實現3085.22.1簡單主/從式設置3095.22.2多線程主/從式設置316第6章GPU編程3336.1GPU編程簡介3336.2CUDA編程模型:線程、線程塊、線程網格3356.3CUDA執行模型:流多處理器和warp3406.4CUDA程序編譯過程3446.5構建CUDA項目3476.6內存層次結構3496.6.1本地內存/寄存器3556.6.2共享內存3566.6.3常量內存3636.6.4texture和surface內存3686.7優化技術3696.7.1線程組織設計3696.7.2kernel結構3786.7.3共享內存訪問3826.7.4全局內存訪問3886.7.5page—locked與zero—copy內存3926.7.6統一內存3946.7.7異步執行和流3976.8動態並行4036.9CUDA程序的調試4076.10CUDA程序剖析4106.11CUDA和MPI4126.12案例研究4176.12.1分形集合計算4176.12.2塊加密算法426第7章Tlarust模板庫4527.1引言4527.2使用Thrust的第一步4537.3Thrust數據類型4567.4Thrust算法4597.4.1變換算法4607.4.2排序與查詢4637.4.3歸約4687.4.4scan/前綴和4717.4.5數據管理與處理4727.5花式迭代器4757.6交換設備后端4807.7案例研究4817.7.1蒙特卡洛積分4817.7.2DNA序列比對485第8章負載均衡4938.1引言4938.2動態負載均衡:Linda的遺贈4948.3靜態負載均衡:可分負載理論方法4958.3.1建模開銷4968.3.2通信設置5028.3.3分析5038.3.4總結:簡短的文獻綜述5108.4DLTlib:分割工作負載的庫5138.5案例研究5168.5.1Mandelbrot集「電影」的混合計算:動態負載均衡案例研究5168.5.2分布式塊加密:靜態負載均衡案例研究526在線資源附錄A編譯Qt程序附錄B運行MPI程序:准備與配置步驟附錄C測量時間附錄DBoost.MPI附錄ECUDA環境搭建附錄FDLTlib術語表參考文獻