范培勤,過武宏,唐 帥
(海軍潛艇學(xué)院,山東 青島 266199)
海水介質(zhì)及其邊界條件的復(fù)雜多變性,導(dǎo)致了聲波在海水中傳播規(guī)律的復(fù)雜多樣性。如何快速、準(zhǔn)確完成水聲傳播計算,為水聲傳感器提供實時、大范圍、長時間序列水聲傳播信息支持,對優(yōu)化和完善水聲傳感器的設(shè)計和使用具有重要的意義。隨著多核技術(shù)的快速發(fā)展,以多核處理器為計算核心的對稱多處理(Symmetrical Multi-Processing,SMP)集群成為應(yīng)用最為廣泛的高性能計算平臺。SMP集群將“分布式內(nèi)存結(jié)構(gòu)”和“共享式內(nèi)存結(jié)構(gòu)”兩種并行系統(tǒng)架構(gòu)結(jié)合在一起,既克服了SMP可擴(kuò)展性差的缺點,同時又具備集群高效通信的優(yōu)點,更適合采用節(jié)點內(nèi)內(nèi)存共享、節(jié)點間消息傳遞的多級混合并行編程模型[1-2]。在水聲傳播模型的并行計算方面,國內(nèi)科研人員做了大量的工作,王魯軍等[3]利用共享存儲(Open Multi-Processing,OpenMP)并行編程環(huán)境,在個人計算機(jī)上實現(xiàn)了拋物方程模型的并行計算,孫雪海等[4]研究了基于圖形處理器(Graphics Processing Unit,GPU)的水下三維聲場快速預(yù)報方法,張朝金等[5]利用多線程技術(shù)實現(xiàn)了射線模型的并行處理,范培勤等[6]利用消息傳遞+共享內(nèi)存(Message Passing Interface+Open Multi-Processing,MPI+OpenMP)混合并行編程模型,開展了水平不變聲道中WKBZ簡正波模型的并行計算方法研究,這些工作大多圍繞著水聲傳播模型本身的并行處理開展,力求實現(xiàn)單次水聲傳播計算的快速求解,難以直接應(yīng)用于大范圍海洋水聲傳播產(chǎn)品的快速預(yù)報。本文基于SMP集群,使用波束位移射線簡正波模型(BDRM)模型,采用MPI+OpenMP二級混合并行編程方法,通過在經(jīng)緯度方向進(jìn)行大粒度二級并行劃分,開展了大范圍水聲傳播產(chǎn)品并行預(yù)報技術(shù)研究,并結(jié)合水聲傳感器對環(huán)境保障信息的具體需求,實現(xiàn)了水聲傳播產(chǎn)品的快速預(yù)報。
多核處理器技術(shù)的快速發(fā)展,極大地促進(jìn)了SMP架構(gòu)計算機(jī)的普及。SMP并行機(jī)具有通信開銷小、易于編程等優(yōu)點,但受硬件架構(gòu)的限制,其處理器的數(shù)量通常不能超過100個,且隨著規(guī)模的增大,數(shù)量眾多的處理器在同時訪問共享內(nèi)存時容易引起內(nèi)存沖突,并會造成內(nèi)存訪問帶寬嚴(yán)重不足,極大限制了SMP并行機(jī)的可擴(kuò)展性;MPP和COW的特點是基于分布式存儲,具有良好的擴(kuò)展性,但存在處理器之間的通信開銷較大、編程困難等問題[7-8];SMP集群是多核技術(shù)和集群技術(shù)的完美結(jié)合,一方面,節(jié)點內(nèi)多個多核CPU,確保每個節(jié)點都具有較高的處理能力;另一方面,節(jié)點之間使用專用高速計算網(wǎng)絡(luò)進(jìn)行通信,提高了節(jié)點間通信速度。SMP集群,在保證高性能的同時,具有更高的可擴(kuò)展性和更強(qiáng)的連通性,使之成為當(dāng)今高性并行計算機(jī)的主流架構(gòu)。
SMP集群這種多層次體系結(jié)構(gòu)特點,決定了其可以采用消息傳遞并行編程模式與內(nèi)存共享并行編程模式混合編程模式來更高效地解決實際應(yīng)用問題。此時,節(jié)點間可以采用基于消息傳遞,完成粗粒度的任務(wù)并行化劃分,通過通信可以輕易地實現(xiàn)節(jié)點之間的數(shù)據(jù)傳遞和共享;節(jié)點內(nèi)采用基于共享內(nèi)存編程模式,可對節(jié)點分配的任務(wù)進(jìn)一步細(xì)化并行,實現(xiàn)細(xì)粒度的并行處理。從而實現(xiàn)編程環(huán)境與硬件結(jié)構(gòu)的有機(jī)融合,最大限度發(fā)揮這種層次化結(jié)構(gòu)的優(yōu)勢,有效提高并行系統(tǒng)的運(yùn)行效率和可擴(kuò)展性[9-11]。MPI+OpenMP混合并行程序執(zhí)行流程如圖1所示。
圖1 MPI+OpenMP混合并行程序執(zhí)行流程圖
海洋水聲傳播產(chǎn)品的計算,主要圍繞經(jīng)度和緯度方向上的二重循環(huán)開展,在計算過程中不需進(jìn)行數(shù)據(jù)交互[12],如圖2所示。本文先使用MPI消息傳遞的方式實現(xiàn)水聲傳播產(chǎn)品的并行預(yù)報,在此基礎(chǔ)上結(jié)合OpenMP共享內(nèi)存方式,實現(xiàn)二級混合并行預(yù)報。
圖2 海洋水聲環(huán)境參數(shù)計算過程
2.1.1 算法的設(shè)計 如上所述,海洋水聲傳播產(chǎn)品的計算主要圍繞著預(yù)報海區(qū)在經(jīng)度和緯度兩個方向上的循環(huán)開展,基于MPI的并行實現(xiàn)主要圍繞著二重循環(huán)的并行劃分進(jìn)行,其并行實現(xiàn)相對簡單,具體如下。
第一步:環(huán)境變量初始化。調(diào)用MPI_INIT函數(shù),完成MPI的初始化,通過MPI通信函數(shù)完成初始數(shù)據(jù)同步操作。
第二步:任務(wù)并行劃分。將預(yù)報海區(qū)按照緯度方向均勻劃分為與進(jìn)程數(shù)相等的相同大小的子海區(qū),并分配給具體進(jìn)程。
第三步:計算結(jié)果收集。調(diào)用MPI_REDUCE聚合通信函數(shù),將計算結(jié)果收集到進(jìn)程0。
2.1.2 算法的優(yōu)化 并行算法的設(shè)計和實現(xiàn)都相對簡單,但可能存在可擴(kuò)展性差、負(fù)載不均衡問題,這主要由以下原因引起。
(1)預(yù)報在經(jīng)緯度兩個方向開展,單個方向循環(huán)次數(shù)有限,以全球區(qū)域為例,按5'×5'的分辨率,經(jīng)度方向網(wǎng)格為4 320個,經(jīng)度方向為2 160個,最多可用4 320個進(jìn)程運(yùn)行此程序,嚴(yán)重影響可擴(kuò)展性。
(2)每個子區(qū)域中海洋所占的面積不同:在計算開始時首先會判斷計算任務(wù)所在位置是否為陸地,如為陸地則直接跳過該次循環(huán),由于預(yù)報區(qū)域海洋和陸地分布的不均勻性,計算海區(qū)按緯度均勻并行劃分必然會導(dǎo)致不同進(jìn)程所分配的計算量不一致,特別是當(dāng)進(jìn)程數(shù)較多時,負(fù)載不均衡問題會更加突出。
(3)不同子區(qū)域海水深度不一致:每個節(jié)點的計算量除與陸地面積所占比例相關(guān)外,還與分配的計算任務(wù)區(qū)域內(nèi)海水深度直接相關(guān),通常水深越大,計算量越大,水深分布的不均勻性也會造成嚴(yán)重的負(fù)載不均衡。
針對以上問題,主要從以下3方面對算法進(jìn)行了優(yōu)化:(1)將經(jīng)緯度方向上的二重循環(huán)調(diào)整為一重循環(huán),從而提高程序的并行性;(2)將陸地從預(yù)報海區(qū)中剔除,對剩余區(qū)域重新排序;(3)以剩余區(qū)域平均水深值作為第一級并行任務(wù)劃分的標(biāo)準(zhǔn),盡量使每個進(jìn)程所分配的計算區(qū)域的平均水深與區(qū)域平均水深值相等。
2.2.1 并行算法設(shè)計 第一步:環(huán)境變量初始化。完成環(huán)境場數(shù)據(jù)初始化,通過MPI完成初始場數(shù)據(jù)同步。
第二步:第一級并行(MPI)。將重新排序后的預(yù)報任務(wù)按水深平均值均勻劃分為與進(jìn)程數(shù)相等的子任務(wù),通過MPI消息傳遞接口,將子任務(wù)分配給對應(yīng)的計算節(jié)點。
第三步:第二級并行(OpenMP)。每一個節(jié)點OpenMP接口的初始化,設(shè)定for制導(dǎo)語句,啟動多線程,完成具體經(jīng)緯度點的水聲環(huán)境參數(shù)計算,計算完成后線程退出。
第四步:計算結(jié)果收集。計算完成后,調(diào)用MPI通信函數(shù),將計算結(jié)果收集到某一節(jié)點。
該算法首先調(diào)用MPI接口,實現(xiàn)計算任務(wù)在計算節(jié)點上的粗粒度劃分,然后在計算節(jié)點上調(diào)用OpenMP,啟動多線程,以共享內(nèi)存的實現(xiàn)具體位置點的水聲環(huán)境參數(shù)的預(yù)報,進(jìn)程數(shù)量減少到原來的(Nc為單計算節(jié)點配置的CPU總核數(shù)),有效降低了進(jìn)程規(guī)模,減少了MPI進(jìn)程初始化所需要的時間和進(jìn)程間通信的次數(shù)。計算流程如圖3所示。
圖3 海洋水聲環(huán)境參數(shù)預(yù)報混合并行算法計算流程圖
2.2.2 算法實現(xiàn) 海洋水聲傳播產(chǎn)品并行預(yù)報算法的實現(xiàn)主要圍繞著初始場數(shù)據(jù)預(yù)處理、循環(huán)的優(yōu)化、并行任務(wù)的二級劃分等具體編程實現(xiàn)開展。
(1)初始數(shù)據(jù)場處理
海洋初始場數(shù)據(jù)文件通常在幾千兆到幾十千兆,直接寫入內(nèi)存,會占用大量資源。另外,陸地區(qū)域在整個預(yù)報海區(qū)中占有較大比例,會嚴(yán)重影響并行任務(wù)劃分的負(fù)載均衡。因此,必須對初始場數(shù)據(jù)和預(yù)報海區(qū)進(jìn)行預(yù)處理,盡可能減少對內(nèi)存的占用,并保證各計算節(jié)點內(nèi)負(fù)載分配均衡。
① 數(shù)據(jù)讀取
為減少內(nèi)存的占用量,同時避免多個進(jìn)程同時讀寫初始場數(shù)據(jù)文件影響系統(tǒng)的I/O性能,在程序設(shè)計時,指定一個進(jìn)程對初始場數(shù)據(jù)進(jìn)行讀取和處理,處理完成后調(diào)用MPI通信函數(shù),將指定的數(shù)據(jù)分配給對應(yīng)進(jìn)程。
② 陸地剔除
陸地區(qū)域在整個預(yù)報海區(qū)中占有較大比例,在串行程序的計算過程中,可以通過對水深的判斷來確定是否為陸地,使用continue或break等語句來跳過陸地區(qū)域相關(guān)參數(shù)的計算,可有效地減少計算量。并行計算過程中,這雖然不會增加額外的計算量,但由于計算任務(wù)仍在總的循環(huán)過程中,極易造成進(jìn)程任務(wù)負(fù)載不均衡。本文在進(jìn)行初始場數(shù)據(jù)處理時,首先對陸地區(qū)域進(jìn)行篩除,然后對剩余的區(qū)域進(jìn)行重新排序,并記錄排序前后的對應(yīng)關(guān)系,最后對重新排序后的計算任務(wù)進(jìn)行并行分配。
③ 數(shù)據(jù)共享
初始聲速場處理完成后,通過調(diào)用MPI通信函數(shù),將聲速場數(shù)據(jù)發(fā)送至其他進(jìn)程,確保各進(jìn)程初始數(shù)據(jù)一致。
(2)循環(huán)優(yōu)化
為提高計算任務(wù)的并行度,將經(jīng)度和緯度方向上的二重循環(huán)改為一重循環(huán),實現(xiàn)過程如下所示。
優(yōu)化后,總的循環(huán)次數(shù)沒有改變,但任務(wù)的并行度可以提高至少三個數(shù)量級。
(3)子任務(wù)構(gòu)建
依據(jù)計算節(jié)點數(shù)和平均水深確定各子任務(wù)循環(huán)的起點和終點,具體如下。
(4)任務(wù)并行劃分
任務(wù)并行劃分主要完成計算任務(wù)在節(jié)點間并行分配和節(jié)點內(nèi)的并行計算兩步工作,具體實現(xiàn)如下:
① 節(jié)點間任務(wù)并行劃分
節(jié)點間任務(wù)的并行分配通過MPI實現(xiàn),劃分主要通過控制進(jìn)程號數(shù),將重新構(gòu)建的子任務(wù)分配到對應(yīng)計算節(jié)點。在實際并行劃分過程中需要結(jié)合進(jìn)程數(shù)和測試情況,對平均水深進(jìn)行適當(dāng)調(diào)整,盡可能達(dá)到負(fù)載均衡,減小程序運(yùn)行時間。
② 節(jié)點內(nèi)任務(wù)并行計算
節(jié)點內(nèi)任務(wù)的并行計算通過調(diào)用OpenMP模式的for并行編譯制導(dǎo)語來實現(xiàn),如下所示。
OpenMP并行編程的實現(xiàn)相對簡單,但要處理好變量的共享和私有以及變量在進(jìn)入和退出并行域邊界的拷貝等問題。
利用海軍潛艇學(xué)院超算平臺對混合并行程序進(jìn)行了測試,該平臺共有314個計算節(jié)點,單節(jié)點配置雙路V3 CPU,共24顆計算核心,內(nèi)存128 GB,計算網(wǎng)絡(luò)采用56 Gb/s InfiniBand交換機(jī)。
通過對比同等計算規(guī)模情況下MPI并行程序與MPI+OpenMP混合并行程序的計算時間的方法,來比較混合編程算法的優(yōu)缺點。為便于表達(dá)兩種模式的計算性能,測試過程中按如下原則設(shè)定進(jìn)程數(shù)和線程數(shù)。
(1)在MPI模式中,單節(jié)點啟動的進(jìn)程數(shù)與計算核心數(shù)相同。
(2)在MPI+OpenMP模式中,單節(jié)點只啟動一個進(jìn)程,啟動的線程數(shù)與物理核數(shù)相等。
(3)統(tǒng)一用核心數(shù)來表示參與計算的計算資源數(shù)量,即每一核心運(yùn)行一個線程或進(jìn)程。
表1為MPI與MPI+OpenMP并行程序在集群上的測試結(jié)果。圖4和圖5分別為其對應(yīng)的效率和加速度。
表1 MPI與MPI+OpenMP混合并行算法計算時間(s)
圖4 并行程序執(zhí)行效率圖
圖5 并行程序執(zhí)行加速比圖
從圖4和圖5可以看出,隨著參與計算核心數(shù)的增加MPI+OpenMP程序具有更高的并行效率,其加速比基本呈線性增加,比MPI程序具有更好的擴(kuò)展性。MPI+OpenMP混合編程模式通過節(jié)點內(nèi)共享內(nèi)存和節(jié)點間消息傳遞的方式,可有效地解決功效能存模式難以擴(kuò)展和消息傳遞模式下進(jìn)程通信開銷較大的難題,其計算性能和可擴(kuò)展性遠(yuǎn)高于單一編程模式的計算結(jié)果。
本文采用MPI+OpenMP混合并行編程模式,實現(xiàn)了海洋水聲傳播產(chǎn)品的快速預(yù)報。測試結(jié)果表明,該方法將SMP集群的體系架構(gòu)與并行編程模式結(jié)合起來,充分發(fā)揮MPI與OpenMPI各自的優(yōu)勢,大幅降低水聲傳播產(chǎn)品的預(yù)報時間,為海洋環(huán)境大規(guī)模并行預(yù)報問題的快速高效處理提供一種解決思路,下一步計劃開展海洋-聲學(xué)耦合預(yù)報混合并行處理方法的研究。