符棟良
(上海市特種設(shè)備監(jiān)督檢驗技術(shù)研究院)
基于PC機(jī)群的并行計算是當(dāng)前國際上計算機(jī)科學(xué)與應(yīng)用領(lǐng)域中引人注目的課題之一,該領(lǐng)域的研究在我國現(xiàn)階段科研條件下有著很強(qiáng)的現(xiàn)實意義。在諸如預(yù)測模型的構(gòu)造和模擬、工程設(shè)計和自動化、能源勘探、醫(yī)學(xué)、軍事以及基礎(chǔ)理論研究等領(lǐng)域,都對計算提出了極高的具有挑戰(zhàn)性的要求,所以對并行計算有很迫切的需求。
本文采用的網(wǎng)絡(luò)并行環(huán)境是MPI(message passing interface),MPI是目前最重要的實現(xiàn)消息傳遞的并行編程環(huán)境之一,它具有移植性好、功能強(qiáng)大、效率高等多種優(yōu)點(diǎn)[1]。具體地講,MPI就是提供了并行庫。這樣,原來的串行編譯器能夠繼續(xù)使用,編程者只需要在原來的串行程序中加入對并行庫的調(diào)用,就可以實現(xiàn)并行程序設(shè)計。在MPI-1中共有128個調(diào)用接口,在MPI-2中有287個。應(yīng)該說MPI是比較龐大的,想完全掌握這么多的調(diào)用很困難。但是,從理論上說,MPI所有的通信功能可以用它的6個基本的調(diào)用來實現(xiàn),掌握了這6個調(diào)用,就可以實現(xiàn)所有的消息傳遞并行程序的功能。因此,下面介紹這6個最基本的調(diào)用[1]。
(1) MPI初始化
MPI_Init()
MPI_Init是MPI程序的第一個調(diào)用,它完成MPI程序所有的初始化工作,是所有MPI程序的第一條可執(zhí)行語句。
(2) MPI結(jié)束
MPI_Finalize()
MPI_Finalize是MPI程序的最后一個調(diào)用,它結(jié)束MPI程序的運(yùn)行,是MPI程序的最后一條可執(zhí)行語句。
(3)當(dāng)前進(jìn)程標(biāo)識
MPI_Comm_rank(comm,rank)
comm——該進(jìn)程所在的通信域
rank——調(diào)用進(jìn)程在comm中的標(biāo)識號
這一語句用來返回調(diào)用給定的通信域中的進(jìn)程標(biāo)識號。有了這一標(biāo)識號,不同的進(jìn)程就可以將自身和其它的進(jìn)程區(qū)別開來,從而實現(xiàn)各進(jìn)程的并行和協(xié)作。
(4)通信域包含的進(jìn)程數(shù)
MPI_Comm_size(comm,size)
comm——通信域
size——通信域comm內(nèi)包括的進(jìn)程數(shù)
這一調(diào)用返回給定的通信域中所包括的進(jìn)程的個數(shù),不同的進(jìn)程通過這一調(diào)用得知在給定的通信域中一共有多少個進(jìn)程在并行執(zhí)行。
(5) 消息發(fā)送
MPI_Send(buf,count,datatype,dest,tag,comm)
buf——發(fā)送緩沖區(qū)的起始地址
count——將發(fā)送的數(shù)據(jù)的個數(shù)
datatype——發(fā)送數(shù)據(jù)的數(shù)據(jù)類型
dest——目的進(jìn)程標(biāo)識號
tag——消息標(biāo)志
comm——通信域
MPI_Send將發(fā)送緩沖區(qū)中的count個datatype數(shù)據(jù)類型的數(shù)據(jù)發(fā)送到目的進(jìn)程,目的進(jìn)程在通信域中的標(biāo)識號是dest,本次發(fā)送的消息標(biāo)志是tag。使用這一標(biāo)志,就可以把本次發(fā)送的消息和本進(jìn)程向同一目的進(jìn)程發(fā)送的其它消息區(qū)別開來。
MPI_Send操作指定的發(fā)送緩沖區(qū)是由count個類型為datatype的連續(xù)數(shù)據(jù)空間組成,起始地址為buf。注意這里不是以字節(jié)計數(shù),而是以數(shù)據(jù)類型為單位指定消息的長度,這樣就獨(dú)立于具體的實現(xiàn)并且更接近于用戶的觀點(diǎn)。其中datatype數(shù)據(jù)類型可以是MPI的預(yù)定義類型,也可以是用戶自定義的類型。通過使用不同的數(shù)據(jù)類型調(diào)用MPI_Send,可以發(fā)送不同類型的數(shù)據(jù)。
(6) 消息接收
MPI_Recv(buf,count,datatype,source,tag,comm,status)
buf——接收緩沖區(qū)的起始地址
count——最多可接收的數(shù)據(jù)的個數(shù)
datatype——接收數(shù)據(jù)的數(shù)據(jù)類型
source——所接收的數(shù)據(jù)的來源,即發(fā)送數(shù)據(jù)的進(jìn)程標(biāo)識號
tag——消息標(biāo)識,與相應(yīng)的發(fā)送操作的標(biāo)示相匹配
comm——本進(jìn)程和發(fā)送進(jìn)程所在的通信域status——返回狀態(tài)
MPI_Recv從指定的進(jìn)程source接收消息,并且該消息的數(shù)據(jù)類型、消息標(biāo)識和本接收進(jìn)程指定的datatype、tag相一致,接收到的消息所包含的數(shù)據(jù)元素的個數(shù)最多不能超過count。
接收緩沖區(qū)是由count個類型為datatype的連續(xù)元素空間組成,由datatype指定其類型,起始地址為buf。接收到消息的長度必須小于或等于接收緩沖區(qū)的長度,這是因為如果接收到的數(shù)據(jù)過大,MPI沒有截斷,接收緩沖區(qū)會發(fā)生溢出錯誤,因此編程者要保證接收緩沖區(qū)的長度不小于發(fā)送數(shù)據(jù)的長度。如果一個短于接收緩沖區(qū)的消息到達(dá),那么只有相應(yīng)于這個消息的那些地址被修改。count可以是零,這種情況下消息的數(shù)據(jù)部分是空的。其中datatype數(shù)據(jù)類型可以是MPI的預(yù)定義類型,也可以是用戶自定義的類型。通過指定不同的數(shù)據(jù)類型調(diào)用MPI_Recv,可以接收不同類型的數(shù)據(jù)。
在服務(wù)器和客戶機(jī)上都安裝軟件包MPICH.NT.1.2.0.4。安裝內(nèi)容包括:遠(yuǎn)程調(diào)用的程序、運(yùn)行時動態(tài)連接庫和MPI程序的啟動程序。
使用編譯器進(jìn)行并行程序編譯鏈接,在使用其編譯程序前,增加一個Fortran項目環(huán)境,點(diǎn)擊菜單Project→Settings…,進(jìn)行下面的操作。
(1) 在setting for中, 選擇Win32 debug。
①選擇Fortran標(biāo)簽:在Category一欄中選擇“External Procedures”; 在 “Argument Passing” 一欄中選擇 “C,By Reference”; 在 “String Length Argument”一欄中選擇 “After All Args”。
②選擇Link標(biāo)簽:在Category一欄中選擇“General”; 在 Object/library modules中 , 添 加ws2_32.lib、 mpichd.lib、 pmpichd.lib、 romiod.lib,各庫文件間用空格分開。
(2) 在setting for中, 選擇Win32 release。
①選擇Fortran標(biāo)簽:在Category一欄中選擇“External Procedures”; 在 “Argument Passing” 一欄中選擇 “C,By Reference”; 在 “String Length Argument”一欄中選擇 “After All Args”。
②選擇Link標(biāo)簽:在Category一欄中選擇“General”; 在 Object/library modules中 , 添 加ws2_32.lib、 mpich.lib、 pmpich.lib、 romio.lib, 各庫文件間用空格分開。
(3) 點(diǎn)擊菜單 File→Save Fortran Environment。
這樣就可以在以后程序設(shè)計時方便地使用這一編譯環(huán)境。
在每臺機(jī)器上都啟動了RemoteShellServer,為了減少以后的維護(hù),將這個服務(wù)設(shè)為自動。
用配置文件的方式在多臺機(jī)器上啟動,純文本配置文件的格式如下:
exe<可執(zhí)行文件的全路徑及名稱>[可選參數(shù)]
[hosts可執(zhí)行文件的全路徑及名稱]
<主機(jī)名2>#n2[可執(zhí)行文件的全路徑及名稱] <主機(jī)名3>#n3[可執(zhí)行文件的全路徑及名稱] ……
其中,n1、n2、n3表示在對應(yīng)機(jī)器上啟動的進(jìn)程數(shù),若主機(jī)后的 [可執(zhí)行文件的全路徑及名稱] 不填,則默認(rèn)使用exe那一行所指定的文件;若每臺主機(jī)都獨(dú)立地列出可執(zhí)行文件的全路徑及名稱,則exe那一行的內(nèi)容也可空白。
本文在PC網(wǎng)絡(luò)中實現(xiàn)上述過程時采用了客戶機(jī)/服務(wù)器模式 (Client/Server Mode)[2]。 客戶機(jī)/服務(wù)器模式是網(wǎng)絡(luò)通信中使用的主要的相互作用模型??梢赃@樣來說,服務(wù)器是提供服務(wù)的軟件或進(jìn)程,而客戶機(jī)則是接受服務(wù)的軟件或進(jìn)程。
根據(jù)客戶機(jī)/服務(wù)器模型的特點(diǎn),我們可以安排每個客戶機(jī)進(jìn)程 (一臺PC機(jī)運(yùn)行1到2個客戶機(jī)進(jìn)程)負(fù)責(zé)一個子區(qū)域的計算??蛻魴C(jī)在迭代若干步后,首先要把一些相關(guān)的交界面信息傳給服務(wù)器進(jìn)程,然后服務(wù)器會根據(jù)Neumann條件得到新一輪的交界面信息,最后服務(wù)器會把這些新得到的信息傳給相關(guān)的客戶機(jī)。
算例一:方形空腔二維層流驅(qū)動流。
(1) 物理模型
圖1所示為帶移動頂蓋的方形空腔二維層流驅(qū)動流。雷諾數(shù)Reynolds分別取100和1000。
圖1 方形空腔二維層流驅(qū)動流
(2) 區(qū)域劃分
將方形空腔計算區(qū)域平均分為上下兩塊,其生成的網(wǎng)格圖如圖2所示。
圖2 方形空腔網(wǎng)格圖
(3) 計算結(jié)果
圖3、圖4所示為采用D-N分區(qū)計算所得的方形空腔內(nèi)二維層流驅(qū)動流的流線分布圖。
圖3 方形空腔網(wǎng)格圖 (Re=100)
算例二:90°彎管內(nèi)二維流動問題。
(1) 物理模型
圖5為90°彎管示意圖。入口速度取拋物線分布, Reynolds數(shù)取790,出口條件按局部單向化處理。
圖4 方形空腔網(wǎng)格圖 (Re=1000)
圖 5 90°彎管
(2) 區(qū)域劃分
將整個計算區(qū)域分成3塊。其中,入口段部分網(wǎng)格大小為19×7,中間部分網(wǎng)格大小為19×10,出口段部分網(wǎng)格大小為19×7。90°彎管網(wǎng)格圖如圖6所示。
圖6 90°彎管網(wǎng)格圖
(3) 計算結(jié)果
圖7為90°彎管內(nèi)速度矢量圖。
表1和表2對比了單機(jī)求解和多機(jī)并行求解的效率。
圖7 90°彎管內(nèi)速度矢量圖
表1 方形空腔內(nèi)分區(qū)并行計算的并行效率
表2 90°彎管內(nèi)分區(qū)并行計算的并行效率
以上兩個算例是使用區(qū)域分解算法對二維流動問題進(jìn)行數(shù)值模擬,從中我們也可以驗證該算法具有很好的物理真實性和良好的區(qū)域耦合性,證明用D-N算法來實現(xiàn)流場的分區(qū)數(shù)值計算是可行的??梢钥闯?,使用區(qū)域分解法在MPI環(huán)境下并行求解二維流動問題,有較高的加速比和較好的并行效率。其計算時間也遠(yuǎn)低于同規(guī)模問題的單機(jī)串行計算時間。說明使用區(qū)域分解法在基于MPI網(wǎng)絡(luò)的個人微機(jī)并行環(huán)境下,對求解流動問題有著很好的效果和前景。
[1] 郁志輝.高性能計算并行編程技術(shù) [M] .北京:清華大學(xué)出版社,2001.
[2] 陸霄露.基于PC網(wǎng)絡(luò)求解復(fù)雜三維流動的分區(qū)并行方法 [D] .上海:上海交通大學(xué),2003.
[3] 陶文銓.計算傳熱學(xué)的近代進(jìn)展 [M] .北京:科學(xué)出版社,2000.
[4] 周力行.湍流氣粒兩相流動和燃燒的理論與數(shù)值模擬[M] .北京:科學(xué)出版社,1994.
[5] 蒲砢.關(guān)于氣固兩相流數(shù)值計算模型的探討 [J] .重慶建筑高等專科學(xué)校學(xué)報,2000,10(4):1-4.
[6] Patankar SV.郭寬良譯.傳熱和流體流動的數(shù)值方法[M] .北京:科學(xué)出版社,1984.