目 錄?Contents
譯者序
前 言
第1章 概述 1
1.1 多核計算機時代 1
1.2 并行計算機的分類 3
1.3 現(xiàn)代計算機概覽 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 遞歸數(shù)據分解 32
2.3.5 流水線分解 35
2.3.6 基于事件的合作分解 39
2.4 程序結構模式 39
2.4.1 單程序多數(shù)據 40
2.4.2 多程序多數(shù)據 40
2.4.3 主/從 41
2.4.4 map-reduce 41
2.4.5 fork/join 42
2.4.6 循環(huán)并行 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 在線程間共享數(shù)據 55
3.3 設計考慮 57
3.4 信號量 58
3.5 經典問題中的信號量 62
3.5.1 生產者–消費者 63
3.5.2 終止處理 66
3.5.3 理發(fā)師問題:引入公平性 75
3.5.4 讀者–寫者問題 80
3.6 monitor 84
3.6.1 設計方法1:monitor內部的關鍵區(qū) 87
3.6.2 設計方法2:monitor控制關鍵區(qū)的入口 87
3.7 經典問題中的monitor 91
3.7.1 重新考慮生產者–消費者問題 91
3.7.2 重新考慮讀者–寫者問題 95
3.8 動態(tài)線程管理與靜態(tài)線程管理 102
3.8.1 Qt線程池 102
3.8.2 線程池的創(chuàng)建和管理 103
3.9 調試多線程應用 111
3.10 高層次結構:無須顯式利用線程的多線程編程 115
3.10.1 并發(fā)map 116
3.10.2 map-reduce 118
3.10.3 并發(fā)過濾 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 循環(huán)級并行 152
4.4.1 數(shù)據依賴 154
4.4.2 嵌套循環(huán) 162
4.4.3 調度 162
4.5 任務并行 166
4.5.1 sections指令 166
4.5.2 task指令 171
4.6 同步結構 177
4.7 正確性與優(yōu)化問題 183
4.7.1 線程安全 183
4.7.2 假共享 187
4.8 案例研究:OpenMP中的排序算法 192
4.8.1 自下而上歸并排序算法的OpenMP實現(xiàn) 192
4.8.2 自上而下歸并排序算法的OpenMP實現(xiàn) 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 分發(fā) 226
5.11.2 收集 231
5.11.3 歸約 233
5.11.4 多對多收集 237
5.11.5 多對多分發(fā) 240
5.11.6 多對多歸約 245
5.11.7 全局同步 245
5.12 通信對象 245
5.12.1 派生數(shù)據類型 246
5.12.2 打包/解包 253
5.13 節(jié)點管理:通信器和組 254
5.13.1 創(chuàng)建組 255
5.13.2 建立內部通信器 257
5.14 單邊通信 259
5.14.1 RMA通信函數(shù) 261
5.14.2 RMA同步函數(shù) 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?數(shù)據序列化 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實現(xiàn) 308
5.22.1 簡單主/從式設置 309
5.22.2 多線程主/從式設置 316
第6章 GPU編程 333
6.1 GPU編程簡介 333
6.2 CUDA編程模型:線程、線程塊、線程網格 335
6.3 CUDA執(zhí)行模型:流多處理器和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 優(yōu)化技術 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 統(tǒng)一內存 394