本書由德國約翰內(nèi)斯·古騰堡大學并行和分布式架構(gòu)團隊撰寫,對并行編程的高級主題進行了深入討論,除了涵蓋基礎(chǔ)概念外,還講授了共享內(nèi)存和分布式內(nèi)存體系結(jié)構(gòu)的實用編程技巧。作者提供了一套進行自動代碼評估的開源系統(tǒng),可方便地訪問并行計算資源,這也使得本書特別適合于課堂教學。
譯者序
前言
致謝
第1章 緒論 1
1.1 一個有趣的例子及其分析 2
1.2 并行計算基礎(chǔ) 10
1.2.1 分布式內(nèi)存系統(tǒng) 10
1.2.2 共享內(nèi)存系統(tǒng) 11
1.2.3 并行程序設(shè)計需考慮的因素 13
1.3 HPC動態(tài)和排名 15
1.4 附加練習 17
第2章 理論背景 19
2.1 PRAM 20
2.1.1 PRAM變體 21
2.1.2 PRAM上的并行前綴計算 22
2.1.3 PRAM上稀疏數(shù)組的壓縮算法 24
2.2 網(wǎng)絡(luò)拓撲 25
2.3 Amdahl定律和Gustafson定律 29
2.4 Foster的并行算法設(shè)計方法學 34
2.5 附加練習 37
參考文獻 40
第3章 現(xiàn)代體系結(jié)構(gòu) 41
3.1 存儲層次 42
3.1.1 馮·諾依曼瓶頸 42
3.1.2 高速緩沖存儲器 43
3.1.3 緩存算法 44
3.1.4 優(yōu)化緩存訪問 45
3.1.5 高速緩存一致性 48
3.1.6 虛假共享 50
3.1.7 并發(fā)多線程技術(shù)和預(yù)取技術(shù) 50
3.1.8 展望 51
3.2 并行性的層次 51
3.2.1 Flynn分類法 51
3.2.2 SIMD概念 53
3.2.3 通用微處理器上的向量化 54
3.2.4 結(jié)構(gòu)體數(shù)組和數(shù)組結(jié)構(gòu)體 57
3.2.5 展望 63
3.3 附加練習 63
參考文獻 67
第4章 C++多線程編程 68
4.1 多線程編程簡介 69
4.1.1 多線程編程和多進程編程的區(qū)別 69
4.1.2 派生和并入線程 69
4.1.3 我們的第一個多線程程序 71
4.2 處理返回值 73
4.2.1 傳統(tǒng)方法 74
4.2.2 使用promise和future的現(xiàn)代方法 75
4.2.3 異步方式 80
4.3 基于靜態(tài)分發(fā)的調(diào)度機制 82
4.3.1 串行程序 83
4.3.2 線程的區(qū)塊分發(fā) 87
4.3.3 線程的循環(huán)分發(fā) 90
4.3.4 虛假共享 91
4.3.5 線程的塊循環(huán)分發(fā) 93
4.4 處理負載不平衡 95
4.4.1 靜態(tài)調(diào)度 99
4.4.2 動態(tài)塊循環(huán)分發(fā) 101
4.5 用條件變量通知線程 104
4.5.1 為一個睡覺的學生建模 105
4.5.2 使用條件變量 107
4.5.3 使用future和promise單發(fā)同步 108
4.6 隱式可數(shù)集合上的并行化 110
4.6.1 隱式可數(shù)集合 111
4.6.2 線程池用例 112
4.6.3 一個簡單線程池的實現(xiàn) 114
4.7 附加練習 119
參考文獻 121
第5章 高級C++11多線程編程 122
5.1 無鎖編程 122
5.1.1 原子計數(shù) 123
5.1.2 非基本原子數(shù)據(jù)類型 124
5.1.3 利用比較交換以原子方式并行化最大值歸約 126
5.1.4 任意原子操作 129
5.1.5 ABA問題 132
5.2 工作共享線程池 133
5.2.1 工作共享線程池的用例 133
5.2.2 工作共享的實現(xiàn) 135
5.3 并行圖搜索 137
5.3.1 二元背包問題 138
5.3.2 串行實現(xiàn) 139
5.3.3 并行實現(xiàn) 144
5.4 展望 146
5.5 附加練習 148
參考文獻 149
第6章 OpenMP 150
6.1 OpenMP簡介 151
6.1.1 OpenMP簡史 151
6.1.2 基礎(chǔ) 151
6.2 parallel for制導(dǎo)語句 153
6.2.1 向量加法 154
6.2.2 變量共享和私有化 157
6.2.3 矩陣向量乘法 160
6.3 基本的并行歸約 162
6.3.1 最近鄰分類 162
6.3.2 手寫數(shù)字數(shù)據(jù)集MNIST 163
6.3.3 完全配對距離計算的理論視角 164
6.3.4 完全配對計算的實現(xiàn) 165
6.3.5 并行標簽預(yù)測 168
6.3.6 性能評測 169
6.4 不平衡循環(huán)調(diào)度 171
6.4.1 對稱性引起的負載失衡 172
6.4.2 內(nèi)積計算實現(xiàn) 173
6.4.3 性能評測 174
6.5 高級歸約 175
6.5.1 MNIST數(shù)據(jù)集上的SOFTMAX回歸分類器 175
6.5.2 定制歸約操作符 183
6.5.3 OpenMP高級歸約 187
6.6 任務(wù)并行 189
6.6.1 樹遍歷 190
6.6.2 循環(huán)中生成任務(wù) 193
6.7 SIMD向量化 193
6.7.1 數(shù)據(jù)依賴 195
6.7.2 向量化感知函數(shù) 196
6.8 展望 196
6.9 附加練習 197
參考文獻 202
第7章 統(tǒng)一計算設(shè)備架構(gòu) 203
7.1 CUDA簡介 204
7.2 支持CUDA的GPU硬件架構(gòu) 206
7.2.1 主機與設(shè)備之間的互連 206
7.2.2 顯存和峰值寬度 207
7.2.3 計算資源的組織 207
7.3 內(nèi)存訪問模式 211
7.3.1 均值名人臉的計算 212
7.3.2 計算中心化的數(shù)據(jù)矩陣 218
7.3.3 計算協(xié)方差矩陣 221
7.3.4 計算特征臉 229
7.4 內(nèi)存層次結(jié)構(gòu) 232
7.4.1 問題簡介 233
7.4.2 串行DTW的線性內(nèi)存算法 237
7.4.3 線性內(nèi)存DTW的一個初始CUDA移植 243
7.4.4 共享內(nèi)存中的波前松弛 248
7.4.5 并發(fā)調(diào)度和bank沖突 253
7.4.6 紋理內(nèi)存和常量內(nèi)存 254
7.5 優(yōu)化準則 257
7.6 附加練習 258
參考文獻 259
第8章 高級CUDA編程 261
8.1 warp內(nèi)聯(lián)函數(shù)和原子操作 261
8.1.1 分段并行歸約 262
8.1.2 全局并行歸約 265
8.1.3 任意原子操作 267
8.1.4 展望 269
8.2 利用多塊GPU和流 269
8.2.1 牛頓迭代 269
8.2.2 利用多塊GPU 272
8.2.3 通信和計算交叉 274
8.2.4 多塊GPU上的流式計算 278
8.3 展望 280
8.3.1 統(tǒng)一內(nèi)存 280
8.3.2 動態(tài)并行性 281
8.3.3 協(xié)作組 281
8.3.4 張量核心 281
8.3.5 GPU集群上的分布式計算 282
8.4 附加練習 282
參考文獻 284
第9章 MPI 286
9.1 MPI簡介 286
9.2 基本概念 288
9.3 點到點通信 289
9.4 非阻塞通信 292
9.5 集合通信 295
9.6 計算通信重疊 300
9.7 派生數(shù)據(jù)類型 309
9.8 復(fù)雜通信域 315
9.9 展望 322
9.10 附加練習 322
參考文獻 327
第10章 統(tǒng)一并行C++ 329
10.1 PGAS和UPC++簡介 329
10.2 基本概念 331
10.3 內(nèi)存親和性和私有化 332
10.4 全局指針和集合函數(shù) 337
10.5 鎖 343
10.6 遠程函數(shù)調(diào)用 348
10.7 附加練習 355
參考文獻 357