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