第三章MPI編程_第1頁
第三章MPI編程_第2頁
第三章MPI編程_第3頁
第三章MPI編程_第4頁
第三章MPI編程_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第三章MPI編程(學(xué)生的畢業(yè)論文)第三章MPI編程3.1 MPI簡介多線程是一種便捷的模型,其中每個線程都可以訪問其它線程的存儲空間。因此,這種模型只能在共享存儲系統(tǒng)之間移植。一般來講,并行機(jī)不一定在各處理器之間共享存儲,當(dāng)面向非共享存儲系統(tǒng)開發(fā)并行程序時,程序的各部分之間通過來回傳遞消息的方式通信。要使得消息傳遞方式可移植,就需要采用標(biāo)準(zhǔn)的 消息傳遞庫。這就促成的消息傳遞接口 (Message Passi ng In terface, MP的面世, MPI是一種被廣泛采用的消息傳遞標(biāo)準(zhǔn)。與OpenMP并行程序不同,MPI是一種基于消息傳遞的并行編程技術(shù)。消 息傳遞接口是一種編程接口標(biāo)準(zhǔn),而不

2、是一種具體的編程語言。簡而言之,MPI標(biāo)準(zhǔn)定義了一組具有可移植性的編程接口。 各個廠商或組織遵循這些標(biāo)準(zhǔn)實現(xiàn)自 己的MPI軟件包,典型的實現(xiàn)包括開放源代碼的MPICH、LAM MPI以及不開放源代碼的Intel MPI。由于MPI提供了統(tǒng)一的編程接口,程序員只需要設(shè)計好 并行算法,使用相應(yīng)的MPI庫就可以實現(xiàn)基于消息傳遞的并行計算。 MPI支持 多種操作系統(tǒng),包括大多數(shù)的類 UNIX和Windows系統(tǒng)。3.1.1如何實現(xiàn)MPIMPI是一個標(biāo)準(zhǔn)。它不屬于任何一個廠商,不依賴于某個操作系統(tǒng),也不是 一種并行編程語言。不同的廠商和組織遵循著這個標(biāo)準(zhǔn)推出各自的實現(xiàn),而不同的實現(xiàn)也會有其不同的特點。M

3、PICH是影響最大、用戶最多的MPI實現(xiàn)。目前 可下載的最新的MPICH軟件包為MPICH 1.2.7pl和2008年2月15日發(fā)布的 MPICH 2-1.0.7 測試版(我使用的是 MPICH 2-1.0.6pl),在/research/projects/mpich2/i ndex.php可 以下載至 U,分別有支 持UNIX和 Windows的32位和64位版本。3.1.2 MPI程序的特點MPI程序是基于消息傳遞的并行程序。消息傳遞指的是并行執(zhí)行的各個進(jìn)程具有自己獨(dú)立的堆棧和代碼段,作為互不相關(guān)的多個程序獨(dú)立執(zhí)行, 進(jìn)程之間的 信息交互完全通過顯

4、示地調(diào)用通信函數(shù)來完成。3.2 MPICH的安裝和配置我使用的 MPICH2 安裝文件是 mpich2-1.0.6p1-win32-ia32.msi,在 Windows下安裝MPICH2比較簡單,但是要有 Microsoft .NET Framework 2.0的支持。安 裝基本上只要單擊“ Next”即可。在安裝過程中會提示輸入進(jìn)程管理器的密碼, 這個密碼被用來訪問所有的程序,這里使用的密碼為admi n。安裝完成后,安裝目錄下的include子目錄包含了編程所需要的所有頭文件, lib子目錄包含了相應(yīng)的程序庫,而子目錄 bin則包含了 MPI在Windows下面必 須的運(yùn)行程序。運(yùn)行時需要

5、的動態(tài)鏈接庫被安裝在了Windows系統(tǒng)目錄中。在Windows平臺下可以使用 Microsoft Visual Studio來開發(fā)MPI程序,下面舉例說 明。首先,新建一個 Win32控制臺項目,然后將 MPICH2安裝目錄下的include圖3-1配置頭文件目錄子目錄加入到頭文件目錄中。在 VS 2005的菜單 工具 選項 項目解決方案 VC+目錄對話框中添加include子目錄,如圖3-1所示。再用相同的方法將 MPICH2lib加入到庫文件目錄中,如圖 3-2。圖3-2配置庫文件目錄為了避免名字沖突,需要在預(yù)編譯頭文件stdafx.h中加入#inlcude mpi.h語句。 現(xiàn)在就可以

6、在主程序文件中編寫 MPI程序了,MPI的開發(fā)環(huán)境配置完畢。3.3在 Windows下如何運(yùn)行 MPI程序我所進(jìn)行的MPI程序的開發(fā)均是在 Windows平臺下,使用Visual Studio 2005 + MPIEXEC wrapper進(jìn)行的,首先用一個簡單的Hello World程序說明運(yùn)行環(huán)境 的配置。按照上一小節(jié)介紹配置好開發(fā)環(huán)境之后,在VS 2005中新建立一個 Win32控制臺項目,并取名MPI1,在MPI1.CPP文件中輸入下面的程序。在項目屬性 的“配置屬性”一 “常規(guī)”項中的“字符集”設(shè)置為“未設(shè)置”,如圖 3-3所 示。例3_1int _tmain(int argc, _T

7、CHAR* argv) int rank, size;MPI_I nit(&argc, & argv);MPI_Comm_ra nk(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, & size);printf(Hello World from thread %d of %dn, rank, size);MPI_Fi nalize();return 0;這個程序比較簡單,在函數(shù)MPInit()和MPI_Finalize()之間是程序并行執(zhí)行 的地方,MPI_Init()、MPI_Comm_rank()、MPI_Comm_size()和

8、 MPI_Finalize(),這 四個函數(shù)是MPI中最重要和最常用的函數(shù)。下面分別說明:一圖3-3配置項目屬性(1)MPI_Init 和 MPI_FinalizeMPInit用來初始化MPI執(zhí)行環(huán)境,建立多個 MPI進(jìn)程之間的聯(lián)系,為后 續(xù)通信做準(zhǔn)備。而MPI_Finalize則是結(jié)束MPI執(zhí)行環(huán)境。這兩個函數(shù)就是定義 MPI程序的并行區(qū)的,除了檢測是否初始化的函數(shù)之外,不應(yīng)該在這兩個函數(shù)定 義的區(qū)域外調(diào)用其它MPI函數(shù)。這兩個函數(shù)都返回整型值,標(biāo)識函數(shù)是否調(diào)用 成功。(2)MPI_Comm_ra nkMPI_Comm_rank函數(shù)就是用來標(biāo)識各個MPI進(jìn)程的,給出調(diào)用該函數(shù)的進(jìn) 程的進(jìn)程號

9、。MPI_Comm_ra nk返回整型的錯誤值,需要提供兩個參數(shù):MPI_Comm類型的通信域,標(biāo)識參與計算的 MPI進(jìn)程組。上面例子中使 用的是MPI_COMM_WORLD,這個進(jìn)程組是 MPI實現(xiàn)預(yù)先定義好的進(jìn)程 組,指的是所有MPI進(jìn)程所在的進(jìn)程組。如果想要申請自己的特殊的進(jìn)程 組,則需要通過MPI_Comm定義并通過其它MPI函數(shù)生成。&rank返回調(diào)用進(jìn)程中的標(biāo)識號。MPI還定義了另一個進(jìn)程組 MPI_COMM_SELF ,只包含各個進(jìn)程自己的進(jìn)程組。(3)MPI_Comm_size這個函數(shù)則用來標(biāo)識相應(yīng)進(jìn)程組中有多少個進(jìn)程,它也有兩個參數(shù):MPI_Comm類型的通信域,標(biāo)識參與計算

10、的MPI進(jìn)程組。上面的例子中用 的是 MPI_COMM_WORLD。&size返回相應(yīng)進(jìn)程組中的進(jìn)程數(shù)。運(yùn)行這個程序,運(yùn)行結(jié)果如圖3-4,按照并行執(zhí)行的方式,上面程序運(yùn)行結(jié)果應(yīng) 該打印兩行文字信息,為:Hello World from thread 0 of 2Hello World from thread 1 of 2圖3-4例3_1在windows上的運(yùn)行結(jié)果(本機(jī)系統(tǒng)環(huán)境變量 OMP_NUM_THREADS值是2),但是運(yùn)行結(jié)果確只打印 了一行,顯然函數(shù)MPI_Init和MPI_Finalize之間的代碼僅被一個線程串行執(zhí)行 了。經(jīng)過查詢資料知道,MPI程序若要被正確運(yùn)行需要使用 MPI

11、CH2安裝目錄 下的運(yùn)行工具 MPIEXEC wrapper運(yùn)行用VS 2005生成的exe文件。啟動這個程序,程序的界面如圖3-5圖 3-5 MPIEXEC wrapper 程序界面由于該程序只有操作系統(tǒng)的管理員才有權(quán)使用,所以在第一次運(yùn)行時需要輸入計算機(jī)用戶名和口令,并且不允許口令為空,如圖3-6。輸入完畢后,單擊“ Registe按鈕完成注冊,之后就可以使用該工具運(yùn)行MPI程序了。在“Application欄”選擇要運(yùn)行的exe程序,在“Number of proces欄中選擇 要運(yùn)行程序的線程數(shù),然后單擊“ Execute按鈕運(yùn)行程序。如用4線程運(yùn)行上面的 示例程序,輸出結(jié)果如圖3-7

12、所示。圖3-6輸入系統(tǒng)用戶名和口令圖3-7 使用MPIEXEC wrapper運(yùn)行例3_1的結(jié)果4線程分別執(zhí)行MPI_Init和MPI_Finalize之間的代碼,打印4行信息,程序執(zhí)行 結(jié)果正確。3.4 MPI的點對點通信點對點通信是 MPI程序的基礎(chǔ),MPI_Send和MPI_Recv是兩個最重要的函 數(shù)。這兩個函數(shù)的標(biāo)準(zhǔn)形式是:int MPI_Se nd(buf, coun ter, datatype, dest, tag, comm)參數(shù)作用如下:buf :發(fā)送緩沖區(qū)的起始地址,可以是數(shù)組或結(jié)構(gòu)指針 cou nt:非負(fù)整數(shù),發(fā)送的數(shù)據(jù)個數(shù)datatype發(fā)送數(shù)據(jù)的數(shù)據(jù)類型dest:整型

13、,目的的進(jìn)程號tag:整型,消息標(biāo)志 comm: MPI進(jìn)程組所在的通信域這個函數(shù)返回整型的錯誤碼,它的含義是向通信域中的dest進(jìn)程發(fā)送數(shù)據(jù),數(shù)據(jù)存放在buf中,類型是datatype個數(shù)是count,這個消息的標(biāo)志是tag,用以 和本進(jìn)程向同一目的進(jìn)程發(fā)送的其它消息區(qū)別開來。int MPI_Recv(buf, count, datatype, source, tag, comm, status) 參數(shù)作用如下:buf :接收緩沖區(qū)的起始地址,可以是數(shù)組或結(jié)構(gòu)指針 cou nt:非負(fù)整數(shù),最多可接收的數(shù)據(jù)個數(shù) datatype接收數(shù)據(jù)的數(shù)據(jù)類型source整型,接收數(shù)據(jù)的來源,即發(fā)送數(shù)據(jù)進(jìn)程

14、的進(jìn)程號 tag:整型,消息標(biāo)識,應(yīng)與發(fā)送操作的消息標(biāo)識相同 comm:消息接收進(jìn)程所在的通信域status: MPI_Status結(jié)構(gòu)指針,返回狀態(tài)信息這個函數(shù)返回整型的錯誤碼,它的含義是進(jìn)程從comm域中source進(jìn)程接收標(biāo) 簽號為tag的數(shù)據(jù),并保存到buf中。接收緩沖區(qū)buf的大小不能小于發(fā)送過來 的消息的長度。否則會由于數(shù)組越界導(dǎo)致程序出錯。參數(shù) status是MPI_Status 類型的,status主要顯示接收函數(shù)的各種錯誤狀態(tài)。通過訪問status.MPI_SOURCE、status.MPI_TAG 和 status.MPI_ERROR就可以得到發(fā)送數(shù) 據(jù)的進(jìn)程號、使用的標(biāo)簽

15、以及接收操作的錯誤代碼。另外,還可以使用函數(shù) MPI_Get_count來獲得實際接收到的數(shù)據(jù)項數(shù)。MPI_Get_count的標(biāo)準(zhǔn)定義為:int MPI_Get_cou nt(MPI_Status *status, MPI_Datatype datatype) nt *cou nt);將實際 接收到數(shù)據(jù)項數(shù)存放到lount中。下面用一個程序說明上面提到的函數(shù)的使用方 法。示例程序見例3_2程序的運(yùn)行結(jié)果如圖3-8( 4個進(jìn)程)函數(shù)MPI_Get_processor_name用于獲得計算機(jī)名,并存放在 中,長度為namelen,宏定義MPI_MAX_PROCESSO

