消息傳遞并行編程環(huán)境MPI_第1頁(yè)
消息傳遞并行編程環(huán)境MPI_第2頁(yè)
消息傳遞并行編程環(huán)境MPI_第3頁(yè)
消息傳遞并行編程環(huán)境MPI_第4頁(yè)
消息傳遞并行編程環(huán)境MPI_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、國(guó)家973項(xiàng)目高性能計(jì)算環(huán)境支持講座MPI 與 PETSc莫?jiǎng)t堯(北京應(yīng)用物理與計(jì)算數(shù)學(xué)研究所)日期內(nèi)容8. 15上午進(jìn)程與消息傳遞、MPI應(yīng)用現(xiàn)狀、MPI并行程序設(shè)計(jì)入門、 初步的MPI消息傳遞函數(shù)作業(yè)一、討論8. 16上午作業(yè)講評(píng)、 先進(jìn)的MPI函數(shù)、 并行程序示例2、MPI的發(fā)展下午作業(yè)二、討論8. 17上午作業(yè)二講評(píng)、并行可擴(kuò)展科學(xué)計(jì)算工具箱PETSc介紹PETSc程序示例個(gè)人介紹莫?jiǎng)t堯,男,漢族,1971年7月生,副研究員:1992年國(guó)防科技大學(xué)應(yīng)用數(shù)學(xué)專業(yè)本科畢業(yè);1997年國(guó)防科技大學(xué)計(jì)算機(jī)應(yīng)用專業(yè)并行算法 方向博士畢業(yè);1999年北京應(yīng)用物理與計(jì)算數(shù)學(xué)數(shù)學(xué)博士后流 動(dòng)站出站,并

2、留所工作;主要從事大規(guī)模科學(xué)與工程并行計(jì)算研究。消息傳遞并行編程環(huán)境MPI一、進(jìn)程與消息傳遞二、MPI環(huán)境的應(yīng)用現(xiàn)狀三、MPI并行程序設(shè)計(jì)入門(程序例1)四、初步的MPI消息傳遞函數(shù)五、作業(yè)一六、先進(jìn)的MPI函數(shù)七、MPI并行程序示例2 (求解-u=f);八、MPI環(huán)境的發(fā)展九、作業(yè)二、進(jìn)程與消息傳遞.單個(gè)進(jìn)程(process)進(jìn)程是一個(gè)程序,同時(shí)包含它的執(zhí)行環(huán)境(內(nèi)存、寄 存器、程序計(jì)數(shù)器等),是操作系統(tǒng)中獨(dú)立存在的可 執(zhí)行的基本程序單位;通俗理解:串行應(yīng)用程序編譯形成的可執(zhí)行代碼,分 為“指令”和“數(shù)據(jù)”兩個(gè)部分,并在程序執(zhí)行時(shí)“獨(dú) 立地申請(qǐng)和占有”內(nèi)存空間,且所有計(jì)算均局限于該 內(nèi)存空間

3、。內(nèi)存2.單機(jī)內(nèi)多個(gè)進(jìn)程:多個(gè)進(jìn)程可以同時(shí)存在于單機(jī)內(nèi)同一操作系統(tǒng):由操 作系統(tǒng)負(fù)責(zé)調(diào)度分時(shí)共享處理機(jī)資源(CPU、內(nèi)存、 存儲(chǔ)、外設(shè)等);進(jìn)程間相互獨(dú)立(內(nèi)存空間不相交):在操作系統(tǒng)調(diào) 度下各自獨(dú)立地運(yùn)行,例如多個(gè)串行應(yīng)用程序在同一 臺(tái)計(jì)算機(jī)中運(yùn)行;進(jìn)程間可以相互交換信息:例如數(shù)據(jù)交換、同步等待, 消息是這些交換信息的基本單位,|消息傳遞是指這 些信息在進(jìn)程間的相互交換,是實(shí)現(xiàn)進(jìn)程間通信的唯 一方式;最基本的消息傳遞操作:發(fā)送消息(send)、接受消息(receive)、進(jìn)程同步(barrier) 規(guī)約(reduction);消息傳遞的實(shí)現(xiàn):共享內(nèi)存或信號(hào)量,用戶不必關(guān)心;3 .包含于通過(guò)網(wǎng)

