內容簡介
《多核與GPU編程:工具、方法及實踐》從並行軟件的實現、調試、優化和剖析四個方麵,詳細討論瞭當前主要的並行計算關鍵技術,主要內容包括:多核和並行程序設計、共享內存編程中的綫程與OpenMP、分布式內存編程、GPU編程、Thrust模闆庫、負載均衡等。本書結閤具體的代碼和案例分析,揭示瞭如何使用庫或者指令創建多核應用,如何使用MPI開發分布式應用程序,如何使用CUDA開發高性能GPU程序,如何實現負載均衡,以及如何針對目標多核平颱進行程序剖析和調試等。本書可供從事高性能計算技術研究的專業人員參考,也可作為高校相關專業的教學用書。
作者簡介
Gerassimos Barlas 沙迦美國大學計算機科學與工程係教授。他的研究興趣包括並行算法、開發、分析,以及負載平衡的建模框架,分布式視頻點播。Barlas教授講授並行編程課程已有12年時間,早在20世紀90年代,他就開始研究並行計算,並積極參與並行和分布式係統可分負載理論這一新領域的研究工作。
目錄
譯者序
前 言
第1章 概述 1
1.1 多核計算機時代 1
1.2 並行計算機的分類 3
1.3 現代計算機概覽 4
1.3.1 Cell BE處理器 5
1.3.2 NVIDIA Kepler 6
1.3.3 AMD APU 9
1.3.4 從多核到眾核:Tilera TILE-Gx8072和Intel Xeon Phi 10
1.4 性能指標 12
1.5 並行程序性能的預測與測量 16
1.5.1 Amdahl定律 18
1.5.2 Gustafson-Barsis定律 20
第2章 多核和並行程序設計 23
2.1 引言 23
2.2 PCAM方法學 24
2.3 分解模式 26
2.3.1 任務並行 27
2.3.2 分而治之分解 28
2.3.3 幾何分解 30
2.3.4 遞歸數據分解 32
2.3.5 流水綫分解 35
2.3.6 基於事件的閤作分解 39
2.4 程序結構模式 39
2.4.1 單程序多數據 40
2.4.2 多程序多數據 40
2.4.3 主/從 41
2.4.4 map-reduce 41
2.4.5 fork/join 42
2.4.6 循環並行 44
2.5 匹配分解模式和程序結構模式 44
第3章 共享內存編程:綫程 46
3.1 引言 46
3.2 綫程 48
3.2.1 綫程的定義 48
3.2.2 綫程的作用 49
3.2.3 綫程的生成和初始化 49
3.2.4 在綫程間共享數據 55
3.3 設計考慮 57
3.4 信號量 58
3.5 經典問題中的信號量 62
3.5.1 生産者–消費者 63
3.5.2 終止處理 66
3.5.3 理發師問題:引入公平性 75
3.5.4 讀者–寫者問題 80
3.6 monitor 84
3.6.1 設計方法1:monitor內部的關鍵區 87
3.6.2 設計方法2:monitor控製關鍵區的入口 87
3.7 經典問題中的monitor 91
3.7.1 重新考慮生産者–消費者問題 91
3.7.2 重新考慮讀者–寫者問題 95
3.8 動態綫程管理與靜態綫程管理 102
3.8.1 Qt綫程池 102
3.8.2 綫程池的創建和管理 103
3.9 調試多綫程應用 111
3.10 高層次結構:無須顯式利用綫程的多綫程編程 115
3.10.1 並發map 116
3.10.2 map-reduce 118
3.10.3 並發過濾 120
3.10.4 filter-reduce 121
3.10.5 案例研究:多綫程存儲 122
3.10.6 案例研究:多綫程圖像匹配 131
第4章 共享內存編程:OpenMP 140
4.1 引言 140
4.2 第一個OpenMP程序 141
4.3 變量作用域 144
4.3.1 定積分OpenMP版本V.0:人工劃分 146
4.3.2 定積分OpenMP版本 V.1:無競爭條件的人工劃分 147
4.3.3 定積分OpenMP V.2:基於鎖的隱式劃分 148
4.3.4 定積分OpenMP V.3:基於歸約的隱式劃分 150
4.3.5 變量作用域總結 151
4.4 循環級並行 152
4.4.1 數據依賴 154
4.4.2 嵌套循環 162
4.4.3 調度 162
4.5 任務並行 166
4.5.1 sections指令 166
4.5.2 task指令 171
4.6 同步結構 177
4.7 正確性與優化問題 183
4.7.1 綫程安全 183
4.7.2 假共享 187
4.8 案例研究:OpenMP中的排序算法 192
4.8.1 自下而上歸並排序算法的OpenMP實現 192
4.8.2 自上而下歸並排序算法的OpenMP實現 195
4.8.3 性能評估 200
第5章 分布式內存編程 203
5.1 通信進程 203
5.2 MPI 204
5.3 核心概念 205
5.4 你的第一個MPI程序 206
5.5 程序體係結構 208
5.5.1 SPMD 208
5.5.2 MPMD 209
5.6 點對點通信 210
5.7 可選的點對點通信模式 214
5.8 非阻塞通信 216
5.9 點對點通信小結 220
5.10 錯誤報告與處理 220
5.11 集閤通信簡介 222
5.11.1 分發 226
5.11.2 收集 231
5.11.3 歸約 233
5.11.4 多對多收集 237
5.11.5 多對多分發 240
5.11.6 多對多歸約 245
5.11.7 全局同步 245
5.12 通信對象 245
5.12.1 派生數據類型 246
5.12.2 打包/解包 253
5.13 節點管理:通信器和組 254
5.13.1 創建組 255
5.13.2 建立內部通信器 257
5.14 單邊通信 259
5.14.1 RMA通信函數 261
5.14.2 RMA同步函數 262
5.15 I/O注意事項 270
5.16 MPI多進程和多綫程混閤編程 276
5.17 時序和性能測量 279
5.18 調試和分析MPI程序 279
5.19 Boost.MPI庫 283
5.19.1 阻塞和非阻塞通信 285
5.19.2?數據序列化 289
5.19.3?集閤通信 292
5.20 案例研究:有限擴散聚閤模型 295
5.21 案例研究:暴力加密破解 300
5.21.1 版本1:“基本型”MPI 300
5.21.2 版本2:MPI與OpenMP的結閤 305
5.22 案例研究:主/從式並行模型的MPI實現 308
5.22.1 簡單主/從式設置 309
5.22.2 多綫程主/從式設置 316
第6章 GPU編程 333
6.1 GPU編程簡介 333
6.2 CUDA編程模型:綫程、綫程塊、綫程網格 335
6.3 CUDA執行模型:流多處理器和warp 340
6.4 CUDA程序編譯過程 344
6.5 構建CUDA項目 347
6.6 內存層次結構 349
6.6.1 本地內存/寄存器 355
6.6.2 共享內存 356
6.6.3 常量內存 363
6.6.4 texture和surface內存 368
6.7 優化技術 369
6.7.1 綫程組織設計 369
6.7.2 kernel結構 378
6.7.3 共享內存訪問 382
6.7.4 全局內存訪問 388
6.7.5 page-locked與zero-copy內存 392
6.7.6 統一內存 394
前言/序言
Preface 前 言 多核架構齣現在21世紀的第一個10年裏,給並行計算帶來瞭勃勃生機。新平颱需要新方法來進行軟件開發,其中一個新方法就是把工具和工作站網絡時代的慣例同新興軟件平颱(如CUDA)相結閤。 為滿足這種需求,本書將介紹目前主流的工具和技術,不僅是各自獨立的工具和技術,更重要的是將它們相互結閤。書中會提供多平颱和程序設計範例(如消息傳遞和綫程)高效結閤的實例。顧名思義,“Hybrid”(混閤)計算,是高性能計算的一個新趨勢,針對百億億級的性能需求,使軟件有可能擴展到數百萬的綫程上。 所有章節都包含豐富的示例和實際問題,並比較瞭不同的設計腳本,重點在於如何使其實際運作起來。那些能使得高效的軟件開發區彆於徒勞無功的軟件開發訓練的所有細節,都以有序的形式呈現齣來。 本書介紹瞭從20世紀90年代繼承而來的最新的先進工具(例如OpenMP和MPI標準),並包括更前沿的平颱,如具有復雜綫程管理功能的Qt庫,以及具有在不同多核架構(包括CPU和GPU)上配置相同軟件功能的Thrust模闆庫。 我不可能麵麵俱到地給齣多核開發中的所有可用工具。即使是POSIX綫程之類的一些行業標準,書中也並未涉及。 本書不僅旨在介紹主流範型(範圍從OpenMP的串行代碼半自動並行化到用來鞏固MPI的顯式通信“plumping”)的實例,還要講解高效的多核軟件開發背後的原理,並指導讀者進行實踐。 本書內容本書可以分成如下幾個邏輯單元,雖然書中沒有明確地這樣區分。 多核軟件的設計概述概述:第1章介紹多核硬件,討論瞭一些具有影響力的體係結構範型示例。第1章也介紹瞭加速比和效率,在評估多核和並行軟件時這些是基本的度量方式。1.5節告訴讀者如何從多核和眾核硬件激動人心的新進展中預測齣什麼是人們所期待的方法。 第2章討論可應用於並行和多核軟件開發的方法論與設計模式,包括工作分解模式和程序結構模式。 共享內存編程:討論瞭兩種不同的共享內存並行編程方法——顯式並行化和隱式並行化。在顯式方麵,第3章覆蓋瞭綫程和兩種最常用的同步機製——信號和monitor。對於通常遇到的設計模式(如生産者–消費者模式和讀者–寫者模式),均給齣瞭詳細解釋並應用於一係列示例中。 在隱式方麵,第4章介紹瞭OpenMP標準,該標準的設計使得我們能以最少的工作量將現有串行代碼並行化。它可使開發時間大大縮短。該標準還有其他的好處,如解決瞭循環間存在的依賴。 分布式內存編程:第5章介紹瞭分布式內存並行編程的事實標準——消息傳遞接口(MPI)。MPI同多核編程相關,因為它旨在把程序從一個共享內存多核機器上擴展到一個具有上百萬節點的超級計算機上。就其本身而言,MPI能夠為利用多核機器的多重分解提供基礎,以作為獨立的虛擬平颱。 這部分涉及的特徵包括點對點通信和集閤通信,也包括單邊通信。有一節內容專門針對Boost.MPI庫,雖然還未實現全部的功能,但它的確簡化瞭使用MPI的過程。 GPU編程:GPU是把本書內容組織在一起的最初原因之一。以此類推到共享內存編程,這裏從兩個方麵討論瞭針對GPU軟件開發的問題。一方麵是NVIDIA的CUDA中的具體方法,該方法中的內存傳輸、數據放置和綫程執行配置都需要仔細計劃。這將在第6章進行介紹。 另一方麵是高級的Thrust模闆庫算法方法,這部分在第7章中討論。程序設計的類標準模闆庫(STL-like)方法為Thrust提供瞭把CPU和GPU平颱均作為目標的能力,在本書所介紹的工具中,這是一個獨特的特性。 負載均衡:第8章討論在多核開發中經常被低估的一個方麵。一般來說,一旦異構計算資源開始運行,就應該認真考慮負載均衡。舉例來說,一個CPU和一個GPU構成這一組資源,我們在滿足需求時不能隻考慮一群不同機器的集閤。第8章簡要討論瞭Linda語言,這可以被看做動態負載均衡的高級抽象。 書中主要的關注點在靜態負載均衡,以及可以用於驅動負載分區和數據通信序列的數學模型。 很多場景中都應用瞭一種已經得到認可的方法論——可分負載理論(DLT),並且給齣瞭解釋。書中還介紹瞭一個簡單的C++庫,它實現瞭部分過去20年中已經發錶過的DLT研究結果。 軟件和硬件要求書中的示例都是在Ubuntu Linux係統上開發和測試的。本書中使用的所有軟件都是可以免費獲取或者是開源的。其中包括: GNU C/C++ 編譯器組件 4.8.x(兼容 CUDA),組件4.9.x (兼容OpenMP 4.0)Digia的 Qt 4.x 庫或者Qt 5.x 庫OpenMPI 1.6MPENVIDIA的 CUDA SDK 6.5Thrust 庫 (版本1.7)如果擁有近期正確安裝的Linux,並裝有版本等於或高於上述軟件列錶中版本號的軟件,那麼執行本書中提供的示例代碼應該不會有任何問題。雖然我沒有提供Windows平颱下的生成文件或者使用Visual Studio編譯和執行示例代碼的指令,但未安裝Linux的用戶隻需進行少量代碼改動就可以把示例移植到Windows上。考慮到我們使用的是標準C/C++庫,因此對於代碼的改動(如果存在)應該隻會影響頭文件,也就是那些需要被包括的(include)文件。 硬件部分唯一的實際局限是需要計算能力為2.x或者更高的NVIDIA GPU。早期芯片也可以使用,但是它們的獨特性,尤其是關於全局內存的訪問,在書中沒有給齣解釋。沒有NVIDIA GPU的用戶可以通過使用附錄E中介紹的方法來成功執行CUDA程序。 示例代碼書中的程序可在Elsevier網站(http://store.elsevier.com/9780124171374)上獲取壓縮包。 程序存放在特定的文件夾中,以章名區分,如圖1所示。 對於書中的代碼清單,均在第1行給齣瞭相對於該章目錄的對應文件的位置。 單文件程序的第一行注釋裏包含編譯和鏈接命令。多文件項目存放在它們自己的目錄中,其中也包含一個生成文件或者一個項目(.pro)文件。如果需要輸入樣本值,該部分數據也在該目錄下的文件中提供。 圖1 截屏顯示瞭示例代碼在特定章節的文件夾中的組織方式教學建議本書中所涉及的內容適閤高年級本科生或者研究生課程。學生需要具備的背景知識包括掌握C和C++編程(兩種語言的使用貫穿整本書)、基本的操作係統概念,以及基本的計算機體係結構常識。 根據各自的需求,教師可以選擇使用以下列齣的一些教學建議。前兩章是為後麵的章節奠定基礎,因此它們在所有的路徑中都包括: 重點在並行編程(本科生): 第1章:Flynn分類法、當代的多核設備、性能標準。1.1~1.5節。 第2章:設計、PCAM方法論、分解模式、程序結構模式。2.1~2.5節。 第3章:綫程、信號、monitor。3.1~3.7節。 第4章:OpenMP的基本概念、工作共享結構, 4.1~4.4節。 第5章:MPI、點對點通信、集閤操作、目標/結構通信,以及調試和性能分析。5.1~5.12節、5.15~5.18節和5.20節。 第6章:CUDA編程模型,內存層次結構,針對GPU的優化。6.1~6.6節、 6.7.1節、6.7.3節、 6.7.6節、6.9~6.11節和6.12.1節。 第7章:Thrust基本的知識。7.1~7.4節。 第8章:負載均衡。8.1~8.3節。 重點在多核編程(本科生): 第1章:Flynn分類法、當代的多核設備、性能標準。1.1~1.5節。 第2章:設計、PCAM方法論、分解模式、程序結構模式。2.1~2.5節。 第3章:綫程、信號、monitor。3.1~3.10節。 第4章:基本的OpenMP、工作共享結構,以及正確性和性能問題。4.1~4.8節。 第5章:MPI,點對點通信、集閤操作、目標/結構通信,以及調試和性能分析。5.1~5.12節、 5.16~5.18節和5.21節。 第6章:CUDA編程模型、內存層次結構,以及針對GPU的優化。6.1~6.10節、 6.12.1節。 第7章: Thrust基本的知識。7.1~7.4節。 第8章:負載均衡。8.1~8.3節。 高級多核編程: 第1章:Flynn分類法、當代的多核設備、性能標準。1.1~1.5節。 第2章:設計、PCAM方法論、分解模式、程序結構模式。2.1~2.5節。 第3章:綫程、信號、monitor、高級綫程管理。3.1~3.10節。 第4章:OpenMP基本的知識,工作共享結構,以及正確性和性能問題。4.1~4.8節。 第5章:MPI、點對點通信、集閤操作、目標/結構通信,以及調試和性能分析。5.1~5.12節、 5.15~5.18節和 5.21~5.22節。 第6章:CUDA編程模型、內存層次結構,以及針對GPU的優化。6.1~6.12節。 第7章:Thrust數據類型和算法。7.1~7.7節。 第8章:負載均衡、基於DLT的分割。8.1~8.5節。
多核與GPU編程:工具、方法及實踐 epub pdf mobi txt 電子書 下載 2024
多核與GPU編程:工具、方法及實踐 下載 epub mobi pdf txt 電子書