編輯推薦
《多核計算與程序設計》特色內容是並行遍曆的基本方法,常見並行算法如並行搜索、並行排序、並行數值計算等在多核係統中的實現。
共享資源分布式計算的基本編程模式和方法,分布式隊列,它能自動給每個綫程賦予一個本地隊列,它是基於偷取的共享隊列和隊列池來實現的。
分布式查找,包括分段鎖的哈希錶,動態負載平衡的多級查找等。
分布式內存管理,它自動給每個綫程生成一個本地的內存管理器,並且幾乎不需要使用鎖進行內存分配和釋放(搶奪式內存管理)。
任務圖分解與調度及實現方法,非嵌套任務調度,可用於網絡服務器軟件等地方進行任務調度。
嵌套任務調度,是另一種更廣泛的任務調度方法,可以用它實現各種並行計算。
各種程序和算法中的僞共享問題的處理,Lock-Free編程基礎知識。
內容簡介
《多核計算與程序設計》主要介紹適應於多核(或多處理器)計算機係統的算法和程序,共分為五個部分進行講解。第1部分介紹多核編程的基礎知識,包括多核編程常見問題、鎖競爭、加速比、負載均衡等基本概念,多綫程退齣算法、讀寫鎖、鏇轉鎖、原子操作等多綫程編程基礎知識,基於OpenMP標準的並行程序設計基礎等;
第2部分介紹基礎的數據結構與算法,包括數組、鏈錶、哈希錶、二叉樹、AVL樹、復閤二叉樹等基本數據結構,在鏈錶那章中還講解瞭多綫程並行遍曆的基本方法。
第3部分介紹多核並行計算方麵的基礎知識,並行編程包括常用的編程模式如分治模式、流水綫模式、任務圖分解與調度模式、動態任務調度模式等,並行搜索包括順序搜索及終止檢測算法,並行最短路徑搜索等,並行排序包括並行快速排序、並行歸並排序、並行基數排序等,並行數值計算包括並行矩陣乘法、並行前綴和計算等方麵的內容。本部分介紹的各種並行算法和程序中,重點介紹如何解決多核係統中的計算隨CPU核數的擴展性,CPU Cache僞共享方麵的問題。
第4部分介紹多核共享資源計算方麵的內容,也是《多核計算與程序設計》中最重要的內容,講解瞭分布式計算設計模式如綫程分組競爭模式、條件同步模式、批量私有化處理模式、數據本地化模式等。這部分中講解瞭《多核計算與程序設計》中幾個最重要的程序:分布式隊列中實現瞭自動讓每個綫程帶有一個本地隊列、分布式查找中介紹瞭分段鎖的哈希錶、動態負載平衡的分布式查找等,分布式內存管理則介紹瞭適應多核的內存管理方案,尤其是基於搶奪式的分布式內存管理算法,在分配和釋放共享內存時也幾乎不需要使用鎖,性能優異。
第5部分介紹任務分解與調度方麵的知識,這也是《多核計算與程序設計》中最重要的內容,包括任務圖分解與調度的實現方法,動態任務分解與調度的實現方法等。其中還介紹瞭使用動態嵌套任務調度進行並行計算的方法,給齣瞭用動態嵌套任務調度實現ParallelForo、並行快速排序、並行歸並的實例。
最後一章中還介紹瞭Lock-Free編程(使用CAS原子操作進行編程)的基礎知識,如ABA問題,內存刪除問題等,並給齣瞭一個Lock-Free的隊列的實現實例。
作者簡介
周偉明,1994年畢業於上海交通大學,曾就職於美國加州的DASCOM Inc.公司和華為技術有限公司等企業。擔任過網絡安全軟件、網絡服務器軟件、機器翻譯軟件、工具軟件、嵌入式係統軟件等研發工作,親自編寫過的源代碼逾40萬行。著有《多任務下的數據結構與算法》(華中科技大學齣版社齣版)、《軟件測試實踐》(電子工業齣版社齣版)。
內頁插圖
目錄
第1部分 基礎知識
1 多核計算概述
1.1 多核CPU概述
1.1.1 多核計算將成為發展趨勢
1.1.2 多核CPU硬件架構介紹
1.1.3 多核給程序員帶來的機遇和挑戰
1.2 多核編程會遇到那些問題
1.2.1 並發性問題
1.2.2 CPU飢餓問題
1.2.3 任務的分解與調度問題
1.2.4 加速比性能問題
1.2.5 節能環保問題
1.2.6 擴展性問題
1.3 多核編程與單核多綫程編程的區彆
1.3.1 鎖競爭導緻的串行化的區彆
1.3.2 綫程分解與執行的區彆
1.3.3 CPU核負載平衡的區彆
1.3.4 任務調度策略的區彆
1.3.5 CPU Cache存取的區彆(僞共享問題)
1.3.6 任務優先級搶占的區彆
1.3.7 串行計算與並行及分布式計算的區彆
1.4 多核編程與多機分布式編程的區彆
1.4.1 共享存儲與分布式存儲的區彆
1.4.2 分布式計算的區彆
1.4.3 編程環境上的區彆
1.5 加速比係數
1.5.1 阿姆達爾定律
1.5.2 Gustafson定律
1.5.3 阿姆達爾定律和Gustafson定律的等價性
1.5.4 Karp-Flatt度量
1.5.5 實際情況中影響加速比係數的因素
1.5.6 並行計算開銷情況下的加速比
1.6 鎖競爭問題及對加速比的影響
1.6.1 綫程粒度因子與鎖粒度因子
1.6.2 鎖競爭的性能情況
1.6.3 集中式鎖競爭中的加速比分析
1.6.4 隨機鎖競爭中的加速比分析
1.6.5 分布式鎖競爭的加速比分析
1.6.6 無鎖編程的加速比分析
1.7 負載平衡問題對加速比的影響
1.7.1 影響負載平衡的主要因素
1.7.2 負載平衡的評價指標
1.7.3 負載平衡情況下的加速比
1.8 參考文獻
2 多綫程編程基礎
2.1 多綫程編程基本概念
2.1.1 綫程
2.1.2 鎖
2.1.3 各種係統中常用的鎖操作及信號量操作函數
2.1.4 用C++實現鎖的自動釋放
2.1.5 原子操作
2.1.6 鎖與原子操作的區彆
2.1.7 有鎖計算、無鎖計算與本地計算的概念
2.2 各種鎖性能比較
2.2.1 各種鎖在單綫程情況下的性能
2.2.2 各種鎖在多綫程集中式鎖競爭情況下的性能
2.2.3 各種鎖在多綫程分布式鎖競爭情況下的性能
2.3 讀寫鎖算法
2.3.1 讀寫鎖概念的引齣
2.3.2 讀寫鎖算法的分析和實現
2.3.3 讀寫鎖的編碼實現
2.4 多綫程退齣算法
2.4.1 單個子綫程退齣算法
2.4.2 多個綫程訪問共享資源時的退齣
2.4.3 有鎖的多綫程資源釋放退齣算法實現
2.4.4 無鎖的退齣算法
2.4.5 多綫程退齣算法的使用
2.5 參考文獻
3 OpenMP程序設計
3.1 OpenMP基本概念
3.1.1 fork/join並行執行模式的概念
3.1.2 內存模型
3.1.3 性能例子
3.1.4 編譯器對OpenMP的支持
3.2 OpenMP編程模型
3.2.1 OpenMP編譯指導語句格式
3.2.2 OpenMP主要命令
3.2.3 OpenMP主要子句
3.2.4 OpenMP主要庫函數
3.3 綫程創建與工作分攤
3.3.1 parallel命令
3.3.2 for和parallel for命令
3.3.3 if子句(條件執行並行)
3.3.4 動態設置並行循環的綫程數量
3.3.5 循環並行化的問題
3.3.6 sections和section命令
3.3.7 single命令
3.3.8 master命令
3.4 數據處理
3.4.1 private子句
3.4.2 firstprivate子句
3.4.3 lastprivate子句
3.4.4 threadprivate子句
3.4.5 shared子句
3.4.6 default子句
3.4.7 reduction子句
3.4.8 copyin子句
3.4.9 copyprivate子句
3.5 任務調度
3.5.1 Schedule子句用法
3.5.2 靜態調度(static)
3.5.3 動態調度(dynamic)
3.5.4 guided調度(guided)
3.5.5 runtime調度(rumtime)
3.5.6 任務調度與僞共享問題
3.6 綫程間的同步
3.6.1 barrier命令
3.6.2 critical命令
3.6.3 atomic命令
3.6.4 ordered命令和子句
3.6.5 nowait子句
3.6.6 flush命令
3.7 OpenMP庫函數詳解
3.7.1 執行環境函數
3.7.2 鎖操作函數
3.7.3 時間操作函數
3.8 OpenMP環境變量
3.8.1 OMP_DYNAMIC
3.8.2 OMP_NUM_THREADS
3.8.3 OMP_NESTED
3.8.4 OMP_SCHEDULE
3.9 OpenMP內部控製變量及相關流程
3.9.1 內部控製變量
3.9.2 任務調度流程
3.9.3 綫程數量決定流程
3.10 參考文獻
第2部份 基礎數據結構與算法
4 數組
4.1 棧
4.1.1 棧的基本概念
4.1.2 棧的編碼實現
4.1.3 多綫程棧的實現
4.2 對數組進行快速排序
4.2.1 排序算法介紹
4.2.2 串行快速排序基本思想
4.2.3 串行快速排序的代碼實現
4.2.4 非遞歸的快速排序算法
4.2.5 快速排序算法的復雜度分析
4.3 對數組進行查找
4.3.1 順序查找
4.3.2 二分查找
4.4 實例:用數組管理一個HOOK功能
4.4.1 單個函數的HOOK實現
4.4.2 多個函數的HOOK實現
4.4.3 HOOK功能的應用簡介
4.4.4 HOOK使用的注意事項
4.5 參考文獻
5 鏈錶
5.1 單嚮鏈錶
5.1.1 存儲錶示
5.1.2 接口設計
5.1.3 添加節點到鏈錶頭部
5.1.4 基本功能編碼實現
5.2 單嚮鏈錶的排序
5.2.1 插入排序
5.2.2 歸並插入排序
5.3 雙嚮鏈錶
5.3.1 雙嚮鏈錶的基本概念
5.3.2 雙嚮鏈錶的設計
5.3.3 雙嚮鏈錶的操作接口
5.3.4 雙嚮鏈錶的編碼實現
5.4 鏈錶的逐個節點遍曆
5.4.1 逐個節點遍曆基本概念
5.4.2 逐個節點遍曆編碼實現
5.5 多綫程遍曆算法
5.5.1 多綫程鏈錶的設計和編碼實現
5.5.2 多綫程鏈錶的4種遍曆方案
5.5.3 多個綫程同時遍曆的情況
5.6 實例:使用鏈錶管理短信息係統的CACHE
5.6.1 短信息係統的CACHE管理基本概念
5.6.2 短信息係統的發送和接收分析
5.6.3 短信息係統CACHE管理的編碼實現
6 哈希錶
6.1 哈希錶
6.1.1 哈希錶的基本概念
6.1.2 哈希錶的索引方法
6.1.3 哈希錶的衝突解決方法
6.1.4 哈希錶基本操作的源代碼
6.2 哈希鏈錶
6.2.1 哈希錶和數組、鏈錶的效率比較
6.2.2 時間效率和空間效率的關係
6.2.3 哈希鏈錶的基本概念
6.2.4 哈希鏈錶的操作
6.2.5 哈希鏈錶的編碼實現
6.3 實例:WebServer的動態CACHE文件管理
6.3.1 WebServer的動態CACHE文件管理基本概念
6.3.2 CACHE文件管理功能的設計
6.3.3 CACHE文件管理功能的編碼實現
6.4 參考文獻
7 普通樹與二叉樹
7.1 普通樹
7.1.1 普通樹的描述方法
7.1.2 樹的操作接口設計
7.1.3 樹的遍曆算法
7.1.4 樹的編碼實現
7.1.5 使用樹的遍曆算法來實現Xcopy功能
7.2 二叉樹
7.2.1 二叉樹的基本概念
7.2.2 二叉樹的樹梢及二叉樹的高度
7.2.3 二叉樹的描述方法
7.3 二叉排序樹
7.3.1 二叉排序樹的基本概念
7.3.2 二叉排序樹的查找
7.3.3 二叉排序樹的插入
7.3.4 二叉排序樹的刪除
7.3.5 二叉排序樹的遍曆
7.3.6 二叉排序樹的鏇轉操作
8 AVL搜索樹
8.1 AVL搜索樹的基本概念
8.2 AVL搜索樹的插入
8.2.1 插入操作需要考慮的問題
8.2.2 不存在不平衡節點的情況分析
8.2.3 不平衡A節點的情況分析
8.2.4 存在不平衡節點的四種情況分析
8.2.5 LL型不平衡情況的調整
8.2.6 LR型不平衡情況的調整
8.2.7 插入操作的僞代碼描述
8.3 AVL搜索樹的刪除
8.3.1 A節點的確定
8.3.2 幾種不平衡情況的分析
8.3.3 L0型調整分析
8.3.4 L-1型調整分析
8.3.5 L1型調整分析
8.3.6 刪除操作的僞代碼描述
8.4 負載平衡的AVL樹
8.4.1 基本概念的引齣
8.4.2 插入操作中負載因子的調整
8.4.3 刪除操作中負載因子的調整
8.4.4 L0和L-1型調整分析
8.4.5 L1型調整分析
8.5 AVL樹的源代碼
8.5.1 數據結構定義
8.5.2 創建、釋放、查找等操作
8.5.3 鏇轉操作函數
8.5.4 插入操作函數
8.5.5 刪除操作函數
8.6 參考文獻
9 復閤二叉樹
9.1 哈希紅黑樹
9.1.1 哈希紅黑樹的基本概念
9.1.1 哈希紅黑樹的查找
9.1.3 哈希紅黑樹的插入
9.1.4 哈希紅黑樹的刪除
9.1.5 哈希紅黑樹的釋放
9.1.6 哈希紅黑樹的遍曆
9.1.7 哈希紅黑樹的編碼實現
9.1.8 哈希紅黑樹的效率分析
9.2 哈希AVL樹
9.2.1 哈希AVL樹的基本概念
9.2.2 哈希AVL樹的查找
9.2.3 哈希AVL樹的插入
9.2.4 哈希AVL樹的刪除
9.2.5 哈希AVL樹的釋放
9.2.6 哈希AVL樹的遍曆
9.2.7 哈希AVL樹的編碼實現
9.3 復閤數據結構的分類
9.4 抗DoS/DdoS攻擊的實例
9.4.1 DoS/DdoS攻擊的概念
9.4.2 常見DoS/DdoS攻擊手段及防範策略
9.4.3 抗DoS/DdoS攻擊的實現
9.4.4 抗DoS/DdoS攻擊的編碼實現
9.5 參考文獻
第3部分 並行計算
10 並行程序設計模式
10.1 基本概念
10.1.1 強並行計算與弱並行計算
10.1.2 並行程序設計模式的基本思路
10.2 模式數據分解模式
10.3 分治模式
10.3.1 子問題求解時的負載平衡問題
10.3.2 子問題的解的閤並可能引起的串行化問題
10.4 流水綫模式
10.5 任務並行模式
10.6 任務調度模式
10.6.1 任務圖調度模式
10.6.2 動態任務調度模式
11 並行搜索
11.1 並行順序搜索
11.1.1 並行搜索指定數據
11.1.2 並行搜索最大數
11.1.3 終止檢測算法
11.2 串行Dijkstra最短路徑搜索
11.2.1 Dijkstra最短路徑算法的描述
11.2.2 Dijkstra最短路徑算法的過程圖解
11.2.3 僞代碼描述
11.2.4 算法流程圖
11.2.5 C/C++代碼實現
11.3 並行最短路徑算法
11.3.1 Dijkstra算法的並行化
11.3.2 並行Dijkstra算法的代碼實現
11.3.3 其他並行最短路徑算法的介紹和分析
11.4 參考文獻
12 並行排序
12.1 並行排序概述
12.2 冒泡排序
12.2.1 串行冒泡排序
12.2.2 奇偶排序
12.3 快速排序
12.3.1 串行快速排序基本思想
12.3.2 串行快速排序的代碼實現
12.3.3 快速排序並行化方法
12.3.4 開源項目mcstl中的並行快速排序
12.3.5 基於任務竊取的快速排序
12.4 並行歸並排序
12.4.1 串行歸並算法
12.4.2 Cole並行歸並算法
12.4.3 並行快速歸並排序
12.5 基數排序
12.5.1 串行鏈式基數排序
12.5.2 串行數組基數排序
12.5.3 一步到位的分層排序
12.5.4 負載平衡的並行基數排序
12.5.5 分區的並行基數排序
13 並行數值計算
13.1 多核並行數值計算麵臨的問題
13.1.1 Cache的命中率問題
13.1.2 僞共享問題
13.2 求和及前綴求和
13.3 矩陣相加
13.4 矩陣相乘
13.4.1 基本概念
13.4.2 串行算法
13.4.3 並行算法
13.5 矩陣嚮量相乘
13.6 並行隨機數生成
13.7 參考文獻
第4部分 共享資源分布式計算
14 分布式計算設計模式
14.1 基本概念
14.1.1 共享資源的計算分解
14.1.2 共享資源計算的負載均衡問題
14.1.3 共享資源計算的算法設計思路與方法
14.2 綫程分組競爭模式
14.2.1 標準的綫程分組競爭模式
14.2.2 綫程分組競爭模式的變種
14.3 綫程隨機競爭模式
14.3.1 基本概念
14.3.2 加速比性能的保證
14.4 數據本地化模式
14.4.1 取得比單核多綫程更好的性能
14.4.2 數據本地化模式
14.4.3 優缺點分析
14.5 分布式數據結構設計
14.5.1 復閤數據結構設計方法
14.5.2 分布式數據結構設計
14.5.3 分布式數據結構主要問題
14.6 參考文獻
15 分布式隊列
15.1 串行隊列
15.1.1 簡單環形隊列
15.1.2 STL中的Deque
15.1.3 動態環形隊列
15.2 隊列池
15.2.1 共享隊列
15.2.2 消息隊列
15.2.3 隊列池
15.2.4 隊列池的幾種實現方案
15.2.5 隊列池的使用實例
15.3 帶本地計算的分布式隊列
15.3.1 基本思想
15.3.2 本地化隊列的實現
15.3.3 任務偷取隊列的實現
15.3.4 分布式隊列的實現
15.3.5 綫程池CThreadPool的實現
15.3.6 綫程池CThreadPool的代碼實現
15.3.7 CDistributedQueu
多核計算與程序設計 下載 mobi epub pdf txt 電子書 格式