4、絡(luò)聯(lián)接的不同計(jì)算機(jī)的多個(gè)進(jìn)程:進(jìn)程獨(dú)立存在:進(jìn)程位于不同的計(jì)算機(jī),由各自獨(dú)立的操作系統(tǒng)調(diào)度,享有獨(dú)立的CPU和內(nèi)存資源;進(jìn)程間相互信息交換:消息傳遞;消息傳遞的實(shí)現(xiàn):基于網(wǎng)絡(luò)socket機(jī)制,用戶不必關(guān) 心;4.消息傳遞庫(kù)函數(shù):應(yīng)用程序接口(API):提供給應(yīng)用程序(FORTRAN、C、C+語(yǔ)言)的可直接調(diào)用的完成進(jìn)程間消息傳遞的某項(xiàng)特定功能的函數(shù);消息傳遞庫(kù):所有定義的消息傳遞函數(shù)編譯形成的軟 件庫(kù),調(diào)用其內(nèi)部函數(shù)的應(yīng)用程序,通過(guò)與之聯(lián)接, 即可成為可并行執(zhí)行的程序;目前流行的消息傳遞函數(shù)庫(kù):PVM 3.3.11、MPICH 1.2、LAMMPI 6.4 等;5. 標(biāo)準(zhǔn)消息傳遞界面(MPI:

5、 Message Passing Interface):MPI標(biāo)準(zhǔn):根據(jù)應(yīng)用程序?qū)ο鬟f功能的需求, 全球工業(yè)、應(yīng)用和研究部門聯(lián)合推出標(biāo)準(zhǔn)的消息傳遞 界面函數(shù),不考慮其具體實(shí)現(xiàn),以保證并行應(yīng)用程序 的可移植性;MPI的具體實(shí)現(xiàn):消息傳遞庫(kù)函數(shù),目前有影響的 為 MPICH和LAMMPI,我們注重 MPICH系列;6 .基于消息傳遞的并行程序執(zhí)行模式:可執(zhí)行代碼 SPMD模式:?jiǎn)纬绦蚨鄶?shù)據(jù)流并行應(yīng)用程序代碼、一 Z, 一運(yùn)彳亍V復(fù)制多份并獨(dú)立執(zhí)行,形成多個(gè)獨(dú)立的進(jìn)程進(jìn) 程一/( 內(nèi) 存T進(jìn)程二(內(nèi)存)進(jìn)程三(內(nèi)存)消息傳遞(交換數(shù)據(jù)、同步、規(guī)約)協(xié)同 MPMD模式:多程序多數(shù)據(jù)流,除初始啟動(dòng)多

6、個(gè)可執(zhí)行代碼,其余與SPMD模式一致;7 .共享存儲(chǔ)與分布式存儲(chǔ):屬于并行機(jī)體系結(jié)構(gòu)的范疇,與消息傳遞并行程序設(shè)計(jì)平臺(tái)無(wú)關(guān);分布式存儲(chǔ)共享存儲(chǔ)消息傳遞是相對(duì)于進(jìn)程間通信方式而言的,與具體并行機(jī)存儲(chǔ)模式無(wú)關(guān),任何支持進(jìn)程間通信的并行機(jī),均可支持消息傳遞并行程序設(shè)計(jì);幾乎所有共享和分布存儲(chǔ)并行計(jì)算環(huán)境均支持進(jìn)程間的消息傳遞通信;二、MPI環(huán)境的應(yīng)用現(xiàn)狀MPI (消息傳遞界面)是全球工業(yè)、政府和科研部門聯(lián) 合推出的適合進(jìn)程間進(jìn)行標(biāo)準(zhǔn)消息傳遞的并行程序設(shè) 計(jì)平臺(tái),最初版MPI 1.0本于1994年6月推出,目前 最新的為MPI 2.0版,于1998年年低推出;MPI的具體實(shí)現(xiàn):MPICH和LAMMPI

7、,目前均 已實(shí)現(xiàn) MPI 1.2版,適用于任何并行計(jì)算平臺(tái);部分并行機(jī)已 實(shí)現(xiàn)MPI 2.0版;MPI是目前應(yīng)用最廣的并行程序設(shè)計(jì)平臺(tái),幾乎被所有 并行計(jì)算環(huán)境(共享和分布式存儲(chǔ)并行機(jī)、MPP、機(jī)群 系統(tǒng)等)和流行的多進(jìn)程操作系統(tǒng)(UNIX、Windows NT)所支持,基于它開(kāi)發(fā)的應(yīng)用程序具有最佳的可移 植性;目前高效率的超大規(guī)模并行計(jì)算( 1000個(gè)處理器)最 可信賴的平臺(tái);工業(yè)、科學(xué)與工程計(jì)算部門的大量科研和工程軟件(氣 象、石油、地震、空氣動(dòng)力學(xué)、核等)目前已經(jīng)移植到 MPI平臺(tái),發(fā)揮了重要作用;目前,MPI相對(duì)于PVM:優(yōu)點(diǎn):功能強(qiáng)大,性能高,適應(yīng)面廣,使用方便,可擴(kuò)展性好;缺點(diǎn):進(jìn)

8、程數(shù)不能動(dòng)態(tài)改變;三、MPI并行程序設(shè)計(jì)入門1.MPI并行程序設(shè)計(jì)平臺(tái)由標(biāo)準(zhǔn)消息傳遞函數(shù)及相關(guān)輔助函數(shù)構(gòu)成,多個(gè)進(jìn)程通過(guò)調(diào)用這些函數(shù)(類似調(diào)用子程序),進(jìn)行通信;2. MPI程序:SPMD執(zhí)行模式:一個(gè)程序同時(shí)啟動(dòng)多份,形成多個(gè) 獨(dú)立的進(jìn)程,在不同的處理機(jī)上運(yùn)行,擁有獨(dú)立的內(nèi) 存空間,進(jìn)程間通信通過(guò)調(diào)用MPI函數(shù)來(lái)實(shí)現(xiàn);每個(gè)進(jìn)程開(kāi)始執(zhí)行時(shí),將獲得一個(gè)唯一的序號(hào) (rank)。例如啟動(dòng)P個(gè)進(jìn)程,序號(hào)依次為0,1,P-1;MPI程序例1:進(jìn)程0發(fā)送一個(gè)整數(shù)給進(jìn)程1;進(jìn)程 1將該數(shù)加1,傳遞給進(jìn)程2;進(jìn)程2再將該數(shù)加1, 再傳遞給進(jìn)程3;依次類推,最后,進(jìn)程P-1將該數(shù) 傳遞給進(jìn)程0,由進(jìn)程0負(fù)責(zé)廣

9、播該數(shù)給所有進(jìn)程, 并打印輸出。program example!include“mpif.h”! MPI 系統(tǒng)頭文件integer status(MPI_STATUS_SIZE),my_rank,p,source,dest,tag,ierr,data cc進(jìn)入MPI系統(tǒng)call MPI_Init(ierr)call MPI_Comm_rank(MPI_COMM_WORLD,my_rank,ierr)call MPI_Comm_size(MPI_COMM_WORLD,p,ierr)cc數(shù)據(jù)交換data=0tag = 5source= my_rank-1if(source.eq.-l) sourc

10、e=p-1dest =my_rank+1if(dest.eq.p) dest=0if(my_rank.eq.0) thencall MPI_Send(data,1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr)call MPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr) elsecall MPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr)data=data+1call MPI_Send(data,

11、1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr) endifcc廣播數(shù)據(jù)call MPI_Bcast(data,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)cc-打印輸出if(my_rank.eq.0) thenif(data.eq.p-1) thenprint Successful, data=”,dataelseprint *,Failure, data=,dataendifendifccall MPI_Finalize(ierr)end編譯命令:mpif77 -o exam.e example.f 運(yùn)行命令: mpirun

