內容簡介
本書以使用說明的形式對當今主流的並行編程模型進行瞭詳細描述,內容包括分布式內存架構上常見的MPI(消息傳遞接口)編程模型;單邊通信模型,範圍從低層的運行時庫(GASNet、OpenSHMEM)到高層的編程模型(UPC、GA、Chapel);麵嚮任務的編程模型,包括Charm++、ADLB、Scioto、Swift、CnC,由運行時係統來管理計算和數據移動;麵嚮節點內並行(多核架構以及附帶加速器)的並行編程模型,包括OpenMP、CilkPlus、TBB、CUDA以及OpenCL。每章配備大量應用和程序實例,可以使讀者很好地理解各種編程模型所提供的功能及特點。本書可作為高等院校並行編程課程的研究生教材,也可作為具有一定並行編程經驗的軟件開發人員、科研人員以及任何與數據集及大規模計算打交道的科學傢的參考資料。
目錄
齣版者的話
譯者序
前言
第1章 消息傳遞接口 1
1.1 引言 1
1.2 MPI基礎 1
1.3 點對點通信 2
1.4 數據類型 3
1.5 非阻塞式通信 4
1.6 聚閤通信 5
1.7 單邊通信 7
1.8 並行I/O 9
1.9 其他特性 11
1.10 MPI開發心得 12
1.11 總結 13
第2章 全局地址空間網絡 14
2.1 研究背景與動機 14
2.2 GASNet概述 14
2.2.1 相關術語 15
2.2.2 綫程 15
2.2.3 API組織 16
2.3 核心API 16
2.3.1 開始和結束 16
2.3.2 段信息 18
2.3.3 屏障 18
2.3.4 鎖與中斷 19
2.3.5 活動消息 20
2.3.6 活動消息進程 22
2.3.7 活動消息規則與約束 22
2.3.8 齣錯代碼 23
2.4 擴展API 23
2.4.1 GASNet段 23
2.4.2 排序與內存模型 24
2.4.3 阻塞與非阻塞 24
2.4.4 批量與單個 24
2.4.5 寄存器–內存與遠程memset操作 24
2.4.6 擴展API總結 25
2.5 附加內容 26
2.5.1 GASNet工具 26
2.5.2 可移植平颱頭文件 27
2.6 示例 27
2.6.1 編譯和運行示例 27
2.6.2 Hello World示例 28
2.6.3 AM Ping-Pong示例 28
2.6.4 AM Ring示例 30
2.6.5 MCS Locks示例 32
2.7 未來方嚮 35
第3章 OpenSHMEM 37
3.1 引言 37
3.2 設計理念和根據 37
3.3 OpenSHMEM存儲模型 39
3.4 對稱堆管理 39
3.4.1 初始化和查詢 40
3.4.2 分配和釋放 40
3.4.3 關於分配和對稱堆的說明 41
3.5 遠程內存訪問:put和get 41
3.5.1 RMA函數語義 41
3.5.2 RMA函數使用 42
3.6 排序和同步 44
3.6.1 全局同步屏障 44
3.6.2 fence和quiet:RMA操作排序 45
3.6.3 鎖 46
3.6.4 wait和wait_until 46
3.7 集閤操作 47
3.7.1 選擇集閤參與者 47
3.7.2 同步數組和工作數組 47
3.7.3 非全局同步屏障 48
3.7.4 廣播 48
3.7.5 收集 49
3.7.6 歸約 50
3.8 原子內存操作 51
3.8.1 原子加和遞增 52
3.8.2 原子取–加和取–遞增 52
3.8.3 原子交換和條件交換 53
3.9 未來方嚮 54
第4章 統一並行C 55
4.1 UPC簡史 55
4.2 UPC編程模型 56
4.2.1 術語 56
4.2.2 全局地址空間 56
4.2.3 執行模型 57
4.3 UPC概覽 57
4.3.1 自省 57
4.3.2 數據布局 57
4.3.3 通信 59
4.3.4 UPC內存一緻性模型 60
4.3.5 同步 61
4.3.6 集閤操作 62
4.4 UPC程序示例 63
4.4.1 隨機訪問基準 63
4.4.2 雅可比5點stencil 64
4.4.3 排序示例 65
4.4.4 一維FFT 68
4.5 未來方嚮 71
第5章 全局數組 72
5.1 引言 72
5.2 編程模型與設計原則 73
5.3 核心功能 74
5.4 進程組 77
5.5 擴展的數組結構 78
5.6 稀疏數組操作的支持 79
5.7 數組上的集閤操作 80
5.8 動態負載均衡 80
5.9 實際應用 80
第6章 Chapel 82
6.1 Chapel簡史 82
6.1.1 全麵啓動 82
6.1.2 初始方嚮 83
6.1.3 HPCS時代 83
6.1.4 後HPCS時代 84
6.2 Chapel的主題思想 84
6.2.1 通用並行性錶達 84
6.2.2 支持多綫程執行模型 85
6.2.3 支持全局視圖編程 85
6.2.4 支持多尺度設計 85
6.2.5 支持局部性控製 86
6.2.6 支持以數據為中心的同步 86
6.2.7 用戶與編譯器的不同角色 86
6.2.8 縮小主流語言和HPC語言之間的差距 87
6.2.9 從頭開始(但爭取令人熟悉) 87
6.2.10 遠大目標 88
6.2.11 促使Chapel成為可移植的開源軟件 88
6.3 Chapel特性概述 88
6.3.1 基本語言特性 89
6.3.2 任務並行 92
6.3.3 數據並行 96
6.3.4 位置特性 98
6.4 總結與未來方嚮 100
第7章 Charm++ 102
7.1 引言 102
7.2 Charm的編程範例以及執行模型 102
7.2.1 以過分解作為核心思想 102
7.2.2 消息驅動的執行模型 103
7.2.3 授權自適應運行時係統 104
7.3 基本語言 104
7.3.1 chare:分解的基本單元 104
7.3.2 入口方法:基本的調度單元 105
7.3.3 異步方法調用 105
7.3.4 帶索引的chare集閤:chare數組 105
7.3.5 隻讀變量 106
7.3.6 Charm++對象:用戶及係統角度 107
7.3.7 結構化匕首符號 108
7.3.8 示例:一維分解的5點stencil代碼 108
7.4 過分解的好處以及消息驅動執行 110
7.4.1 不依賴於處理器個數 110
7.4.2 異步歸約 110
7.4.3 自適應計算與通信重疊 110
7.4.4 閤成性 111
7.4.5 軟件工程方麵的好處:邏輯實體的相互獨立 111
7.5 一個設計示例:分子動力學模擬 111
7.6 自適應運行時特性 112
7.6.1 Charm++中負載均衡功能 112
7.6.2 容錯 113
7.6.3 縮小或擴展處理器集閤 114
7.6.4 異構處理器以及加速器的支持 115
7.6.5 額外特性 115
7.6.6 實驗特性:熱能與功耗管理 115
7.7 底層架構概述 115
7.8 基於Charm++的高層次語言傢族 116
7.9 通過Charm++來開發應用程序 117
7.10 作為研究工具的Charm++ 118
7.11 Charm++:曆史以及現狀 118
7.12 總結 118
第8章 異步動態負載均衡 119
8.1 引言 119
8.2 manager-worker模型與負載均衡 119
8.3 ADLB庫定義 121
8.3.1 API簡介 121
8.3.2 基本的ADLB API 122
8.3.3 使用批處理優化內存使用 123
8.3.4 獲取和使用ADLB 124
8.4 實現ADLB 124
8.4.1 ADLBM實現 124
8.4.2 其他實現 125
8.5 示例 125
8.5.1 一個簡單的批處理調度 125
8.5.2 動態任務創建:數獨解法 126
8.5.3 任務單元類型:旅行推銷員問題 127
8.5.4 GFMC 127
8.5.5 Swift 128
8.6 DMEM:一個處理大數據的輔助庫 128
8.7 總結與未來方嚮 129
第9章 可拓展任務對象集閤 130
9.1 Scioto任務並行執行模型 131
9.1.1 任務對象 131
9.1.2 任務輸入/輸齣模型 132
9.1.3 任務執行模型 132
9.2 多級並行任務集閤 133
9.3 Scioto + GA編程接口 134
9.3.1 核心編程結構 134
9.3.2 實現一個Scioto任務 135
9.3.3 示例:矩陣–矩陣乘法 135
9.4 Scioto運行時係統 136
9.4.1 共享任務隊列方法 136
9.4.2 動態負載均衡方法 137
9.4.3 終止檢測 137
9.5 總結 138
第10章 Swift:極端規模的隱式並行腳本 139
10.1 第一個示例:並行因式分解 140
10.2 一個真實的示例:晶體坐標轉換 140
10.3 Swift發展曆史 142
10.4 Swift語言和編程模型 142
10.4.1 Hello World示例 143
10.4.2 變量和標量數據類型 143
10.4.3 數據流執行 144
10.4.4 條件判斷語句 145
10.4.5 數據依賴控製流 145
10.4.6 foreach循環和數組 145
10.4.7 Swift函數 146
10.4.8 外部函數 147
10.4.9 文件和app函數 148
10.5 Swift執行模型 148
10.6 大規模並行運行時係統 150
10.7 運行時架構 151
10.8 性能分析 153
10.9 Swift的大規模並行編譯 153
10.10 相關工作 154
10.11 總結 155
第11章 並發集閤編程模型 157
11.1 引言 157
11.2 研究動機 158
11.3 CnC領域語言 158
11.3.1 概述 158
11.3.2 特徵 160
11.3.3 示例 161
11.3.4 執行語義 162
11.3.5 CnC編程 163
11.3.6 未來工作 167
11.4 CnC調優語言 168
11.4.1 描述 168
11.4.2 特徵 171
11.4.3 示例 171
11.4.4 執行模型 173
11.4.5 未來工作 175
11.5 當前狀態 175
11.6 相關工作 175
11.7 總結 177
第12章 OpenMP 178
12.1 引言 178
12.2 概述 179
12.2.1 術語 179
12.2.2 管理數據環境 180
12.2.3 OpenMP概念簡述 181
12.3 OpenMP特性 182
12.3.1 並行區域 182
12.3.2 同步 186
12.3.3 工作共享 187
12.3.4 任務並行化 191
12.3.5 嚮量化 195
12.3.6 加速器支持 196
12.3.7 區域取消 199
12.4 性能優化建議 200
12.5 關於正確性的思考 201
12.6 總結與未來方嚮 201
第13章 Cilk Plus 202
13.1 引言 202
13.2 嚮量並行化 203
13.2.1 數組標注 204
13.2.2 pragma SIMD 205
13.2.3 支持SIMD的函數 206
13.3 綫程並行 208
13.4 並行性能 211
13.5 數據競爭 215
13.6 實踐技巧 216
13.7 曆史 219
13.8 總結 220
第14章 Intel TBB工具 221
14.1 引言 221
14.1.1 概述 221
14.1.2 基本信息 221
14.2 泛型並行算法 222
14.2.1 簡單循環的並行化 222
14.2.2 在STL容器中處理數據 223
14.2.3 復雜迭代空間 224
14.2.4 其他算法 226
14.3 流圖 226
14.3.1 概述 227
14.3.2 節點通信協議 227
14.3.3 控製依賴圖 228
14.3.4 數據流圖 230
14.3.5 流圖、算法和無環圖的選擇 232
14.4 總結 232
第15章 CUDA 233
15.1 CUDA簡史 233
15.2 CUDA編程結構 234
15.3 示例:嚮量加法 235
15.4 設備內存和數據傳輸 236
15.5 kernel函數與綫程 238
15.6 綫程組織 240
15.7 綫程和多維數據的映射 242
15.8 同步與透明可擴展性 243
15.9 綫程塊的資源分配 244
15.10 CUDA流與任務並行 244
15.11 總結 248
第16章 OpenCL開放計算語言 249
16.1 計算語言與OpenCL 249
16.2 基本定義 250
16.3 計算機、編程和異構 250
16.4 OpenCL的誕生 251
16.5 OpenCL的核心模型 252
16.5.1 平颱模型 252
16.5.2 執行模型 253
16.5.3 內存模型 255
16.5.4 編程模型 257
16.6 OpenCL主機程序:嚮量加法 258
16.7 總結 266
參考文獻 268
精彩書摘
《並行計算的編程模型》:
絕大多數OpenMP指令與代碼域有著明確的關係,通常後麵為結構塊動態區域或者循環嵌套。一些指令(barrier和flush)沒有響應的代碼。一些特性影響綫程的行為和使用。因此,采用瞭一種綁定綫程集的想法。特彆是,一些運行庫函數對調用綫程有影響(或者隻返迴信息給調用綫程),而其他運行庫函數與一個綫程組或者程序運行的全部綫程有關聯。本節將隻討論一些重要的和難理解的綁定問題。
12.2.2管理數據環境
OpenMP程序中的每個任務擁有自身的數據環境,數據環境中包含所有使用的變量。該變量可以是在應用中聲明並對任務區域可見的,也可以是OpenMP實現所使用的內部控製變量(ICV)。數據環境中的變量可以是共享(shared)或者私有(private)類型。共享變量可被當前綫程組中綫程的所有任務訪問,或者被一簇綫程中的一組綫程訪問。私有變量是在並行域中的一個綫程或者一簇綫程中一組綫程的本地拷貝。另一種變量類型為綫程私有(threadprivate),該類型存在於主機設備中特殊綫程的靜態內存上並且隻被該綫程上執行的任務訪問。在目標設備上訪問綫程私有變量是被禁止的。
……
前言/序言
對於正在編程的程序員,編程模型可被看作一颱虛擬機,並可通過編程語言和函數庫實現。如果某個編程模型成為計算機科學研究中的熱點,需要具有以下特性:高效性(易於描述各種抽象算法)、移植性(兼容各種硬件計算平颱)、高性能(高效均衡地利用硬件平颱的計算能力)、通用性(廣泛地描述各種算法)。針對特定的編程模型,同時具有上述四種特性中的一種或兩種相對容易,但同時具備這四種特性幾乎是不可能的。特定的編程模型無法同時具備四種特性的主要原因在於編程模型的多樣性,因此需要根據具體的科學應用,選擇不同的編程模型特性。
隨著並行計算技術的發展,計算機科學領域的專傢將研究重點轉移到能夠適應高性能並行計算和超級計算係統的編程模型設計方嚮。並行編程模型包含執行模型(選擇代碼執行路徑)和內存模型(管理計算節點間和節點內的數據流)。多核計算需要並發計算和移動數據,這增加瞭程序運行結果和性能的不確定性,導緻並行編程模型變得更加復雜。
從技術上分析,編程模型和編程係統間存在一定區彆。編程模型是一種編程方式,例如采用大量同步或者隱含編譯器協助的並行化方式,而編程係統指程序員編寫程序時實際使用的係統抽象接口。隨著時間推移,編程模型和編程係統間的區彆逐漸變得模糊。目前,編程模型既是一種編程方式,也是模型實例化過程中所使用的係統抽象接口。
與通用的編程模型設計不同,在大多數並行係統中,程序開發人員往往不采用單一的並行編程模型。不同的開發人員會選擇不同層次的虛擬化方式,並在高效性、移植性、高性能和通用性四種編程模型特性中選擇不同的組閤。針對麵嚮終端的程序開發應用,具體研究領域的科學傢通常傾嚮於選擇更高效和高級彆的編程模型,即使該編程模型隻能針對特定的算法而缺乏通用性。針對編程語言和函數庫,程序開發者一般更傾嚮於選擇高性能和低級彆的編程模型,即使該編程模型具有較高的使用難度。然而,針對麵嚮終端的程序應用以及編程語言和函數庫開發,上述編程模型選擇並非是絕對的,可根據實際的開發應用情況進行調整。
關於本書 本書對當今高性能計算以及超級計算係統上的幾種最主要的並行編程模型進行瞭概述。書中包含多種並行編程模型,它們擁有不同的生産效率、可移植性、性能以及錶達範圍。因此,讀者可以學習和理解每種編程模型提供瞭哪些摺中。
第1章討論瞭消息傳遞接口(MPI)。MPI是當今麵嚮分布式內存計算的最重要的並行編程模型。該章對MPI最常用的功能進行瞭概述,並涉及MPI標準的第三個主要版本 ——MPI-3。
第2~5章從低層次的運行時庫到高層次的編程模型,對單邊通信模型進行瞭討論。第2章介紹瞭全局地址空間網絡(GASNet),它是一種低層次的編程模型,用於多種分區全局地址空間(PGAS)模型的一種通用可移植運行時係統。第3章討論瞭OpenSHMEM單邊通信庫,它用於嚮用戶直接呈現本地硬件通信功能。OpenSHMEM通過擴展庫的形式模擬瞭許多PGAS模型的功能,這樣做的好處是不依賴於語言擴展及相應的編譯器支持。第4章提供瞭Unified Parallel C(UPC)編程模型的概述。UPC是基於C語言的PGAS模型,它為全局地址空間內存的創建與管理提供瞭
並行計算的編程模型 下載 mobi epub pdf txt 電子書 格式