並行編程原理與程序設計
《並行編程原理與程序設計》,何兵壽,宋鵬,劉穎 著,出版社: 科學出版社(中國)。
書籍是全世界的營養品。生活里沒有書籍,就好像沒有陽光;智慧[1]里沒有書籍,就好像鳥兒沒有翅膀。——莎士比亞[2]
目錄
內容簡介
本書主要介紹目前#常用的幾種並行程序設計思路與方法,主要內容包括並行計算基礎、OpenMP並行程序設計簡介、MPI並行程序設計、CUDA並行程序設計及求解聲波方程的並行程序五個部分。其中OpenMP對應共享內存的CPU並行編程,MPI對應消息傳遞的CPU並行編程,CUDA對應GPU編程。因此,通過對本書的學,可以掌握目前#常用的幾種並行編程方法。
目錄
前言
一篇 並行計算基礎
第1章 並行計算機硬件基礎 3
1.1 並行計算 3
1.1.1 並行計算的概念 3
1.1.2 並行計算與計算科學 3
1.1.3 當代科學與工程問題的計算需求 4
1.2 並行計算機硬件簡介 4
1.2.1 並行計算機的發展歷史 4
1.2.2 並行計算機的分類 8
1.2.3 並行計算機的體系結構 9
1.3 當代並行計算機系統簡介 14
1.3.1 共享存儲多處理機系統 15
1.3.2 分布存儲多處理機系統 15
1.3.3 集群系統 17
1.4 並行計算機的一些基本性能指標 24
1.4.1 CPU和存儲器的某些性能指標 24
1.4.2 通信開銷 25
1.4.3 機器的成本、價格與性#價比 26
第2章 並行程序設計基礎 28
2.1 並行算法的基礎知識 28
2.1.1 並行算法領域的一些基本概念 28
2.1.2 並行程序開發策略與並行算法的描述方法 30
2.1.3 並行算法中的同步與通信 31
2.2 並行程序設計模型 32
2.2.1 計算π的樣本程序 32
2.2.2 數據並行模型 33
2.2.3 消息傳遞模型 34
2.2.4 共享變量模型 36
2.3 並行程序設計方法 38
2.3.1 PCAM並行程序設計思路 38
2.3.2 並行編程語言 41
第二篇 OpenMP並行程序設計簡介
第3章 OpenMP介紹 55
3.1 什麼是OpenMP 55
3.2 共享內存式並行計算 55
3.3 OpenMP的發展歷程 56
3.4 Windowsping台下OpenMP環境搭建 56
第4章 OpenMP指令結構 59
4.1 編譯指導語句的一般形式 59
4.2 主要指令 60
4.3 主要子句 61
4.4 常用庫函數 62
第5章 OpenMP常用指令的用法 63
5.1 數據管理 63
5.1.1 Private子句 63
5.1.2 Firstprivate/Lastprivate子句 64
5.1.3 Shared子句 65
5.1.4 Default子句 66
5.1.5 Threadprivate子句 67
5.1.6 Copyin、copyprivate子句 68
5.1.7 Reduction子句 69
5.2 並行控制 70
5.2.1 Parallel指令 70
5.2.2 For指令 75
5.2.3 Schedule子句 76
5.2.4 Sections指令 80
5.2.5 Single指令 82
5.3 同步管理 82
5.3.1 Critical指令 83
5.3.2 Atomic指令 84
5.3.3 Barrier指令 85
5.3.4 Ordered指令 86
5.3.5 Master指令 86
5.3.6 Flush指令 87
5.4 常用庫函數 87
5.4.1 運行時庫函數 87
5.4.2 鎖管理 88
5.4.3 環境變量 90
第6章 OpenMP實例 91
6.1 循環實例 91
6.2 並行程序的優化 93
6.2.1 臨界區實現 93
6.2.2 原子操作實現 95
6.2.3 歸約實現 95
6.3 快速排序並行算法 96
第三篇 MPI並行程序設計
第7章 MPI編程基礎 103
7.1 MPI簡介 103
7.1.1 MPI的含義 103
7.1.2 MPI的目標 103
7.1.3 MPI的產生 103
7.1.4 MPI的語言綁定 104
7.1.5 目前MPI的主要實現 104
7.2 一個簡單的MPI程序 105
7.2.1 MPI實現的「Hello World!」 105
7.2.2 MPI程序的框架結構 109
7.2.3 MPI程序的一些慣例 109
7.3 6個基本函數組成的MPI子集 109
7.3.1 子集介紹 109
7.3.2 MPI預定義的數據類型 114
7.3.3 MPI數據類型匹配 115
7.3.4 MPI消息 117
7.4 簡單的MPI程序示例 118
7.4.1 求二維數據中各元素絕#對值的#大值 119
7.4.2 用MPI實現計時功能 121
7.4.3 獲取機器名字與MPI版本號 123
7.4.4 是否初始化及錯誤退出 124
7.4.5 環形消息傳遞 125
7.4.6 所有進程相互問候 126
7.4.7 任意源和任意標識的使用 128
7.4.8 編寫安全的MPI程序 129
第8章 MPI的安裝與並行編程環境的設置 132
8.1 Linux環境下的MPICH2安裝與設置 132
8.2 Windows環境下MPICH2的安裝與設置 133
8.2.1 安裝 133
8.2.2 編譯運行C+MPI程序 134
8.2.3 編譯運行Fortran+MPI程序 138
第9章 對等模式與主從模式的MPI程序設計 141
9.1 對等模式MPI程序設計 141
9.1.1 問題描述——雅可比迭代 141
9.1.2 用MPI程序實現雅可比迭代 142
9.1.3 採用捆綁發送接收實現雅可比迭代 146
9.1.4 引入虛擬進程後雅可比迭代的實現 151
9.2 主從模式MPI程序設計 155
9.2.1 矩陣向量乘 155
9.2.2 主進程打印各從進程的消息 159
第10章 MPI的四種通信模式 162
10.1 標準通信模式 162
10.2 緩存通信模式 163
10.3 同步通信模式 165
10.4 就緒通信模式 167
第11章 MPI的非阻塞通信 170
11.1 非阻塞通信簡介 170
11.1.1 阻塞通信 170
11.1.2 非阻塞通信 171
11.2 非阻塞標準發送與接收 173
11.3 非阻塞通信與其他三種通信模式的結合 174
11.4 非阻塞通信的完成與檢測 175
11.4.1 單個非阻塞通信的完成與檢測 175
11.4.2 多個非阻塞通信的完成與檢測 176
11.5 非阻塞通信對象 178
11.5.1 非阻塞通信的取消 179
11.5.2 非阻塞通信對象的釋放 180
11.5.3 消息到達的檢查 181
11.5.4 用非阻塞通信來實現雅可比迭代 182
11.6 重複非阻塞通信 185
第12章 MPI的組通信調用 190
12.1 組通信概述 190
12.2 組通信的通信功能 191
12.2.1 廣播 191
12.2.2 收集 192
12.2.3 散發 196
12.2.4 組收集 199
12.2.5 全互換 201
12.3 組通信的同步功能 204
12.4 組通信的計算功能 205
12.4.1 歸約 205
12.4.2 MPI的內置歸約算符 206
12.4.3 程序舉例 207
12.4.4 組歸約 209
12.4.5 歸約並散發 211
12.4.6 掃描 212
12.4.7 不同類型歸約操作的對比 213
12.4.8 MINLOC和MAXLOC 215
12.4.9 用戶自定義的歸約操作 216
第13章 MPI的派生數據類型 220
13.1 類型圖 220
13.2 新數據類型的定義 221
13.2.1 MPI提供的數據類型生成器 221
13.2.2 新類型遞交和釋放 226
13.2.3 地址函數 227
13.2.4 與數據類型有關的調用 228
13.2.5 下界類型和上界類型 231
13.3 例題 232
13.4 打包與解包 236
第14章 MPI的進程組和通信域 239
14.1 簡介 239
14.2 進程組和通信域的管理 239
14.2.1 MPI的進程組管理接口 240
14.2.2 通信域的管理 245
14.3 組間通信域 250
第15章 MPI擴展 255
15.1 MPI的動態進程管理 255
15.1.1 組間通信域 255
15.1.2 動態進程的創建 257
15.1.3 獨立進程間的通信 260
15.1.4 基於socket的通信 263
15.2 MPI的遠程存儲訪問 263
15.2.1 窗口創建與窗口操作 264
15.2.2 窗口同步管理 267
15.3 並行I/O 275
15.3.1 並行文件管理的基本操作 276
15.3.2 顯式指定偏移量的並行文件讀寫 279
15.3.3 多視口的並行文件並行讀寫 283
15.3.4 共享文件指針讀寫 291
第16章 MPI函數調用原型與簡單解釋 297
16.1 MPI-1與C語言的接口 297
16.2 MPI-1與Fortran語言的接口 305
16.3 MPI-2與C語言的接口 314
16.4 MPI-2與Fortran語言的接口 324
第四篇 CUDA並行程序設計
第17章 GPU簡介 339
17.1 NVIDIA GPU發展簡介 339
17.2 GPU硬件架構 340
17.2.1 圖形顯卡概覽 340
17.2.2 PCI-E總線 341
17.2.3 顯存 342
17.2.4 GPU芯片 343
17.3 基於GPU的程序開發 344
17.3.1 傳統GPU開發 344
17.3.2 CUDA開發 344
第18章 CUDA安裝與編譯 346
18.1 CUDA函數庫與CUDA C++語言 346
18.1.1 CUDA API和函數庫 346
18.1.2 CUDA C++語言 347
18.1.3 CUDA C++拓展限定符語法 348
18.2 CUDA的安裝與配置 351
18.2.1 開發環境 351
18.2.2 安裝ping台 354
18.2.3 CUDA安裝與配置 355
18.3 CUDA編譯與驅動 357
18.3.1 Emu調試 357
18.3.2 編譯相關 358
18.3.3 錯誤處理 359
18.3.4 計算模式 359
第19章 CUDA編程基礎 360
19.1 主機與設備 360
19.2 核函數的定義與調用 362
19.3 設備中的空間管理與數據傳輸 363
19.4 線程結構 365
19.5 硬件映射 370
19.5.1 計算單元 370
19.5.2 Warp 372
19.5.3 執行模型 372
19.6 存儲器類型 373
19.6.1 寄存器 374
19.6.2 局部存儲器 375
19.6.3 共享存儲器 376
19.6.4 全局存儲器 377
19.6.5 常數存儲器 380
19.6.6 紋理存儲器 382
19.7 CUDA通信機制 387
19.7.1 Block內通信與同步機制 387
19.7.2 同步函數 389
19.7.3 Volatile關鍵字 393
19.7.4 ATOM操作 394
19.7.5 VOTE操作 395
第20章 CUDA程序優化 396
20.1 任務劃分 396
20.2 Grid和block維度設計 397
20.3 存儲器訪問優化 400
20.3.1 全局存儲器訪問優化 400
20.3.2 共享存儲器訪問優化 402
20.3.3 使用紋理存儲器和常數存儲器加速 405
20.4 異步並行執行 405
20.4.1 簡單異步函數使用 405
20.4.2 基於流的異步並行 406
第21章 CUDA與多設備集群 409
21.1 CUDA的設備控制 409
21.2 多設備並行 410
21.2.1 CUDA與MPI 411
21.2.2 CUDA與OpenMP 413
第五篇 求解聲波方程的並行程序
第22章 聲波方程有限差分正演模擬的並行實現 419
22.1 聲波方程有限差分模擬算法 419
22.1.1 聲波方程及差分格式 419
22.1.2 吸收邊界條件 420
22.1.3 震源設置方法 422
22.1.4 二維聲波方程正演模擬的實現步驟 423
22.2 聲波方程有限差分模擬的串行程序 425
22.3 聲波方程有限差分模擬的OpenMP程序 434
22.4 聲波方程有限差分模擬的MPI程序 445
22.5 聲波方程有限差分模擬的CUDA程序 455
22.6 聲波方程有限差分模擬的MPI+CUDA程序 465
參考文獻 478
參考文獻
- ↑ 關於智慧的名言,人生屋,2013-07-15
- ↑ 關於莎士比亞的名言名句(100句),豆丁網,2021-10-01