12、 -np 4 exam.e運(yùn)行效果:MPI系統(tǒng)選擇相同或不同的4個(gè)處理機(jī),在每個(gè)處理機(jī)上運(yùn)行程序代碼exam.e。MPI函數(shù)進(jìn)程0 進(jìn)程1 進(jìn)程2 進(jìn)程3Init()進(jìn)入MPI系統(tǒng)Comm_rank()my_rank=0 myrank=1myrank=2 my_rank=3Comm_size()p=4p=4p=4tag=5,data=0tag=5,data=0p=4IFtag=5,data=0 tag=5,data=0source=3source=0source=1source=2數(shù)據(jù)交換Broadcast()Finalize()dest=1dest=2dest=3dest=0進(jìn)程序號(hào)(ran

13、k);各進(jìn)程通過(guò)函數(shù)MPI_Comm_rank()獲取各 自的序號(hào);消息號(hào):消息的標(biāo)號(hào);通信器(Communicator): 1)理解為一類進(jìn)程的集合,且在該集 合內(nèi),進(jìn)程間可以相互通信;類比:郵局、電話局、國(guó)際網(wǎng);2)任何MPI通信函數(shù)均必須在某個(gè)通信器內(nèi)發(fā)生;3) MPI系 統(tǒng)提供省缺的通信器MPI_COMM_WORLD,所有啟動(dòng)的MPI 進(jìn)程通過(guò)調(diào)用函數(shù)MPI_Init()包含在該通信器內(nèi);4)各進(jìn)程通 過(guò)函數(shù)MPI_Comm_size()獲取通信器包含的(初始啟動(dòng))的 MPI進(jìn)程個(gè)數(shù);消息:分為數(shù)據(jù)(data)和包裝(envelope)兩個(gè)部分,其中, 包裝由接收進(jìn)程序號(hào)、發(fā)送進(jìn)程序號(hào)

