多核套用編程實戰

多核套用編程實戰

多核套用編程實戰是人民郵電出版社出版的一本圖書,作者美 Darryl Gove。

基本介紹

  • 作者:美 Darryl Gove
  • 譯者:郭晴霞
  • ISBN:9787115317506
  • 頁數:345
  • 定價:79.00元
  • 出版社:人民郵電出版社
  • 出版時間:2013-6
  • 裝幀:平裝
  • 副標題:多核套用編程實戰
  • 原作名:Multicore application prog
內容介紹,作者介紹,作品目錄,

內容介紹

《多核套用編程實戰》是一本全面實用的多核套用編程指南,旨在介紹如何編寫功能正確、性能優越且適合擴展為在多個CPU核心的系統運行的應用程式。《多核套用編程實戰》面向多種作業系統和處理器類型引用程式示例,內容涵蓋類UNIX作業系統(Linux、Oracle Solaris、OS X)和Windows系統上多核套用的編寫方法、多核的硬體實現對應用程式的性能影響、編寫並行應用程式時要避免的潛在問題,以及如何編寫可擴展至大量並行執行緒的應用程式。
《多核套用編程實戰》適合所有C程式設計師學習參考。

作者介紹

Darryl Gove
多核套用編程實戰
Oracle Solaris Studio編譯團隊的高級首席軟體工程師,主要負責應用程式和基準方面的分析、並行和最佳化。他具有英國南安普頓大學運籌學碩士和博士學位,另著有Solaris Application Programming、The Developer’s Edge。

作品目錄

