對于正在編程的程序員,編程模型可被看作一臺虛擬機,并可通過編程語言和函數(shù)庫實現(xiàn)。如果某個編程模型成為計算機科學研究中的熱點,需要具有以下特性:高效性(易于描述各種抽象算法)、移植性(兼容各種硬件計算平臺)、高性能(高效均衡地利用硬件平臺的計算能力)、通用性(廣泛地描述各種算法)。針對特定的編程模型,同時具有上述四種特性中的一種或兩種相對容易,但同時具備這四種特性幾乎是不可能的。特定的編程模型無法同時具備四種特性的主要原因在于編程模型的多樣性,因此需要根據(jù)具體的科學應用,選擇不同的編程模型特性。
隨著并行計算技術的發(fā)展,計算機科學領域的專家將研究重點轉移到能夠適應高性能并行計算和超級計算系統(tǒng)的編程模型設計方向。并行編程模型包含執(zhí)行模型(選擇代碼執(zhí)行路徑)和內存模型(管理計算節(jié)點間和節(jié)點內的數(shù)據(jù)流)。多核計算需要并發(fā)計算和移動數(shù)據(jù),這增加了程序運行結果和性能的不確定性,導致并行編程模型變得更加復雜。
從技術上分析,編程模型和編程系統(tǒng)間存在一定區(qū)別。編程模型是一種編程方式,例如采用大量同步或者隱含編譯器協(xié)助的并行化方式,而編程系統(tǒng)指程序員編寫程序時實際使用的系統(tǒng)抽象接口。隨著時間推移,編程模型和編程系統(tǒng)間的區(qū)別逐漸變得模糊。目前,編程模型既是一種編程方式,也是模型實例化過程中所使用的系統(tǒng)抽象接口。
與通用的編程模型設計不同,在大多數(shù)并行系統(tǒng)中,程序開發(fā)人員往往不采用單一的并行編程模型。不同的開發(fā)人員會選擇不同層次的虛擬化方式,并在高效性、移植性、高性能和通用性四種編程模型特性中選擇不同的組合。針對面向終端的程序開發(fā)應用,具體研究領域的科學家通常傾向于選擇更高效和高級別的編程模型,即使該編程模型只能針對特定的算法而缺乏通用性。針對編程語言和函數(shù)庫,程序開發(fā)者一般更傾向于選擇高性能和低級別的編程模型,即使該編程模型具有較高的使用難度。然而,針對面向終端的程序應用以及編程語言和函數(shù)庫開發(fā),上述編程模型選擇并非是絕對的,可根據(jù)實際的開發(fā)應用情況進行調整。
關于本書 本書對當今高性能計算以及超級計算系統(tǒng)上的幾種最主要的并行編程模型進行了概述。書中包含多種并行編程模型,它們擁有不同的生產(chǎn)效率、可移植性、性能以及表達范圍。因此,讀者可以學習和理解每種編程模型提供了哪些折中。
第1章討論了消息傳遞接口(MPI)。MPI是當今面向分布式內存計算的最重要的并行編程模型。該章對MPI最常用的功能進行了概述,并涉及MPI標準的第三個主要版本 ——MPI-3。
第2~5章從低層次的運行時庫到高層次的編程模型,對單邊通信模型進行了討論。第2章介紹了全局地址空間網(wǎng)絡(GASNet),它是一種低層次的編程模型,用于多種分區(qū)全局地址空間(PGAS)模型的一種通用可移植運行時系統(tǒng)。第3章討論了OpenSHMEM單邊通信庫,它用于向用戶直接呈現(xiàn)本地硬件通信功能。OpenSHMEM通過擴展庫的形式模擬了許多PGAS模型的功能,這樣做的好處是不依賴于語言擴展及相應的編譯器支持。第4章提供了Unified Parallel C(UPC)編程模型的概述。UPC是基于C語言的PGAS模型,它為全局地址空間內存的創(chuàng)建與管理提供了相應的語言擴展及庫接口。第5章介紹了全局數(shù)組(GA),與OpenSHMEM類似,GA是另一種基于庫的單邊通信模型。但GA基于多維數(shù)組提供了更高層次的抽象,以方便用戶編程。
第6章討論了Chapel。它是一種高生產(chǎn)率編程模型,支持以任務并行及數(shù)據(jù)并行兩種方式對應用進行描述。Chapel同時也具有一級語言概念,可對局部性進行描述與推理,這與它支持的并行特性是互不相關的。
第7~11章展示了面向任務的編程模型,它們允許用戶以任務的方式描述計算及數(shù)據(jù)單元,并允許運行時系統(tǒng)來管理計算以及必要的數(shù)據(jù)移動。第7章對Charm++編程模型進行了討論。Charm++提供了一種依賴于工作過分解的抽象模型,以在可用的計算單元間動態(tài)地管理任務。第8章深入討論了異步動態(tài)負載均衡(ADLB)庫,它提供了另一種面向任務的工作共享方法,并以MPI作為低層次的通信模型。第9章討論了可擴展任務對象集合(Scioto)編程模型,它依賴于類似PGAS的單邊通信框架來實現(xiàn)基于工作竊取的負載均衡。第10章描述了Swift,它是一種高層次的腳本語言,允許用戶使用高層次語義對計算進行描述,并在內部將其翻譯成其他面向任務的編程模型,如ADLB。第11章描述了并行集(CnC),它是一種高層次的聲明式模型,允許用戶將應用描述為由相互通信的內核構成的圖。
第12~16章展示了面向節(jié)點內并行的編程模型,涉及的硬件環(huán)境包括多核架構、加速器以及兩者同時存在的情況。第12章討論了OpenMP。OpenMP是當今科學計算領域最重要的節(jié)點內并行編程模型。該章介紹了OpenMP的進化歷程以及核心特性,并涉及OpenMP 4.0。第13章討論了Cilk Plus編程模型,它是一種對C及C++語言的并行擴展,用于在現(xiàn)代共享內存多核機器上開發(fā)規(guī)則以及非規(guī)則并行。第14章討論了Intel TBB(Threading Building Block),它是一個基于C++模板類實現(xiàn)的庫。與Cilk Plus類似,TBB支持共享內存多核架構上的并行執(zhí)行。第15章討論了NVIDIA提供的CUDA(Compute Unified Device Architecture)編程模型。CUDA通過單指令多線程塊運行方式來支持NVIDIA圖形處理單元上的并行計算。盡管CUDA是NVIDIA設備上的專有編程模型,但CUDA在并行編程社區(qū)中具有廣泛影響力,并在應用中得到廣泛使用,因此第15章對CUDA進行了討論。第16章描述了OpenCL(Open Computing Language)模型,它提供了一個低層次的、平臺無關的編程模型,可以在不同異構架構上進行編程,其中包括圖形處理單元。
本書對不同編程模型的講解方式在其他書籍中是很少見的。尤其是通過使用說明的方式來展示材料,而不是以更正式的類似于研究論文的方式展示。本書不是一個致力于詳細描述每個編程模型語法及語義的參考手冊。本書的目標是描述使用這些模型進行并行編程的通用方法,以及每種方法所實現(xiàn)的目標。不過,本書提供了一些模型所提供的核心接口的語法及語義定義,我們將這些定義作為編程模型所提供抽象的例子。提供這些定義的目的是提高內容的可讀性。這些定義并不一定是最重要的或最常用的接口,而只是作為例子說明如何使用該編程模型。
致謝 首先感謝對本書不同章節(jié)做出貢獻的所有作者:
William D. Gropp,伊利諾伊大學厄巴納-香檳分校 Rajeev Thakur,阿貢國家實驗室 Paul Hargrove,勞倫斯伯克利國家實驗室 Jeffery A. Kuehn,橡樹嶺國家實驗室 Stephen W. Poole,橡樹嶺國家實驗室 Kathy Yelick,加州大學伯克利分校,勞倫斯伯克利國家實驗室. Yili Zheng,勞倫斯伯克利國家實驗室 Sriram Krishnamoorthy,美國太平洋西北國家實驗室 Jeff Daily,美國太平洋西北國家實驗室 Abhinav Vishnu,美國太平洋西北國家實驗室 Bruce Palmer,美國太平洋西北國家實驗室 Bradford L. Chamberlain,Cray公司 Laxmikant Kale,伊利諾伊大學厄巴納–香檳分校 Nikhil Jain,伊利諾伊大學厄巴納–香檳分校 Jonathan Lifflander,伊利諾伊大學厄巴納–香檳分校 Ewing Lusk,阿貢國家實驗室 Ralph Butler,中田納西州州立大學 Steven C. Pieper,阿貢國家實驗室 James Dinan,Intel公司 Timothy Armstrong,芝加哥大學 Justin M. Wozniak,阿貢國家實驗室,芝加哥大學 Michael G.Burke,阿貢國家實驗室,芝加哥大學 Ian T. Foster,阿貢國家實驗室,芝加哥大學 Kath Knobe,萊斯大學 Michael G. Burke,萊斯大學 Frank Schlimbach,Intel公司 Barbara Chapman,休斯敦大學 Deepak Eachempati,休斯敦大學 Sunita Chandrasekaran,休斯敦大學 Arch D. Robinson,Intel公司 Charles E. Leiserson,麻省理工學院 Alexey Kukanov,Intel公司 Wen-mei Hwu,伊利諾伊大學厄巴納–香檳分校 David Kirk,NVIDIA公司 Tim Mattson,Intel公司 尤其感謝Ewing Lusk以及William Gropp對本書的整體貢獻以及對修辭的潤色。
我也要感謝阿貢國家實驗室的數(shù)學與計算機科學部的技術作家Gail Pieper,她對本書的格式以及用法進行了不可或缺的指導,極大地提高了本書的可讀性。