14、、消息標(biāo)號(hào)和通信器四部分組成,數(shù)據(jù)包含用戶將要傳遞的內(nèi)容;進(jìn)程組:一類進(jìn)程的集合,在它的基礎(chǔ)上,可以定義新的通 信器;基本數(shù)據(jù)類型:對(duì)應(yīng)于FORTRAN和C語(yǔ)言的內(nèi)部數(shù)據(jù)類型 (INTEGER,REAL,DOUBLE PRECISION,COMPLEX,LOGICAL,CHARACTER),MPI系統(tǒng)提供已定義好的對(duì)應(yīng) 數(shù)據(jù)類型(MPI_INTEGER, MPI_REAL, MPI_DOUBLE_PRECISION , MPI_COMPLEX , MPI_LOGICAL,MPI_CHARACTER);自定義數(shù)據(jù)類型:基于基本數(shù)據(jù)類型,用戶自己定義的數(shù)據(jù) 類型(后面介紹);MPI對(duì)象:MPI系統(tǒng)

15、內(nèi)部定義的數(shù)據(jù)結(jié)構(gòu),包括數(shù)據(jù)類 型、進(jìn)程組、通信器等,它們對(duì)用戶不透明,在FORTRAN 語(yǔ)言中,所有MPI對(duì)象均必須說(shuō)明為“整型變量 INTEGER”;MPI聯(lián)接器(handle):聯(lián)接MPI對(duì)象和用戶的橋梁,用 戶可以通過(guò)它訪問(wèn)和參與相應(yīng)MPI對(duì)象的具體操作;例 如,MPI系統(tǒng)內(nèi)部提供的通信器MPI_COMM_WORLD; 在FORTRAN語(yǔ)言中,所有MPI聯(lián)接器均必須說(shuō)明為“整 型變量INTEGER”;進(jìn)程拓?fù)浣Y(jié)構(gòu):進(jìn)程組內(nèi)部進(jìn)程之間的一種相互連接結(jié) 構(gòu),如3x3網(wǎng)格,將在后面介紹。3 x 3網(wǎng)格拓?fù)浣Y(jié)構(gòu)靜態(tài)進(jìn)程個(gè)數(shù):進(jìn)程數(shù)由命令“mpirun np xxx”初始 確定為xxx個(gè),程序執(zhí)