16、R_NAME是機(jī)器名的最大 長度。這個程序的完成的任務(wù)是使進(jìn)程i發(fā)送數(shù)據(jù)給進(jìn)程i+1,并等待由進(jìn)程i-1 發(fā)送來的數(shù)據(jù)。最后一個進(jìn)程則發(fā)送數(shù)據(jù)給進(jìn)程0。3.5統(tǒng)計時間函數(shù)為了驗證程序并行化后的效果,MPI提供了兩個用于統(tǒng)計時間的函數(shù)MPI_Wtime和 MPI_Wtick。其中MPI_Wtime返回一個雙精度數(shù),表示從過去某 點的時刻到當(dāng)前時刻所消耗的時間秒數(shù)。而函數(shù) MPI_Wtick則返回MPI_Wtime 結(jié)果的精度。修改例3_2程序,在并行代碼兩端加入統(tǒng)計時間的函數(shù),女0例3_3: 例3_3(完整程序見示例程序4_3)begin = MPI_Wtime();end = MPI_Wtim

17、e();diff = end - begin;printf(%d process time is %9.7fn, myid, diff);printf(%d process tick is %9.7fn, myid, MPI_Wtick();運(yùn)行結(jié)果如圖3-9 :圖3-8例3 2的運(yùn)行結(jié)果fcl MP)E)(EC v;rapper亦】:諫件聞ki殳計謬樓研究I示刊瞪斥MF11也匕墜朋珂“ RBrak5avs JobProcess: 2 of 4 on X&2 recei vi ngProcess 0 of 4 on KD0 sending helloProcess 3 of 4 on XO3

18、receivingProcess 1 of 4 on XO1 receivinigi1 received hello0 receiving1 sent Fhellop2 received hello3 received 1helIo12 sent helldb0 received 1 hello13 sent phello2 process time is 0.0GS7262 process tick is D &MOOO31 process tiime is 0. &M43071 process tick is3 口ocess time is 0.011,9?!173 process fic

19、k is 0P QWWQ03 0 process tie is 011-6213 o process fick is Or &QW003nw aptiwE3.6負(fù)載均衡對程序性能的影響在并行計算中,如果各個處理器上的工作所需要的完成時間不同,則會使先完成工作的處理器等待未完成工作的處理器,浪費(fèi)了計算資源。這時應(yīng)該使各個 處理器的負(fù)載盡量均衡。一般采用的策略有兩種:靜態(tài)負(fù)載平衡和動態(tài)負(fù)載平衡。 前者適用于計算前可以準(zhǔn)確知道負(fù)載,而且這些負(fù)載容易平均劃分給各個進(jìn)程的 情況。而對于事先不知道負(fù)載情況,或者總負(fù)載不易劃分的情況,則需要采用動 態(tài)負(fù)載劃分來解決。在動態(tài)負(fù)載平衡模式中存在一個管理結(jié)點負(fù)責(zé)給

20、各個進(jìn)程分 配任務(wù),當(dāng)一個進(jìn)程完成當(dāng)前的計算任務(wù)后, 它就向管理結(jié)點申請新的任務(wù),如 果還有未分配的任務(wù),管理結(jié)點就將任務(wù)分配給那個進(jìn)程, 這有點類似于計算機(jī) 硬件向CPU發(fā)中斷請求服務(wù)的方式。下面將在Windows平臺上使用MPI編寫一個用數(shù)值積分法計算圓周率的程 序。利用公式U的近似值計算圓周率,定積分的計算可以轉(zhuǎn)化為求一個曲邊梯形的面積問 題。將積分區(qū)間等分成n個小的子區(qū)間,可將每個小的子區(qū)間上的曲邊梯形近似地看成矩形,這些矩形面積的和就近似地等于原來曲邊梯形的面積。這樣最終將求圓周率的問題轉(zhuǎn)化成了一個面積迭加的計算。每個小矩形的寬為(n為將積分區(qū)間等分的份數(shù)),高可以將x值帶入函數(shù)求得。用循環(huán)將每個小矩形的面積累加起來便是 PI的近似值。具體的算法 實現(xiàn)見附加中的程序“ mpi_pi”。圖3-10、3-11分別是用一個進(jìn)程和兩個進(jìn)程運(yùn) 行的結(jié)果。圖3-10使用一個進(jìn)程的運(yùn)行結(jié)果圖3-11使用兩個進(jìn)程的運(yùn)行結(jié)果從運(yùn)行結(jié)果可以看到使用兩個進(jìn)程時的計算速度反而不如用一個進(jìn)程運(yùn)行 時的速度,這時

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論