郭福洲
摘? 要:步入信息高速快車的時代,基于MPI的并行計算是解決物聯網、圖像處理獲取數據,人工智能處理數據的重要途徑之一;同時也是MIMD(多指令多機)并行計算實現高效、高速目標的重要策略與方法。筆者從MPI(Message-Passing-Interface 消息傳遞接口)一個跨語言的通信協(xié)議機制,通過Linux或Windows操作系統(tǒng)平臺,以C++語言平臺為基礎,論述并行計算實現幾種方法。
關鍵詞:MPI? 并行計算? 算法? 進程? 消息? 通信
中圖分類號:TP301? ? ? ?文獻標識碼:A
Abstract: In the era of information high-speed train, MPI-based parallel computing is one of the important ways to solve the Internet of Things, image processing to obtain data, and artificial intelligence to process data; It is also an important strategy and method for MIMD (multiple instruction multiple machine) parallel computing to achieve high efficiency and high speed. Starting from MPI (Message-Passing-Interface), a cross-language communication protocol mechanism, through Linux or Windows operating system platform, based on the C++ language platform, the author discusses several ways to realize parallel computing.
Key Words: MPI; Parallel computing; Algorithm; Process; Message; Communication
1? 并行計算發(fā)展的背景
經歷幾十年來電子信息產業(yè)的軟硬件相互倒逼、促進與發(fā)展,人類在許多領域(如:空間氣象與遙感、圖像處理與捕捉、物聯網、人工智能、虛擬現實等)發(fā)展迅猛。但隨著人類在科學領域對信息與數據處理數量規(guī)模與速度的要求更高,對數據處理、信息交換與傳輸效能、速度也在不斷地增加,并行計算[1]與分布式系統(tǒng)調度等新型算法與程控策略也更加日新月異。硬件搭臺(基礎),軟件唱戲(調度與并行計算編程),從硬件實現并行計算基礎層面來看:以網絡系統(tǒng)支撐重要結點――計算機為標志,單機性能大幅度提升的主要舉措有:日益增加的集成電路晶體管密度、將提升信息傳遞速度增快與集成電路的散熱能力已經達到極致,發(fā)展多核處理器;從軟件實現并行編程與計算層面來看:著力編寫任務并行和數據并行的程序,以期更大程度上利用多核處理器將有待解決的問題分解成的任務與數據科學分配并均衡到各個核上完成。
為實現這一目標的并行硬件基礎構建:主存+CPU+總線(互連設備)。采用Flynn(費林)法基于指令和數據流方式分類,即,可以將并行計算機劃分為SISD、MISD、SIMD和MIMD四種。
除SISD系統(tǒng)外,其他三個才是真正的并行計算系統(tǒng)[2]。其中,SIMD是以同一指令進行對多個數據執(zhí)行操作,進而實現完成對多數據流進行同時計算的目的。因此,該系統(tǒng)非常適合處理大型數組的簡單循環(huán),從此衍生出向量處理器[3],重點對數組或數據向量進行操作。我們常說的GPU(graphics processing unit)圖形處理器計算機就是講物體表面的內部表示為使用點、線、面的像素數組來表示的,其初期也是一個概念上的SIMD系統(tǒng),不過隨著技術的發(fā)展,現代GPU也可以有幾十個核,每個核也能獨立地執(zhí)行指令流。
在并行計算中,一般將MIMD作為主要研究對象。其中MIMD系統(tǒng)有兩種類型:共享內存系統(tǒng)(見圖1)和分布式內存系統(tǒng)(見圖2)。
在共享內存系統(tǒng)中,自治的CPU通過互連網絡與內存系統(tǒng)相連,每個CPU都能訪問每個內存系統(tǒng)中的內存。分布式內存系統(tǒng)中,每個CPU都有自己的獨立內存,每個單元之間的內存訪問通過消息通信或者特殊的函數來進行。
軟件編程實現并行計算的策略:無論哪一種互連,均需分布式運算調度與并行計算作為靈魂支撐。SPMD(單程序多數據流):指的不是在每個核上運行不同的程序,而是一個程序僅包含一份代碼,通過一定的條件分支,使得這一份代碼再執(zhí)行的時候表現得像是在不同的處理器上執(zhí)行不同的代碼。
以MIMD分布式內存系統(tǒng)來說,其CPU 各個內核以DMA方式各自訪問自身內存,負責處理CPU核之間通信的進程進行數據交換時,則只好通過消息[4]傳遞API來處理。負責消息傳遞API需提供至少一對發(fā)送函數和接收函數。并通過它們的序號(rank)來標識。
并行計算程序的編寫主要目的當然是為了提供它們的性能,那么我們應該如何去評價一個并行計算程序的性能呢?答案是:加速比S=T串行T并行S=T串行T并行與效率E=T串行P×T并行E=T串行P×T并行。
理論上而言,如果使用p個進程或者線程來運行一個并行程序,并且每個核中之多只有一個進程/線程,那么,S=p,E=1。但是在實際情況下,S<p, E<1。假設我們已具備如何評判由串行程序改為并行程序性能的能力,若現有一串行程序,為了提高性能,我們如何將串行程序改為并行計算程序獲取高性能?從理論層面策略實現如何分步?一般情況下,需要將工作進行拆分,使得分布在每個進程中的工作量均衡,并行讓它們之間的通信量最少。于是串行程序并行化設計策略展開一般按以下幾步進行:
第一步:劃分。將串行程序細分并序化成為與為一個個具備獨立并行執(zhí)行的任務,每個任務都包含自己的指令與數據集;
第二步:通信。確定第一步識別出來的任務之間需要執(zhí)行那些通信。
第三步:凝聚/聚合。將第一步確定的任務與通信結合成上層宏觀任務。
第四步:分配。將層宏觀任務再分配至進程/線程。這一步我們就關注:應讓通信量最小化,并保證各個進程/線程所領受的工作量基本均衡。
由務虛的理論走向務實,實現的手段有:MPI(Message-Passing-Interface 消息傳遞接口,后簡稱MPI)、Pthreads、OpenMP、OpenCL、GPU、Hadoop等,該文僅就MPI為主要闡述對象,討論其實現并行算法的途徑。
2? MPI的特性與并行編程機制
MPI(Message-Passing-Interface 消息傳遞接口)其任務是在并行計算進程之間完成消息傳遞。傳遞層級為進程層級。它并非編程語言,而是一個獨立且可被Fortran、C++和c#程序調用的函數庫。它主要集成了可供兩個進程之間進行各種情況通信處理的函數。并且其在Windows、Linux等不同平臺環(huán)境中都有對應的庫。該文所述其應用實踐,是以Windows10為開發(fā)環(huán)境為背景。
MPI定義了獨特的數據類型參數,不采用字節(jié)計數,而是以數據類型為單位指定消息長度;對于C和Fortran,MPI均預定義了一組數據類型和一些附加的數據類型;可以發(fā)送或接收連續(xù)的數據,還可以處理不連續(xù)的數據;允許發(fā)送和接收不同的數據類型。
MPI與OpenMP并行程序的區(qū)別是:MPI是一種基于信息傳遞的并行編程技術。消息[5]傳遞接口是一種編程接口標準,并非一種具體的編程語言。簡言之,MPI標準定義了一組具有可移植性的編程接口。主要的MPI-1模型不包括共享內存概念,MPI-2也只有有限的分布共享內存概念。 但MPI程序經常在共享內存的機器上運行。在MPI模型周邊設計程序比在NUMA架構下設計要好,是因為MPI鼓勵內存本地化。盡管MPI屬于OSI參考模型的第五層(會話層)或者更高,他的實現可能通過傳輸層的sockets和Transmission Control Protocol (TCP)覆蓋大部分的層。大部分的MPI實現由一些指定慣例集(API)組成,可由有此類庫的語言比如C#, Java or Python直接調用。從通信[6]角度上,可視作為一個跨語言平臺的通信協(xié)議,用于計算機編寫程序實現并行計算。支持點對點和廣播。MPI作為一個信息傳遞應用程序接口,包括協(xié)議和和語義說明,用以說明其如何在各種實現中發(fā)揮其特性。MPI的特點是高性能、大規(guī)模性和可移植性。MPI在今天仍為高性能計算的主要模型。
MPI實現并行是進程級;采用的是分布式內存系統(tǒng),顯式(數據分配方式)實現并行執(zhí)行,通過通信在進程之間進行消息傳遞,有較好的可擴展性。MPI雖適合于各類機型,但其編程模型復雜:需要分析及劃分應用程序問題,并將問題映射到分布式進程集合;并需解決通信延遲長和負載不平衡兩大主要問題。
3? MPI安裝與設置要領
(1)MPI以mpich2-1.4.1p1-win-ia32.msi版本下載,地址http://www.mpich.org/static/downloads/1.4.1p1/ ,下載完成后直接安裝,安裝過程中使用者那里選擇everyone,其他的都默認。
(2) 以管理員的身份運行CMD(命令行),輸入MPICH[5]的安裝路徑來到bin目錄下,然后輸入 smpd –install -phrase [你的關鍵字,默認是behappy]。
(3)為了使計算機群能夠使用MPI,應該給每一個安裝MPI的計算機添加一個相同的賬戶,賬戶密碼必須相同,賬戶要求是管理員的身份。比如所有的計算機都添加一個賬號為mpi,密碼是mpi的用戶。
(4)在MPICH的安裝目下的bin文件夾中找到wmpiregister.exe,將第二步注冊的賬戶密碼添加進去,然后點擊確定。
(5)打開wmpiexec,在Application那一欄選擇MPICH安裝后自帶的例子,測試是否安裝成功,勾選run in an separate window,點擊Execute執(zhí)行。
4 結語
MPI標準,集成了核心庫的語法和語義,其函數庫可被Fortran、C調用,形成可移植的信息傳遞程序。MPI提供了適應各種并行硬件商的基礎集,它們都能被有效地實現。這促進了硬件廠商可以基于這一系列底層標準來創(chuàng)建高層次的慣例,從而為分布式內存交互系統(tǒng)提供并行機型。MPI還提供了一個簡單易用的可移植接口,極大方便了程序員可以用它在高級機器上進行高性能信息傳遞操作。但MPI接口標準定義的思想與參數定義的原則秘而不宣,也在一定程度上制約了編程開發(fā)技術人員思維的廣度、深度與拓展力。
參考文獻
[1]周志強,崔國民,楊嶺,等.一種基于并行計算的混和算法優(yōu)化有分流換熱網絡[J/OL].化工學報:1-20[2021-09-23].http://kns.cnki.net/kcms/detail/11.1946.TQ.20210913.1556.002.html.
[2]李銘,丁衛(wèi)平,鞠恒榮,等.基于Spark的證據鄰域粗糙并行分類高效算法[J].南京理工大學學報,2021,45(4):409-419.
[3] CHANG? D, LI? L, CHANG Y,et al.Implementation of MapReduce parallel computing framework based on multi-data fusion sensors and GPU cluster[J]. EURASIP Journal on Advances in Signal Processing,2021(1):1-14.
[4]鄔江興,祁曉峰,高彥釗.異構計算并行編程模型綜述[J].上海航天(中英文),2021,38(4):1-11.
[5]王如斌,李瑞遠,何華均,等.面向海量空間數據的分布式距離連接算法[J/OL].計算機科學:1-10[2021-09-23].http://kns.cnki.net/kcms/detail/50.1075.TP.20210819.1850.054.html.
[6]肖漢,郭寶云,李彩林,等.面向異構架構的傳遞閉包并行算法[J].計算機工程,2021,47(8):131-139.