16、行過(guò)程中不能動(dòng)態(tài)改變進(jìn)程的個(gè) 數(shù);消息緩存區(qū):應(yīng)用程序產(chǎn)生的消息包含的數(shù)據(jù)所處的內(nèi)存空間;標(biāo)準(zhǔn)輸入:所有進(jìn)程的標(biāo)準(zhǔn)輸入read(*,*)均省缺為當(dāng)前終 端屏幕,且只能由0號(hào)進(jìn)程執(zhí)行該操作,其他進(jìn)程需要 這些輸入?yún)?shù),只能由0號(hào)進(jìn)程執(zhí)行數(shù)據(jù)廣播操作;標(biāo)準(zhǔn)輸出:所有進(jìn)程可以獨(dú)立執(zhí)行標(biāo)準(zhǔn)輸出write (*,*), 但其省缺為當(dāng)前終端屏幕;MPI函數(shù)格式:FORTAN語(yǔ)言中,最后一個(gè)參數(shù)為該函數(shù)調(diào)用是否成 功的標(biāo)志:0表示成功,其它表示各種可能的錯(cuò)誤;C語(yǔ)言中,該標(biāo)志又函數(shù)參數(shù)返回;C : ierr=MPI_Comm_rank(myrank)F :MPI_Comm_rank(myrank,ierr)

17、MPI函數(shù)的使用查詢:由函數(shù)名查詢:man函數(shù)名(MPI_Xxxx),注意大小寫, 例如 man MPI_Comm_rank, man MPI_Send, man MPI_recv.MPI函數(shù)的學(xué)習(xí)與使用:注重MPI函數(shù)的各類功能,由應(yīng)用程序的通信需求出發(fā),尋 找匹配的函數(shù)類型,在查找具體函數(shù)名,采用man命令可以 查詢?cè)摵瘮?shù)的具體參數(shù)含義和使用方法。四、初步的MPI消息傳遞函數(shù).點(diǎn)對(duì)點(diǎn)通信(point-to-point)定義:給定屬于同一通信器內(nèi)的兩個(gè)進(jìn)程,其中一個(gè) 發(fā)送消息,一個(gè)接收消息; MPI系統(tǒng)定義的所有通信方式均建立在點(diǎn)對(duì)點(diǎn)通信 之上;四種模式:標(biāo)準(zhǔn)模式|、緩存區(qū)模式、同步模式、就

18、 緒模式;.標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信進(jìn)程可以隨意地發(fā)送(接收)消息,與是否存在匹配 的消息接收(發(fā)送)進(jìn)程無(wú)關(guān); 發(fā)收匹配: 進(jìn)程二進(jìn)程1發(fā)收不匹配:+ |進(jìn)程i T 進(jìn)程2兩類: 暨式:消息發(fā)送函數(shù)返回,用戶可以對(duì)消息緩 存區(qū)進(jìn)行處理,不會(huì)影響已發(fā)送的消息數(shù)據(jù);接 受函數(shù)返回,用戶可以使用接受到的消息數(shù)據(jù);非阻塞式:發(fā)送和接受函數(shù)返回后,必須調(diào)用另 一類函數(shù)來(lái)確保它們的正確完成;阻塞式非阻塞式INTEGER AINTEGER AA=100A=100MPI_Send(A,1,.)MPI_Isend(A,1,.)A=200A=200消息數(shù)據(jù):A=100A=100 或 A=200MPI_Isend(A,

19、1,. flag,.)MPI_Wait(flag,.)A=200消息數(shù)據(jù):A=100A=100.點(diǎn)對(duì)點(diǎn)通信函數(shù)舉例阻塞式標(biāo)準(zhǔn)消息發(fā)送函數(shù)MPI_Send (buf, count, datatype, dest, tag, comm, ierr)Real*8 (integer, .) buf :消息發(fā)送緩存區(qū)起始地址(Fortran,用戶的待發(fā)送的第一個(gè)數(shù)據(jù))integercount:buf起始的數(shù)據(jù)單元個(gè)數(shù)integerdatatype:數(shù)據(jù)類型(基本或用戶定義的)integerdest:接收進(jìn)程序號(hào)integertag: 消息的標(biāo)號(hào)integercomm:通信器integerierr:函數(shù)調(diào)