第1章 硬體、進程和執行緒 1
1.1  計算機的內部結構 1
1.2  多核處理器的緣起 3
1.2.1  在單晶片上支持多執行緒 4
1.2.2  通過處理器核心流水線作業提高指令發出率 8
1.2.3  使用快取保存最近使用的數據 10
1.2.4  用虛擬記憶體存儲數據 12
1.2.5  從虛擬地址轉換到物理地址 13
1.3  多處理器系統的特徵 14
1.4  原始碼到彙編語言的轉換 16
1.4.1  32位與64位代碼的性能 18
1.4.2  確保記憶體操作的正確順序 19
1.4.3  進程和執行緒的差異 21
1.5  小結 23
第2章 高性能編碼 24
2.1  定義性能 24
2.2  了解算法複雜度 25
2.2.1  算法複雜度的示例 26
2.2.2  算法複雜度的重要性 28
2.2.3  謹慎運用算法複雜度 30
2.3  結構如何影響性能 30
2.3.1  在原始碼和生成結構上權衡性能和便利性 30
2.3.2  利用庫結構化應用程式 33
2.3.3  數據結構對性能的影響 42
2.4  編譯器的作用 47
2.4.1  兩種編譯器最佳化 48
2.4.2  選擇合適的編譯器選項 50
2.4.3  如何用跨檔案最佳化提高性能 51
2.4.4  使用配置檔案反饋 53
2.4.5  潛在的指針別名會如何抑制編譯器最佳化 55
2.5  通過分析確定占用時間的地方 58
2.6  怎樣避免手動最佳化 64
2.7  從設計角度看性能 64
2.8  小結 65
第3章 識別並行機會 66
3.1  使用多進程提高系統工作效率 66
3.2  多用戶使用一個系統 67
3.3  通過整合提高機器工作效率 68
3.3.1  用容器隔離共享一個系統的應用程式 69
3.3.2  使用虛擬機監控程式託管多個作業系統 69
3.4  採用並行機制提高單個任務的性能 71
3.4.1  理解並行應用程式 72
3.4.2  並行如何影響算法的選擇 72
3.4.3  Amdahl定律 73
3.4.4  確定最大實際執行緒數 75
3.4.5  同步成本怎樣降低擴展性 76
3.5  並行模式 78
3.5.1  使用SIMD指令的數據並行 78
3.5.2  通過進程或執行緒實現並行化 79
3.5.3  多個獨立任務 79
3.5.4  多個鬆散耦合的任務 80
3.5.5  相同任務的多個副本 81
3.5.6  單個任務拆分到多個執行緒 82
3.5.7  使用流水線任務完成某個事項 82
3.5.8  將工作分配給客戶端和伺服器 83
3.5.9  將責任劃分給生產者和消費者 84
3.5.10  結合多種並行化策略 85
3.6  依賴關係對並行運行代碼能力的影響 85
3.6.1  反依賴和輸出依賴 86
3.6.2  通過推測打破依賴 88
3.6.3  關鍵路徑 91
3.7  發現並行機會 92
3.8  小結 93
第4章 同步和數據共享 94
4.1  數據爭用 94
4.1.1  使用工具檢測數據爭用 95
4.1.2  避免數據爭用 98
4.2  同步原語 98
4.2.1  互斥量和臨界區 98
4.2.2  自旋鎖 99
4.2.3  信號量 100
4.2.4  讀寫鎖 100
4.2.5  屏障 101
4.2.6  原子操作和無鎖代碼 102
4.3  死鎖和活鎖 103
4.4  執行緒和進程間的通信 104
4.4.1  記憶體、共享記憶體和記憶體映射檔案 104
4.4.2  條件變數 105
4.4.3  信號和事件 107
4.4.4  訊息佇列 108
4.4.5  命名管道 108
4.4.6  通過網路棧進行通信 109
4.4.7  執行緒之間共享數據的其他方法 110
4.5  存儲執行緒私有數據 110
4.6  小結 112
第5章 使用POSIX執行緒 113
5.1  創建執行緒 113
5.1.1  執行緒終止 114
5.1.2  用子執行緒接收和傳遞數據 115
5.1.3  分離執行緒 116
5.1.4  設定pthread的屬性 117
5.2  編譯多執行緒代碼 119
5.3  進程終止 121
5.4  執行緒之間共享數據 122
5.4.1  使用互斥鎖保護訪問 122
5.4.2  互斥鎖屬性 124
5.4.3  使用自旋鎖 125
5.4.4  讀寫鎖 127
5.4.5  屏障 129
5.4.6  信號量 130
5.4.7  條件變數 136
5.5  變數和記憶體 140
5.6  多進程編程 143
5.6.1  在進程之間共享記憶體 144
5.6.2  在進程之間共享信號量 147
5.6.3  訊息佇列 147
5.6.4  管道和命名管道 150
5.6.5  使用信號與進程通信 151
5.7  套接字 156
5.8  可重入代碼和編譯器標誌 158
5.9  小結 160
第6章 Windows執行緒 161
6.1  創建Windows本機執行緒 161
6.1.1  終止執行緒 165
6.1.2  創建和重新啟動掛起的執行緒 167
6.1.3  使用核心資源的句柄 168
6.2  同步和資源共享的方式 168
6.2.1  執行緒間需要同步的一個例子 169
6.2.2  保護對臨界區代碼的訪問 170
6.2.3  用互斥量保護代碼段 172
6.2.4  輕量級讀寫鎖 173
6.2.5  信號量 175
6.2.6  條件變數 177
6.2.7  向其他執行緒或進程發出事件完成的信號 178
6.3  Windows中的寬字元串處理 179
6.4  創建進程 180
6.4.1  在進程之間共享記憶體 182
6.4.2  在子進程中繼承句柄 185
6.4.3  互斥量命名及其在進程間的共享 186
6.4.4  用管道通信 187
6.4.5  用套接字進行通信 190
6.5  變數的原子更新 193
6.6  分配執行緒本地存儲 195
6.7  設定執行緒的優先權 197
6.8  小結 198
第7章 自動並行化和OpenMP 199
7.1  使用自動並行化產生並行代碼 199
7.1.1  識別和並行約簡 203
7.1.2  對包含調用的代碼進行自動並行化 204
7.1.3  協助編譯器實現代碼的自動並行化 206
7.2  使用OpenMP生成並行應用程式 208
7.2.1  使用OpenMP並行化循環 209
7.2.2  OpenMP應用程式的運行時行為 210
7.2.3  OpenMP並行區域中的變數作用域 210
7.2.4  使用OpenMP並行化約簡 212
7.2.5  在並行區域外訪問私有數據 212
7.2.6  使用調度改進工作分配 214
7.2.7  用並行段完成獨立工作 217
7.2.8  嵌套並行 218
7.2.9  使用OpenMP動態定義並行任務 219
7.2.10  保持數據對執行緒私有 223
7.2.11  控制OpenMP運行時環境 225
7.2.12  等待工作完成 227
7.2.13  限制執行代碼區域的執行緒 229
7.3  確保並行區域的代碼按順序執行 232
7.4  摺疊循環改進工作負荷均衡 233
7.5  強制實現記憶體一致性 234
7.6  並行化示例 235
7.7  小結 239
第8章 手工編碼的同步和共享 240
8.1  原子操作 240
8.1.1  用比較和交換指令構成更複雜的原子操作 242
8.1.2  強制實現記憶體排序以確保正確操作 245
8.1.3  編譯器對記憶體排序指令的支持 247
8.1.4  編譯器對操作的重新排序 247
8.1.5  易失變數 251
8.2  作業系統提供的原子操作 251
8.3  無鎖算法 254
8.3.1  Dekker算法 254
8.3.2  帶循環快取的生產者/消費者 256
8.3.3  擴展到多個消費者或生產者 259
8.3.4  將生產者/消費者擴展到多個執行緒 260
8.3.5  更改生產者/消費者代碼為使用原子操作 266
8.3.6  ABA問題 268
8.4  小結 271
第9章 基於多核處理器的擴展 272
9.1  對應用程式擴展的限制 272
9.1.1  串列代碼對性能的限制 272
9.1.2  超線性擴展 275
9.1.3  工作負荷不均衡 276
9.1.4  熱鎖 277
9.1.5  庫代碼擴展 282
9.1.6  工作量不足 284
9.1.7  算法限制 286
9.2  擴展的硬體限制 288
9.2.1  核心之間的頻寬共享 288
9.2.2  偽共享 290
9.2.3  快取衝突和容量 293
9.2.4  流水線資源匱乏 297
9.3  作業系統對擴展性的限制 301
9.3.1  過度訂閱 301
9.3.2  使用處理器綁定改善記憶體局部性 303
9.3.3  優先權反轉 310
9.4  多核處理器和擴展 310
9.5  小結 311
第10章 其他並行技術 312
10.1  基於GPU的運算 312
10.2  語言擴展 314
10.2.1  執行緒構建模組 314
10.2.2  Cilk++ 317
10.2.3  Grand Central Dispatch 320
10.2.4  為未來C和C++標準提議的可能功能 321
10.2.5  微軟的C++/CLI 324
10.3  其他語言 325
10.4  集群技術 327
10.4.1  MPI 328
10.4.2  以MapReduce作為擴展策略 331
10.4.3  格線 332
10.5  事務性記憶體 332
10.6  向量化 333
10.7  小結 334
第11章 結束語 335
11.1  編寫並行應用程式 335
11.1.1  識別任務 335
11.1.2  估算性能提升 336
11.1.3  確定依賴關係 336
11.1.4  數據爭用和互斥鎖擴展限制 336
11.1.5  鎖的粒度 337
11.2  多核處理器上的並行代碼 337
11.3  並行化的未來 339
參考文獻 340
索引 342

相關詞條

熱門詞條

聯絡我們