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