20、用返回錯(cuò)誤碼real *8 a(100,100)integer b(60,60)c-發(fā)送50個(gè)雙精度數(shù)“ a(5,20) : a(54,20)”到2號(hào)進(jìn)程call MPI_Send( a (5,20),50,MPI_DOUBLE_PRECISION,2,&99999,MPI_COMM_WORLD,ierr )c-發(fā)送20個(gè)整型數(shù)“b(20,40) : b(39,40)”到5號(hào)進(jìn)程call MPI_Send( b (20,40),20,MPI_DOUBLE_PRECISION,5,&99999,MPI_COMM_WORLD,ierr )阻塞式標(biāo)準(zhǔn)消息接收函數(shù)MPI_Recv (buf, coun

21、t, datatype, dest, tag, comm, status, ierr)Real*8 (integer, .) buf :消息接收緩存區(qū)起始地址(Fortran,用戶用于接受的第一個(gè)數(shù)據(jù))integercount:buf起始的數(shù)據(jù)單元個(gè)數(shù)integer datatype :數(shù)據(jù)類型(基本或用戶定義的)integerdest:發(fā)送進(jìn)程序號(hào)integertag: 消息的標(biāo)號(hào)integercomm:通信器integer status(MPI_STATUS_SIZE):接收狀態(tài)數(shù)組;integer ierr:函數(shù)調(diào)用返回錯(cuò)誤碼real *8 a(100,100)integer b(60,

22、60)c-從2號(hào)進(jìn)程接收50個(gè)雙精度數(shù)到“a(5,20) : a(54,20)”call MPI_Recv( a (5,20),50,MPI_DOUBLE_PRECISION,2,&99999,MPI_COMM_WORLD,status,ierr )c-從5號(hào)進(jìn)程接收20個(gè)整型數(shù)到“b(20,40) : b(39,40)”call MPI_Recv( b (20,40),20,MPI_DOUBLE_PRECISION,5,&99999,MPI_COMM_WORLD,status,ierr )其他點(diǎn)對(duì)點(diǎn)通信函數(shù):參考手冊(cè);4 .聚合通信(Collective Communication )定義:

23、屬于同一通信器的所有MPI進(jìn)程均必須參與的通信操作;參與方式:調(diào)用同一聚合通信函數(shù);函數(shù)類型:同步通信函數(shù):所有進(jìn)程在某個(gè)程序點(diǎn)上同步;MPI_Barrier ( comm , ierr )全局通信函數(shù):+ 廣播:MPI_Bcast(buf,count,dtype, |roo1Lcomm,ierr)root發(fā)送other接受索引收集:MPI_Gatherv()+all發(fā)送大小不等的數(shù)據(jù)塊root接受并按索引間斷存放口+ 索引全收集:MPI_Allgatherv()all發(fā)送大小不等的數(shù)據(jù)塊All接受并按索引間斷存放分散:MPI_Scatter(bufs,bufr,count,dtype,roo

24、t,comm,ierr)root發(fā)送連續(xù)的大小一致數(shù)據(jù)塊All 接受索引分散:MPI_Scatterv()root發(fā)送間斷的大小不一致數(shù)據(jù)塊All 接受全交換:MPI_Alltoall()All發(fā)送大小一致數(shù)據(jù)塊到各進(jìn)程All接受大小一致數(shù)據(jù)塊并按序號(hào)連續(xù)存放索引全交換: MPI_Alltoallv() 全局規(guī)約(global reduction)函數(shù):+ 規(guī)約:MPI_Reduce(sbuf,rbuf,count,dtype,網(wǎng),root, comm,ierr);規(guī)約操作類型op : MPI_SUM, MPI_MIN, MPI_MAX,MPI_PROD 等 12 種;例子:求兩個(gè)向量的內(nèi)積,

