編輯推薦
《華章 並行編程模式》是軟件開發人員學習並行編程的教程,其中並沒有過多講解理論知識,而是討論並行程序員所麵臨的挑戰及其解決方案,並結閤當前並行API的用法給齣一些示例。
書中引入瞭一種完整的、通俗易懂的模式語言,可以幫助任何有經驗的開發人員編寫高效的並行代碼。
內容簡介
從網格、集群到下一代遊戲平颱,並行計算正在成為主流。IBM、Intel、Oracle公司的超綫程技術、超傳輸技術和多核微處理器等技術創新正在加速推動並行計算的發展。萬事俱備,隻欠東風——滿足並行軟件飛速增長需求的程序員。
《華章並行編程模式》是軟件開發人員學習並行編程的教程,其中並沒有過多講解理論知識,而是討論並行程序員所麵臨的挑戰及其解決方案,並結閤當前並行API的用法給齣一些示例。書中引入瞭一種完整的、通俗易懂的模式語言,可以幫助任何有經驗的開發人員編寫高效的並行代碼。通過學習本書,讀者將意識到模式是掌握並行編程的方式。本書不僅適用於高等院校計算機科學相關專業的學生,而且適用於各類軟件開發人員。
本書主要內容包括:
理解並行計算和並行開發人員所麵臨的挑戰。
找齣軟件設計中的並發問題並將其分解成並發任務。
管理不同任務間的數據使用。
生成一種可以有效利用已識彆的並發性的算法結構。
將算法結構同需要實現的API相連接。
實現並行程序的特定軟件結構。
與OpenMP、MPI和Java等當今主流的並行編程環境協同工作。
作者簡介
Timothy G. Mattson,加州大學聖剋魯茲分校化學博士,英特爾生命科學社區首席發言人。他主要研究對大多程序員來說簡化的並行編程技術,重點是計算生物學方麵。
Beverly A. Sanders,哈佛大學應用數學博士,佛羅裏達大學計算機信息科學與工程係副教授。她主要研究如何幫助程序員構建高質量的、正確的程序,包括形式化方法、組件係統和設計模式。
Berna L. Massingill,加州理工學院計算機科學博士,三一大學副教授。她的研究領域為並行和分布式計算,以及設計模式和形式化方法。
目錄
Patterns for Parallel Programming
齣版者的話
譯者序
前言
作者簡介
第1章 並行編程的模式語言
1.1 引言
1.2 並行編程
1.3 設計模式和模式語言
1.4 關於並行編程的模式語言
第2章 並行計算的背景和術語
2.1 並行程序中的並發性與操作係統中的並發性
2.2 並行體係結構簡介
2.2.1 Flynn分類法
2.2.2 MIMD的進一步分類
2.2.3 小結
2.3 並行編程環境
2.4 並行編程術語
2.5 並行計算的度量
2.6 通信
2.6.1 延遲和帶寬
2.6.2 重疊通信和計算以及延遲隱藏
2.7 本章小結
第3章 "尋找並發性"設計空間
3.1 關於設計空間
3.1.1 概述
3.1.2 使用分解模式
3.1.3 示例的背景知識
3.2 任務分解模式
3.3 數據分解模式
3.4 分組任務模式
3.5 排序任務模式
3.6 數據共享模式
3.7 設計評估模式
3.8 本章小結
第4章 "算法結構"設計空間
4.1 引言
4.2 選擇一種算法結構設計模式
4.2.1 目標平颱
4.2.2 主要組織原則
4.2.3 算法結構決策樹
4.2.4 重新評估
4.3 示例
4.3.1 醫學成像
4.3.2 分子動力學
4.4 任務並行模式
4.5 分治模式
4.6 幾何分解模式
4.7 遞歸數據模式
4.8 流水綫模式
4.9 基於事件的協作模式
第5章 "支持結構"設計空間
5.1 引言
5.1.1 程序結構模式
5.1.2 數據結構模式
5.2 麵臨的問題
5.3 模式選擇
5.4 SPMD模式
5.5 主/從模式
5.6 循環並行模式
5.7 派生/聚閤模式
5.8 共享數據模式
5.9 共享隊列模式
5.10 分布式數組模式
5.11 其他支持結構
5.11.1 SIMD
5.11.2 MPMD
5.11.3 客戶端-服務器計算
5.11.4 使用聲明語言的並發編程
5.11.5 問題求解環境
第6章 "實現機製"設計空間
6.1 引言
6.2 UE管理
6.2.1 綫程的創建/銷毀
6.2.2 進程的創建/銷毀
6.3 同步
6.3.1 內存同步和圍柵
6.3.2 柵欄
6.3.3 互斥
6.4 通信
6.4.1 消息傳遞
6.4.2 集閤通信
6.4.3 其他通信構造
附錄A OpenMP簡介
附錄B MPI簡介
附錄C Java並發編程簡介
術語錶
參考文獻
索引
精彩書摘
第1章
Patterns for Parallel Programming
並行編程的模式語言
1.1 引言
計算機被廣泛用於模擬自然科學、醫學和工程學等領域中的真實物理係統,包括天氣預報模擬係統、震撼電影的場景模擬係統,並且可以使用任意的計算能力來完成更加精細的模擬。無論是顧客購物模式,還是來自於宇宙的遙測數據或者DNA序列,它們需要分析的數據量都十分巨大。為瞭提供這種計算能力,設計者將多個處理單元融入一個較大的係統中。這就是所謂的並行計算機,它能夠同時運行多個任務,在更短的時間內解決規模更大的問題。
過去,並行計算機僅用於解決一些最重要的問題,但是從20世紀90年代中期開始,隨著微處理器內部開始支持多綫程技術,並且在單個矽片上可容納多個處理器內核,這種情況已經發生瞭根本性變化。現在,並行計算機隨處可見,幾乎每所大學計算機係都至少有一颱並行計算機。幾乎所有的石油公司、汽車製造商、藥品開發公司和特效工作室都已經使用瞭並行計算。
例如,計算機動畫的生成過程是將動畫文件的信息(如光、紋理和陰影)應用於3D模型以生成2D圖像,再用這些2D圖像組成電影的幀。為較長的電影生成所需的幀時(每秒24幀),並行計算是非常必要的。1995年,由Pixar公司發行的《玩具總動員》是第一個完全通過計算機軟件製作的電影,該電影由一颱包括100個雙處理器機器的名為“renderfarm” [PS00]的機器處理。Pixar公司在1999年製作《玩具總動員2》時利用瞭一颱具有1400個處理器的係統。由於提高瞭處理能力,影片的效果(包括紋理、服飾和藝術效果)有大幅度提升。Monsters公司2001年使用瞭一個擁有250個企業級服務器。(每個服務器包含14個處理器,共3500個處理器)的係統。然而利用更高的計算性能,包括處理器數目以及單個處理器計算性能,來提升動畫效果,因此生成一幅幀需要的時間仍保持不變。
生物科學在能夠從多種生物體(包括人)中獲得DNA序列信息後實現瞭跨越式的發展。由Celera公司提齣並成功使用的一種稱為基因組鳥槍的排序算法,可將基因組劃分為多個子段,首先通過實驗確定每個子段的DNA序列,然後利用計算機通過重構子段間的重疊區域來重組整個序列。Celera公司排序人類基因組時使用的計算機包括150颱四路服務器以及一颱具有16個處理器和64GB內存的服務器,實際計算包括5兆億次基對基比較[Ein00]。
項目[SET,ACK+02]的目的是尋找地外智能存在的證據,它是另一個展示並行計算能力的實例。該項目利用位於波多黎各的世界上最大的阿雷卡納特無綫望遠鏡搜索外太空,分析收集到的數據,搜索智能信號源。該項目的計算需求超過瞭世界上最大超級計算機的性能,因此隻能利用公共計算資源滿足性能需求,即將通過Internet互聯的世界範圍內的PC整閤為一颱並行計算機。項目將收集的數據劃分為一些子任務,並將子任務通過Internet發送到每個客戶端計算機上,利用這些分布的個人計算機的空閑時間進行計算。每個客戶端定期連接到服務器,下載數據並執行分析計算,最後將結果發送迴服務器。客戶端程序被設計為一個屏幕保護程序,僅當計算機處於空閑狀態時纔將CPU貢獻給SETI問題執行計算任務。目前,一個工作子任務平均需要一颱計算機7~8個小時的CPU時間,從項目啓動到現在已有2.05億個工作單元得以處理。最近,也齣現瞭一批利用公共計算資源的新項目,並且一些大公司也利用其內部個人計算機的空閑計時解決從新藥篩選到芯片設計驗證等問題。
盡管通過並行計算可以以更短的時間解決一些串行無法完成的問題,但實現並行也需要付齣一些代價。編寫並行計算軟件是十分睏難的,因此隻有少量程序員具備豐富的並行編程經驗。如果要利用並行計算機帶來的並行性潛能,大部分程序員都需要學習如何編寫並行
程序。
本書將為有串行程序設計經驗的程序員介紹編寫並行程序的設計方法。雖然已經有一些優秀的書籍介紹過特殊的並行編程環境,但本書不同之處在於,我們主要介紹並行算法的構造和設計思路。因此,我們將使用模式語言的概念,在麵嚮對象社區中已經大量使用瞭這種包含專傢設計經驗的高度結構化錶示。
本書前兩章將介紹基礎知識,其中第l章概述理解和使用模式語言所必需的並行計算相關概念及其背景,第2章將更深入地討論並行程序員所使用的基本概念和術語,其餘章節介紹具體的模式語言。
1.2 並行編程
並行計算的關鍵是可挖掘的並發性。如果一個計算問題能夠被分解成多個子問題,並且所有子問題可在相同時間內同時、安全地解決,則該問題就存在並發性。必須分析問題並發性並在代碼中顯示開發性,使得子問題能夠並行執行,也就是說,問題解決方案必須具備並發性。
大部分大規模計算問題具備一定的並發性。程序員通過建立並行算法並在並行編程環境中實現來挖掘問題的並發性。這樣,當並行程序在多處理器係統上運行時,纔能在更短的時間內完成計算。此外,相對於單處理器係統,多處理器係統能處理規模更大的問題。
例如,假設計算包括求一個大型數據集的和時,串行計算將所有的值按順序相加;如果使用多處理器,則需劃分數據集,並在不同處理器上計算每個子集的和,同時完成計算,最後求所有子集之和。這樣利用多處理器並行計算能更快地完成任務。若每個處理器都有私有內存,將數據分布到多個處理器上即可處理更大規模的問題。
上述簡單示例展示瞭並行計算的本質。並行計算的目標是利用多處理器在更短時間內解決問題,以及處理規模更大的問題(與單處理所能處理的問題規模相比)。程序員需要鑒彆齣問題的並發性,並設計並行算法來挖掘問題中的並發性,然後在閤適的並行編程環境中編寫並行代碼,最後在並行係統上運行。
並行編程也麵臨一些挑戰。通常,問題所包含的並發任務間具有一定依賴性,這些子計算以不同順序完成可能會影響程序的運行結果。例如,在上述並行求和示例中,某一子集求和計算完成後,纔能與其他子集的和相加。該算法對所有任務強加瞭一種偏序順序(即所有子任務完成後纔能夠被組閤在一起計算最終結果)。此外,由於浮點運算具有非結閤性和非交換性,因此當求和運算順序不同時,計算結果可能會有微小的數值差。設計安全的並行程序需要付齣大量努力,優秀並行程序員必須非常謹慎以保證這些不確定性不會影響最終計算
結果。
即使一個並行程序是“正確”的,它也可能無法通過挖掘並發性來實現性能提高。必須確保挖掘並發性而導緻的額外開銷不會嚴重影響程序運行時間,並且在其他問題中實現負載平衡通常不像求和問題那樣簡單。並行算法效率依賴於它與底層硬件體係結構間的映射關係,一個並行體係結構上執行效率非常高的並行算法在另一個體係結構上執行的性能可能很差。
第2章將更為量化地介紹並行計算並重新討論這個問題。
1.3 設計模式和模式語言
設計模式描述在特定上下文中類似問題的有效解決方法。模式具有預定的格式,包括模式名稱、上下文的描述、目標和限製以及相應的解決方案。其理念是記錄專傢經驗,供他人遇到類似問題時參考藉鑒。除瞭解決方法本身外,模式名稱也是非常重要的,它構成瞭領域專用詞匯的基礎,有效加強同一領域設計者之間的交流。
設計模式最早由Christopher Alexander提齣,其應用的領域是城市規劃和建築學[AIS77]。Beck和Cunningham[BC87]最早將設計模式概念引入軟件工程社區,隨著Gamma、Helm、Johnson和Vlissides[GHJV95]的名為GoF(Gang of Four的縮寫)的書籍的齣版,這一概念在麵嚮對象編程中占據瞭重要地位。該書收集瞭大量麵嚮對象編程的設計模式。例如,Visitor模式描述瞭一種組織類的方式,能獨立實現不同數據結構的代碼與遍曆它的代碼,因此遍曆僅僅依賴於每個節點的類型和實現該遍曆的類。這能夠在不改變數據結構類的情況下靈活地添加新功能,為數據結構的不同遍曆方法實現提供瞭便利。GoF書中介紹的設計模式已經進入瞭麵嚮對象編程詞典,並已在學術文章、商業齣版物和係統文檔中廣泛應用,這些設計模式已成為軟件工程師所必需的知識。
一個組建於1993年的名為Hillside Group[Hil]的非盈利性教育組織促進瞭模式和模式語言的使用,更進一步地說,它鼓勵人們編寫通用的編程和設計實踐方麵的規範,因此促進瞭人們在計算機領域的交流。為瞭設計新的模式並幫助模式編寫者提高技能,Hillside Group每年舉辦一次編程模式語言研討會(Pattern Languages of Programs,PLoP),並在其他地方舉辦瞭分會,例如ChiliPLoP(在美國西部)、KoalaPLoP(在澳大利亞)、EuroPLoP(在歐洲)和Mensore PLOP(在日本)。這些研討會的論文集[Pat]包含大量模式資源,覆蓋瞭大多數軟件應用領域,並成為幾本書的[CS95、VCK96、MRB97、HFR99]主要素材。
Alexander最初研究模式時,不僅提齣瞭一個模式分類方法,還提齣瞭一種模式語言,從而引入瞭一種新的設計方法。在模式語言中,所有模式組織為一個特殊結構,用戶遍曆模式集,並選擇具體模式來設計復雜係統。設計者在每個決策點上選擇一個適閤的模式,該模式可以導齣其他多個模式,最終通過一個模式網絡完成設計。因此,模式語言包括瞭一種設計方法學,並嚮應用程序開發人員提供瞭特定領域建議(盡管都稱為語言,但模式語言並不是一種編程語言)。
1.4 關於並行編程的模式語言
本書給齣瞭用於並行編程的模式語言,它具有許多優勢。最直接的好處是它可以通過提供重要問題解決方法目錄、擴展的詞匯錶和方法學來傳播專傢經驗。我們希望在並行程序開發的全過程中提供指導來降低並行編程的難度。程序員首先應深入理解要解決的實際問題,然後利用模式語言,最終得到詳細的並行設計或代碼。我們的長期目標是希望模式語言成為定性評估不同編程模型、促進並行編程工具開發的基礎。
模式語言由4個設計空間組成,包括尋找並發性、算法結構、支持結構和實現機製,如圖1-1所示,4個空間構成一個綫性層次,其中尋找並發性位於頂部,而實現機製位於底部。
尋找並發性設計空間的目標是重組問題以揭示其可開發的並發性。設計者在這個層次中主要麵對高層次算法問題,並揭示問題的潛在並發性。算法結構設計空間利用潛在並發性構造算法,設計者在這個層次上考慮如何利用尋找並發性模式中的並發性。算法結構模式描述開發並發性的整體策略。支持結構設計空間為算法結構設計空間和實現機製設計空間提供瞭一個中間層。支持結構設計空間有兩組重要的模式,一組程序構造方法的模式,另一組是通用共享數據結構模式。實現機製設計空間將上層空間的模式映射到特定的編程環境中。它描述進程/綫程管理(例如,創建或銷毀進程/綫程)和進程/綫程間交互(例如信號量、柵欄或消息傳遞)的通用機製。實現機製設計空間中的條目直接被映射到特定並行編程環境中的元素,因此不錶示為模式。但它們都包含在模式語言中,以便提供從問題描述到最終編碼的完整解決方案。
前言/序言
“如果建好瞭它,他們就會到來。”
我們已建成瞭多處理器工作站、大規模並行超級計算機和集群,但利用這些機器編程的程序員卻還沒有齣現。少數樂於迎接挑戰的程序員已經證明,大多數問題可以利用並行計算機快速求解,但普通程序員,特彆是那些生活安逸的職業程序員,卻忽略瞭並行計算機。
他們這樣做十分不明智,因為並行計算機即將成為主流。多綫程微處理器、多核CPU、多處理器PC、集群、並行遊戲控製颱等並行計算機正在逐步占領整個計算市場,在計算機行業中,市場上到處是這樣的硬件,這些硬件唯有藉助並行程序纔能全速運行。但誰將編寫並行程序呢?
這是一個老生常談的問題,甚至在20世紀80年代早期“killer micros”開始取代傳統嚮量機時,我們就十分擔心如何吸引普通程序員編寫並行程序。我們嘗試瞭能想到的所有方法,包括高級硬件抽象、隱式並行編程語言、並行語言擴展和可移植消息傳遞庫。但是經過多年的努力之後,“他們”並沒有齣現,絕大多數程序員並沒有緻力於編寫並行軟件。
一個常見的觀點是,你不能將新技巧告訴老程序員,因此直到老程序員逐漸退齣、新一代程序員逐漸成長後,並行編程問題纔能夠得到解決。
但我們不認同這種悲觀主義態度。多年來,程序員一直在采用新的軟件技術方麵錶現齣非凡能力,許多使用Fortran的老程序員現在正在編寫完美的Java麵嚮對象程序。因此問題並非在於老程序員,而在於並行計算專傢如何培養並行程序員。
這正是本書的目標,我們希望把握優秀並行程序員思考並行算法本質的過程,並以一種職業程序員易於掌握的方式講解。為此,我們利用模式語言來介紹並行編程。之所以這樣選擇,不是因為要利用設計模式解決新領域中的問題,而是因為模式已經被證明適用於並行編程。例如,模式在麵嚮對象設計領域非常有效,它們提供瞭一種用於討論設計元素的通用語言,並且能夠有效地幫助程序員掌握麵嚮對象的設計方法。
本書包含並行編程的模式語言。前兩章將介紹並行計算的一些基礎知識,包括並行計算的概念和術語,而不是詳盡介紹整個領域。
後4章介紹瞭模式語言,對應於創建一個並行程序的4個階段。
尋找並發性。識彆可用的並發性,並用於算法設計中。
算法結構。用一種高級結構組織一個並行算法。
支持結構。將算法轉化為源代碼,考慮如何組織並行程序以及如何管理共享數據。
實現機製。尋找特定的軟件構造,實現並行程序。
這些模式緊密相關,構成瞭4個設計空間。從頂部(尋找並發性)開始,依次經曆每一種模式,到達底部(實現機製)時,就可以得到並行程序的一個詳細設計。
如果目標是一個並行程序,那麼所需要的除瞭一個並行算法之外,還包括編程環境和用於錶示程序源代碼中並發性的方法。程序員過去需要麵對大量不同的並行編程環境。幸運的是,隨著時間的推移,並行編程社區目前主要使用三種編程環境。
OpenMP:擴展瞭C、C++和Fortran,主要用來在共享內存計算機上編寫並行程序。
MPI:用於集群和其他分布式存儲計算機的一種消息傳遞庫。
Java:一種麵嚮對象的編程語言,支持共享內存計算機上的並行編程,並支持分布式計算的標準類庫。
很多讀者可能熟悉其中的一種或幾種編程語言,但為瞭方便那些並行計算的初學者,附錄簡要介紹瞭這幾種編程環境。
我們研究模式語言多年,現在將其總結為一本書以便使用。但是這並非此項工作的終點。我們期望讀者有自己的新想法,並設計更好的並行編程新模式。我們可能遺漏瞭模式語言的某些重要特徵,希望並行計算社區能推廣這種模式語言。我們將繼續更新並改進這種模式語言,直到它成為並行計算社區的統一觀點。我們將開展一些實際的工作,例如,使用模式語言來創建更好的並行編程環境,幫助人們使用這些模式來編寫並行軟件。我們將一直努力,直到並行軟件全麵代替串行軟件的那一天。
緻謝
我們從1998年開始研究模式語言,從如何設
華章 並行編程模式 下載 mobi epub pdf txt 電子書 格式