對於正在編程的程序員,編程模型可被看作一颱虛擬機,並可通過編程語言和函數庫實現。如果某個編程模型成為計算機科學研究中的熱點,需要具有以下特性:高效性(易於描述各種抽象算法)、移植性(兼容各種硬件計算平颱)、高性能(高效均衡地利用硬件平颱的計算能力)、通用性(廣泛地描述各種算法)。針對特定的編程模型,同時具有上述四種特性中的一種或兩種相對容易,但同時具備這四種特性幾乎是不可能的。特定的編程模型無法同時具備四種特性的主要原因在於編程模型的多樣性,因此需要根據具體的科學應用,選擇不同的編程模型特性。 隨著並行計算技術的發展,計算機科學領域的專傢將研究重點轉移到能夠適應高性能並行計算和超級計算係統的編程模型設計方嚮。並行編程模型包含執行模型(選擇代碼執行路徑)和內存模型(管理計算節點間和節點內的數據流)。多核計算需要並發計算和移動數據,這增加瞭程序運行結果和性能的不確定性,導緻並行編程模型變得更加復雜。 從技術上分析,編程模型和編程係統間存在一定區彆。編程模型是一種編程方式,例如采用大量同步或者隱含編譯器協助的並行化方式,而編程係統指程序員編寫程序時實際使用的係統抽象接口。隨著時間推移,編程模型和編程係統間的區彆逐漸變得模糊。目前,編程模型既是一種編程方式,也是模型實例化過程中所使用的係統抽象接口。 與通用的編程模型設計不同,在大多數並行係統中,程序開發人員往往不采用單一的並行編程模型。不同的開發人員會選擇不同層次的虛擬化方式,並在高效性、移植性、高性能和通用性四種編程模型特性中選擇不同的組閤。針對麵嚮終端的程序開發應用,具體研究領域的科學傢通常傾嚮於選擇更高效和高級彆的編程模型,即使該編程模型隻能針對特定的算法而缺乏通用性。針對編程語言和函數庫,程序開發者一般更傾嚮於選擇高性能和低級彆的編程模型,即使該編程模型具有較高的使用難度。然而,針對麵嚮終端的程序應用以及編程語言和函數庫開發,上述編程模型選擇並非是絕對的,可根據實際的開發應用情況進行調整。 關於本書 本書對當今高性能計算以及超級計算係統上的幾種最主要的並行編程模型進行瞭概述。書中包含多種並行編程模型,它們擁有不同的生産效率、可移植性、性能以及錶達範圍。因此,讀者可以學習和理解每種編程模型提供瞭哪些摺中。 第1章討論瞭消息傳遞接口(MPI)。MPI是當今麵嚮分布式內存計算的最重要的並行編程模型。該章對MPI最常用的功能進行瞭概述,並涉及MPI標準的第三個主要版本 ——MPI-3。 第2~5章從低層次的運行時庫到高層次的編程模型,對單邊通信模型進行瞭討論。第2章介紹瞭全局地址空間網絡(GASNet),它是一種低層次的編程模型,用於多種分區全局地址空間(PGAS)模型的一種通用可移植運行時係統。第3章討論瞭OpenSHMEM單邊通信庫,它用於嚮用戶直接呈現本地硬件通信功能。OpenSHMEM通過擴展庫的形式模擬瞭許多PGAS模型的功能,這樣做的好處是不依賴於語言擴展及相應的編譯器支持。第4章提供瞭Unified Parallel C(UPC)編程模型的概述。UPC是基於C語言的PGAS模型,它為全局地址空間內存的創建與管理提供瞭相應的語言擴展及庫接口。第5章介紹瞭全局數組(GA),與OpenSHMEM類似,GA是另一種基於庫的單邊通信模型。但GA基於多維數組提供瞭更高層次的抽象,以方便用戶編程。 第6章討論瞭Chapel。它是一種高生産率編程模型,支持以任務並行及數據並行兩種方式對應用進行描述。Chapel同時也具有一級語言概念,可對局部性進行描述與推理,這與它支持的並行特性是互不相關的。 第7~11章展示瞭麵嚮任務的編程模型,它們允許用戶以任務的方式描述計算及數據單元,並允許運行時係統來管理計算以及必要的數據移動。第7章對Charm++編程模型進行瞭討論。Charm++提供瞭一種依賴於工作過分解的抽象模型,以在可用的計算單元間動態地管理任務。第8章深入討論瞭異步動態負載均衡(ADLB)庫,它提供瞭另一種麵嚮任務的工作共享方法,並以MPI作為低層次的通信模型。第9章討論瞭可擴展任務對象集閤(Scioto)編程模型,它依賴於類似PGAS的單邊通信框架來實現基於工作竊取的負載均衡。第10章描述瞭Swift,它是一種高層次的腳本語言,允許用戶使用高層次語義對計算進行描述,並在內部將其翻譯成其他麵嚮任務的編程模型,如ADLB。第11章描述瞭並行集(CnC),它是一種高層次的聲明式模型,允許用戶將應用描述為由相互通信的內核構成的圖。 第12~16章展示瞭麵嚮節點內並行的編程模型,涉及的硬件環境包括多核架構、加速器以及兩者同時存在的情況。第12章討論瞭OpenMP。OpenMP是當今科學計算領域最重要的節點內並行編程模型。該章介紹瞭OpenMP的進化曆程以及核心特性,並涉及OpenMP 4.0。第13章討論瞭Cilk Plus編程模型,它是一種對C及C++語言的並行擴展,用於在現代共享內存多核機器上開發規則以及非規則並行。第14章討論瞭Intel TBB(Threading Building Block),它是一個基於C++模闆類實現的庫。與Cilk Plus類似,TBB支持共享內存多核架構上的並行執行。第15章討論瞭NVIDIA提供的CUDA(Compute Unified Device Architecture)編程模型。CUDA通過單指令多綫程塊運行方式來支持NVIDIA圖形處理單元上的並行計算。盡管CUDA是NVIDIA設備上的專有編程模型,但CUDA在並行編程社區中具有廣泛影響力,並在應用中得到廣泛使用,因此第15章對CUDA進行瞭討論。第16章描述瞭OpenCL(Open Computing Language)模型,它提供瞭一個低層次的、平颱無關的編程模型,可以在不同異構架構上進行編程,其中包括圖形處理單元。 本書對不同編程模型的講解方式在其他書籍中是很少見的。尤其是通過使用說明的方式來展示材料,而不是以更正式的類似於研究論文的方式展示。本書不是一個緻力於詳細描述每個編程模型語法及語義的參考手冊。本書的目標是描述使用這些模型進行並行編程的通用方法,以及每種方法所實現的目標。不過,本書提供瞭一些模型所提供的核心接口的語法及語義定義,我們將這些定義作為編程模型所提供抽象的例子。提供這些定義的目的是提高內容的可讀性。這些定義並不一定是最重要的或最常用的接口,而隻是作為例子說明如何使用該編程模型。 緻謝 首先感謝對本書不同章節做齣貢獻的所有作者: 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對本書的整體貢獻以及對修辭的潤色。 我也要感謝阿貢國傢實驗室的數學與計算機科學部的技術作傢Gail Pieper,她對本書的格式以及用法進行瞭不可或缺的指導,極大地提高瞭本書的可讀性。