25、并將結(jié)果返回進(jìn)程0subroutine par_blas1(m,a,b,c,comm)real a(m),b(m)! local slice of arrayreal c! resultreal suminteger m,comm,i,ierrcc!local sumsum=0.0d0do i=1,msum=sum+a(i)*b(i)enddoc! global sumcall MPI_Reduce(sum,c,1,MPI_REAL,MPI_SUM,0,&comm,ierr)+全規(guī)約:MPI_Allreduce(),除要求將結(jié)果返回 到所有進(jìn)程外,與MPI_Reduce()一致;+ 規(guī)約分散:

26、MPI_Reduce_scatter(),將規(guī)約結(jié)果 分散到各進(jìn)程;+并行前綴計(jì)算:MPI_Scan()五、作業(yè)一P個(gè)進(jìn)程,第i個(gè)進(jìn)程將其包含100個(gè)雙精度數(shù)據(jù)的數(shù) 組A (100)傳送給第(i +1) mod P個(gè)進(jìn)程,同時(shí)從第(i -1) mod P個(gè)進(jìn)程接受100個(gè)雙精度數(shù)據(jù)到另一個(gè)數(shù)組B(100) 中,令數(shù)組 C(1: 100)=A(1: 100)+B(1: 100),然后 求數(shù)組C(1: 100)各元素的類加和,最后在將該和全部累 加到0號(hào)進(jìn)程,打印并輸出該和。提示:可在例1的基礎(chǔ)上修改,編制。六、先進(jìn)的MPI函數(shù)1 .自定義數(shù)據(jù)類型定義:在MPI系統(tǒng)已定義的基本數(shù)據(jù)類型(MPI_I

27、NTEGER,MPI_REAL,MPI_DOUBLE_PRECISION,MPI_CHARACTER等)基礎(chǔ)上,用戶根據(jù)需求,自己定義的數(shù)據(jù)類型;real_a(1uuu)發(fā)送:a(5:9)call MPI_Send(a(5), 5, MPI_ REAL,.) OK發(fā)送:a(5),a7),a(9),a(11),a(13),a(15) MPI_Type_Commit()提交給MPI系統(tǒng);此后,就可以 象基本數(shù)據(jù)類型一樣,在消息傳遞函數(shù)中重復(fù)使用; 并由函數(shù)MPI_Type_free()釋放;do i=5, 15, 2call MPI_Send(a (i) ,1,MPI_REAL,.)enddoOK

28、缺點(diǎn):多次發(fā)送,效率低,程序設(shè)計(jì)繁瑣改進(jìn):用戶定義新的數(shù)據(jù)類型(callMPI_Type_vector(5,1,2,MPI_REAL,newtype,ierr)callMPI_Type_commit(newtype , ierr) 提交callMPI_Send(a(5), 1, newtype,.)callMPI_Type_free(newtype,ierr) 釋放 / 在用戶已定義好的數(shù)據(jù)類型基礎(chǔ)上,還可以進(jìn)一步定義新的數(shù)據(jù)類型;用戶定義的數(shù)據(jù)類型必須由函數(shù)具體自定義數(shù)據(jù)類型函數(shù),請(qǐng)參考手冊(cè);2 .進(jìn)程拓?fù)浣Y(jié)構(gòu)定義:根據(jù)應(yīng)用程序的特征,在進(jìn)程間建立的一種虛 擬拓?fù)溥B接方式,以方便并行程序設(shè)計(jì)

