《并行程序設(shè)計(jì)導(dǎo)論》全面涵蓋了并行軟件和硬件的方方面面,深入淺出地介紹如何使用MPI(分布式內(nèi)存編程)、Pthreads和OpenMP(共享內(nèi)存編程)編寫高效的并行程序。各章節(jié)包含了難易程度不同的編程習(xí)題!恫⑿谐绦蛟O(shè)計(jì)導(dǎo)論》可以用做計(jì)算機(jī)科學(xué)專業(yè)低年級(jí)本科生的專業(yè)課程的教材,也可以作為軟件開發(fā)人員學(xué)習(xí)并行程序設(shè)計(jì)的專業(yè)參考書。
出版者的話
譯者序
本書贊譽(yù)
前言
致謝
第1章 為什么要并行計(jì)算
1.1 為什么需要不斷提升的性能
1.2 為什么需要構(gòu)建并行系統(tǒng)
1.3 為什么需要編寫并行程序
1.4 怎樣編寫并行程序
1.5 我們將做什么
1.6 并發(fā)、并行、分布式
1.7 本書的其余部分
1.8 警告
1.9 字體約定
1.10 小結(jié)
1.11 習(xí)題
第2章 并行硬件和并行軟件
2.1 背景知識(shí)
2.1.1 馮·諾依曼結(jié)構(gòu)
2.1.2 進(jìn)程、多任務(wù)及線程
2.2 對(duì)馮·諾依曼模型的改進(jìn)
2.2.1 Cache基礎(chǔ)知識(shí)
2.2.2 Cache映射
2.2.3 Cache和程序:一個(gè)實(shí)例
2.2.4 虛擬存儲(chǔ)器
2.2.5 指令級(jí)并行
2.2.6 硬件多線程
2.3 并行硬件
2.3.1 SIMD系統(tǒng)
2.3.2 MIMD系統(tǒng)
2.3.3 互連網(wǎng)絡(luò)
2.3.4 Cache一致性
2.3.5 共享內(nèi)存與分布式內(nèi)存
2.4 并行軟件
2.4.1 注意事項(xiàng)
2.4.2 進(jìn)程或線程的協(xié)調(diào)
2.4.3 共享內(nèi)存
2.4.4 分布式內(nèi)存
2.4.5 混合系統(tǒng)編程
2.5 輸入和輸出
2.6 性能
2.6.1 加速比和效率
2.6.2 阿姆達(dá)爾定律
2.6.3 可擴(kuò)展性
2.6.4 計(jì)時(shí)
2.7 并行程序設(shè)計(jì)
2.8 編寫和運(yùn)行并行程序
2.9 假設(shè)
2.10 小結(jié)
2.10.1 串行系統(tǒng)
2.10.2 并行硬件
2.10.3 并行軟件
2.10.4 輸入和輸出
2.10.5 性能
2.10.6 并行程序設(shè)計(jì)
2.10.7 假設(shè)
2.11 習(xí)題
第3章 用MPI進(jìn)行分布式內(nèi)存編程
3.1 預(yù)備知識(shí)
3.1.1 編譯與執(zhí)行
3.1.2 MPI程序
3.1.3 MPI_Init和MPI_Finalize
3.1.4 通信子、MPI_Comm_size和MPI_Comm_rank
3.1.5 SPMD程序
3.1.6 通信
3.1.7 MPI_Send
3.1.8 MPI_Recv
3.1.9 消息匹配
3.1.10 status_p參數(shù)
3.1.11 MPI_Send和MPI_Recv的語(yǔ)義
3.1.12 潛在的陷阱
3.2 用MPI來(lái)實(shí)現(xiàn)梯形積分法
3.2.1 梯形積分法
3.2.2 并行化梯形積分法
3.3 I/O處理
3.3.1 輸出
3.3.2 輸入
3.4 集合通信
3.4.1 樹形結(jié)構(gòu)通信
3.4.2 MPI_Reduce
3.4.3 集合通信與點(diǎn)對(duì)點(diǎn)通信
3.4.4 MPI_Allreduce
3.4.5 廣播
3.4.6 數(shù)據(jù)分發(fā)
3.4.7 散射
3.4.8 聚集
3.4.9 全局聚集
3.5 MPI的派生數(shù)據(jù)類型
3.6 MPI程序的性能評(píng)估
3.6.1 計(jì)時(shí)
3.6.2 結(jié)果
3.6.3 加速比和效率
3.6.4 可擴(kuò)展性
3.7 并行排序算法
3.7.1 簡(jiǎn)單的串行排序算法
3.7.2 并行奇偶交換排序
3.7.3 MPI程序的安全性
3.7.4 并行奇偶交換排序算法的重要內(nèi)容
3.8 小結(jié)
3.9 習(xí)題
3.10 編程作業(yè)
第4章 用Pthreads進(jìn)行共享內(nèi)存編程
4.1 進(jìn)程、線程和Pthreads
4.2 “Hello,World”程序
4.2.1 執(zhí)行
4.2.2 準(zhǔn)備工作
4.2.3 啟動(dòng)線程
4.2.4 運(yùn)行線程
4.2.5 停止線程
4.2.6 錯(cuò)誤檢查
4.2.7 啟動(dòng)線程的其他方法
4.3 矩陣-向量乘法
4.4 臨界區(qū)
4.5 忙等待
4.6 互斥量
4.7 生產(chǎn)者-消費(fèi)者同步和信號(hào)量
4.8 路障和條件變量
4.8.1 忙等待和互斥量
4.8.2 信號(hào)量
4.8.3 條件變量
4.8.4 Pthreads路障
4.9 讀寫鎖
4.9.1 鏈表函數(shù)
4.9.2 多線程鏈表
4.9.3 Pthreads讀寫鎖
4.9.4 不同實(shí)現(xiàn)方案的性能
4.9.5 實(shí)現(xiàn)讀寫鎖
4.10 緩存、緩存一致性和偽共享
4.11 線程安全性
4.12 小結(jié)
4.13 習(xí)題
4.14 編程作業(yè)
第5章 用OpenMP進(jìn)行共享內(nèi)存編程
5.1 預(yù)備知識(shí)
5.1.1 編譯和運(yùn)行OpenMP程序
5.1.2 程序
5.1.3 錯(cuò)誤檢查
5.2 梯形積分法
5.3 變量的作用域
5.4 歸約子句
5.5 parallelfor指令
5.5.1 警告
5.5.2 數(shù)據(jù)依賴性
5.5.3 尋找循環(huán)依賴
5.5.4 π值估計(jì)
5.5.5 關(guān)于作用域的更多問(wèn)題
5.6 更多關(guān)于OpenMP的循環(huán):排序
5.6.1 冒泡排序
5.6.2 奇偶變換排序
5.7 循環(huán)調(diào)度
5.7.1 schedule子句
5.7.2 static調(diào)度類型
5.7.3 dynamic和guided調(diào)度類型
5.7.4 runtime調(diào)度類型
5.7.5 調(diào)度選擇
5.8 生產(chǎn)者和消費(fèi)者問(wèn)題
5.8.1 隊(duì)列
5.8.2 消息傳遞
5.8.3 發(fā)送消息
5.8.4 接收消息
5.8.5 終止檢測(cè)
5.8.6 啟動(dòng)
5.8.7 atomic指令
5.8.8 臨界區(qū)和鎖
5.8.9 在消息傳遞程序中使用鎖
5.8.10 critical指令、atomic指令、鎖的比較
5.8.11 經(jīng)驗(yàn)
5.9 緩存、緩存一致性、偽共享
5.10 線程安全性
5.11 小結(jié)
5.12 習(xí)題
5.13 編程作業(yè)
第6章 并行程序開發(fā)
6.1 n體問(wèn)題的兩種解決方法
6.1.1 問(wèn)題
6.1.2 兩個(gè)串行程序
6.1.3 并行化n體算法
6.1.4 關(guān)于I/O
6.1.5 用OpenMP并行化基本算法
6.1.6 用OpenMP并行化簡(jiǎn)化算法
6.1.7 評(píng)估OpenMP程序
6.1.8 用Pthreads并行化算法
6.1.9 用MPI并行化基本算法
6.1.10 用MPI并行化簡(jiǎn)化算法
6.1.11 MPI程序的性能
6.2 樹形搜索
6.2.1 遞歸的深度優(yōu)先搜索
6.2.2 非遞歸的深度優(yōu)先搜索
6.2.3 串行實(shí)現(xiàn)所用的數(shù)據(jù)結(jié)構(gòu)
6.2.4 串行實(shí)現(xiàn)的性能
6.2.5 樹形搜索的并行化
6.2.6 采用Pthreads實(shí)現(xiàn)的靜態(tài)并行化樹搜索
6.2.7 采用Pthreads實(shí)現(xiàn)的動(dòng)態(tài)并行化樹搜索
6.2.8 Pthreads樹搜索程序的評(píng)估
6.2.9 采用OpenMp實(shí)現(xiàn)的并行化樹搜索程序
6.2.10 OpenMp實(shí)現(xiàn)的性能
6.2.11采用MPI和靜態(tài)劃分來(lái)實(shí)現(xiàn)樹搜索
6.2.12 采用MPI和動(dòng)態(tài)劃分來(lái)實(shí)現(xiàn)樹搜索
6.3 忠告
6.4 選擇哪個(gè)API
6.5 小結(jié)
6.5.1 Pthreads和OpenMP
6.5.2 MPI
6.6 習(xí)題
6.7 編程作業(yè)
第7章 接下來(lái)的學(xué)習(xí)方向
參考文獻(xiàn)
索引