29、和提高并行計(jì) 算性能;例:二維規(guī)則區(qū)域,3*3區(qū)域分解,9個(gè)進(jìn)程,建立 Cartesion坐標(biāo),進(jìn)程(i,j)的相鄰進(jìn)程為(i-1,j),(i+1,j), (i,j-1), (i,j+1);0 (0,0)1 (0,1)2 (0,2)3 (1,0)4(1,1)5(1,2)0 (2,0)1(2,1)2 (2,2)3 .并行I/O各進(jìn)程可以類似于串行程序獨(dú)立地讀/寫不同的文件; MPICH 1.2以上版本支持所有進(jìn)程并行讀寫同一個(gè)文件;七、MPI并行程序示例21 .一 維 Dirichlet 問(wèn)題:- A u (x) = f(x) x g Q =(0,1)u(0)=0.0, u(1)=0.0, f(

30、x)=4.0算法:均勻網(wǎng)格有限差分離散,Jacobi迭代求解。區(qū)域分解:nproc=4, n = 21, ns = (n-1)/nproc+1 =60123i i i i i i i i i ; i i i i i i i i H00.51program exampleimplicit real*8 (a-h,o-z)include “mpif.h”parameter ( n = 21, nproc = 4, ns = (n-1)/nproc+1)parameter ( errtol=1.e-4,nitmax=100)dimension u(ns), f(ns), solution(ns),u

31、old(0:ns)! u(0): left dummy grid point! u(ns+1) : right dummy grid pointinteger status(MPI_STATUS_SIZE),sizec c enter into MPIcall MPI_Init(ierr)call MPI_Comm_rank(MPI_COMM_WORLD,myrank,ierr)call MPI_Comm_size(MPI_COMM_WORLD,size,ierr) if(size.ne.nproc) thenprint *,”+ errors for number of process di

32、stributions +” goto 888endif c c assign initial valuesh = 1.0d0/(n-1)! discrete step sizexst = myrank*(ns-1)*h ! start x-coordinate of local domain nlocal=ns-1! local number of grid pointist=1 if(myrank.eq.0) ist=ist+1do i=1,nsf(i)=4.0d0u(i)=0.0d0uold(i)=0.0d0 xauxi=xst+(i-1)*hsolution(i)= -2*xauxi*

33、(xauxi-1.0d0) enddou(0)=0.0d0nlp=myrank-1nrp=myrank+1if(nlp.lt.0)if(nrp.gt.nproc-1)! left process! right process nlp=MPI_PROC_NULL nrp=MPI_PROC_NULLnull process, null communication operationcurrent iterationsJacobi iterating nit =0c10 continue c swapping dummy elements along pseudo-boundarycall MPI_

34、Send( Uold(1) ,1,MPI_DOUBLE_PRECISION,&nlp,nit, MPI_COMM_WORLD,ierr)call MPI_Send(Uold(nlocal)|,1, MPI_DOUBLE_PRECISION,&nrp,nit,MPI_COMM_WORLD,ierr)call MPI_Recv( hold(nlocal+1)j 1,MPI_DOUBLE_PRECISION,&nrp,nit, MPI_COMM_WORLD,status,ierr)call MPI_Recv( Uold(0),1, MPI_DOUBLE_PRECISION,&nlp,nit, MPI

35、_COMM_WORLD,status, ierr)c iterating and convergenc checking error=0.0d0 do i=ist,nlocalu(i)=(h*h*f(i)+uold(i-1)+uold(i+1)/2 xauxi= dabs(u(i)-solution(i) if(dabs(xauxi).gt.error) error=xauxi enddocc maximum error call MPI_Allreduce(error,xauxi,1,MPI_DOUBLE_PRECISION,MPI_MAX,&MPI_COMM_WORLD,ierr)erro

36、r=xauxi if(error.gt.errtol) then do i=ist,nlocaluold(i)=u(i)enddoif(nit.lt.nitmax) thennit=nit+1if(myrank.eq.0) print *,nit=,nit, error=,errorgoto 10endifendifcif(myrank.eq.0) thenif(nit.le.nitmax.and.error.le.errtol) thenwrite(*,100) nit100format(1x, “Successfully touch the exact solution after nit =,&i4, “ iterations)elsewrite(*,200) nit200format(1x, “Fail to touch the exact solution after nit =,&i4, “ iterations)endifendifc888 call MPI_Finalize(ierr)cend1.編譯LINUX : mpif77 -o

溫馨提示

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

評(píng)論

0/150

提交評(píng)論