




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、mpi并行程序設(shè)計nmpi是目前最重要的并行編程工具,它具有移植性好、功能強大、效率高等多種優(yōu)點,而且有多種不同免費、高效、實用的實現(xiàn)版本,幾乎所有的并行計算機廠商都提供對它的支持,這是其他的并行編程環(huán)境所無法比擬的。什么是mpi?mpi(message passing interface )nmpi是一個庫,而不是一門語言;nmpi是一種標(biāo)準(zhǔn)或規(guī)范的代表,而不特指某一個對它的具體實現(xiàn);nmpi是一種消息傳遞編程模型,并成為這種編程模型的代表和事實上的標(biāo)準(zhǔn);消息傳遞模型假設(shè)底層的消息傳遞模型是一組處理器,每一個處理器有自己的本地內(nèi)存,并且通過互連網(wǎng)絡(luò)實現(xiàn)與其他處理器的消息傳遞處理器內(nèi)存處理器內(nèi)
2、存處理器內(nèi)存處理器內(nèi)存處理器內(nèi)存處理器內(nèi)存處理器內(nèi)存互連網(wǎng)絡(luò)處理器內(nèi)存mpi并行程序設(shè)計nmpi歷史n機房集群環(huán)境n六個接口構(gòu)成的mpi子集nmpi并行程序的兩種基本模式nmpi并行程序的通信模式mpi的歷史nmpi初稿:美國并行計算中心工作會議(92年4月)nmpi-1公布:第一屆mpi大會(93年2月)nmpi標(biāo)準(zhǔn)正式發(fā)布:1994年5月nmpi-1.1發(fā)布:1995年6月nmpi-2發(fā)布:(以前的版本統(tǒng)稱mpi-1) 1997年7月 mpi的實現(xiàn)mpich:最重要的mpi實現(xiàn)n與mpi-1規(guī)范同步發(fā)展的版本n支持部分mpi-2的特征(如動態(tài)生成進程等)lam(local area mul
3、ticomputer)nohio state university開發(fā)n它主要用于異構(gòu)的計算機網(wǎng)絡(luò)計算系統(tǒng)下載地址nmpich2(最新版本1.0.3 )/mpi/mpich/nlam-mpi(最新版本7.1.2)http:/ /download/機房環(huán)境n軟件部分 操作系統(tǒng):windows server 2003 mpi實現(xiàn):mpich-1.2.5n硬件部分 集群系統(tǒng)有4個刀片(每片主要參數(shù)): 2cpu (xeon3.2ghz),2gb ram,2(4)個千兆網(wǎng)卡,2個scsi硬盤 機房集群環(huán)境n一個主節(jié)點(一
4、個刀片) 啟用雙網(wǎng)卡,設(shè)置內(nèi)/外網(wǎng)ip地址,用于用戶登陸、提交調(diào)試程序、管理員管理集群等。主節(jié)點開啟ssh、ftp等服務(wù)。n三個從節(jié)點 用于從主節(jié)點接受計算任務(wù)并執(zhí)行計算(返回結(jié)果)。從節(jié)點開啟ssh服務(wù)。 節(jié)點之間的通信通過ssh協(xié)議來實現(xiàn)六個接口構(gòu)成的mpi子集n在mpi-1中,共有128個調(diào)用接口,在mpi-2中有287個,應(yīng)該說mpi是比較龐大的。但是從理論上說,mpi所有的通信功能可以用它的6個基本的調(diào)用來實現(xiàn),掌握了這6個調(diào)用,就可以實現(xiàn)所有的消息傳遞并行程序的功能。n所有的mpi標(biāo)識符,都以mpi前綴開頭,后面緊跟一個大寫字母和一系列小寫字母以及下劃線。n、mpi初始化:mpi_
5、init函數(shù)用法:mpi_init(&argc , &argv)每一個mpi進程調(diào)用的第一個mpi函數(shù)都是mpi_init。該函數(shù)指示系統(tǒng)完成所有的初始化工作,以備對后續(xù)mpi庫的調(diào)用進行處理。n、 mpi結(jié)束:mpi_finalize函數(shù)用法:mpi_finalize()在一個進程執(zhí)行完其全部mpi庫函數(shù)調(diào)用后,將調(diào)用函數(shù) mpi_finalize,從而讓系統(tǒng)釋放分配給mpi的資源。它是mpi程序的最后一條可執(zhí)行語句,否則程序的運行結(jié)果是不可預(yù)知的。n、確定進程的標(biāo)識符用法:mpi_comm_rank( mpi_comm_world ,&id) 當(dāng)mpi初始化后,每一
6、個活動進程變成了一個叫做mpi_comm_world的通信域中的成員。通信域是一個不透明的對象,提供了在進程之間傳遞消息的環(huán)境。在一個通信域內(nèi)的進程是有序的。在一個有p個進程的通信域中,每一個進程有一個唯一的序號(id號),取值為0p。進程可以通過調(diào)用函數(shù)mpi_comm_rank來確定它在通信域中的序號。n4、確定進程數(shù)量 用法:mpi_comm_size( mpi_comm_world ,&p) 進程通過調(diào)用函數(shù)mpi_comm_size來確定一個通信域中 的進程總數(shù)。n、消息發(fā)送函數(shù)mpi_send(buf,count,datatype,dest,tag,comm)參數(shù)說明:in
7、 buf:發(fā)送緩沖區(qū)的起始地址in count:將要發(fā)送的數(shù)據(jù)的個數(shù)in datatype:發(fā)送數(shù)據(jù)的數(shù)據(jù)類型in dest:目的進程標(biāo)識號in tag:消息標(biāo)志in comm:通信域mpi_send將發(fā)送緩沖區(qū)中的count個datatype數(shù)據(jù)類型的數(shù)據(jù)發(fā)送到目的進程,目的進程在通信域中的標(biāo)識號是dest,本次發(fā)送的消息標(biāo)志是tag,使用這一標(biāo)志,就可以把本次發(fā)送的消息和本進程向同一目的進程發(fā)送的其他消息區(qū)別開。n、消息接收函數(shù)mpi_recv(buf,count,datatype,source,tag,comm,status)參數(shù)說明: out buf:發(fā)送緩沖區(qū)的起始地址 in cou
8、nt:將發(fā)送的數(shù)據(jù)的個數(shù) in datatype:發(fā)送數(shù)據(jù)的數(shù)據(jù)類型 in dest:目的進程標(biāo)識號 in tag:消息標(biāo)志 in comm:通信域 out status:返回類型(是由三個域組成的結(jié)構(gòu)類型,這三個域分別是: mpi_source、mpi_tag和mpi_error)mpi_recv從指定的進程source接收消息,并且該消息的數(shù)據(jù)類型和消息標(biāo)識和本接收進程的datatype和tag相一致,接收到的消息所包含的數(shù)據(jù)元素的個數(shù)最多不能超過count。mpi預(yù)定義數(shù)據(jù)類型nmpi預(yù)定義類型與c數(shù)據(jù)類型對應(yīng)關(guān)系一般的mpi程序設(shè)計流程圖 mpi_init()mpi_comm_rank
9、 ()mpi_comm_size ()建立新的通信器、定義新的數(shù)據(jù)類型和進程拓撲結(jié)構(gòu)應(yīng)用程序?qū)嶓w:計算控制程序體;進程間通信;mpi_finalize ()退出mpi系統(tǒng)程序參數(shù)說明end一個簡單的發(fā)送和接收的例子n首先輸出幾個進程分別運行在哪一臺機子.這里調(diào)用一個mpi_get_processor_name獲得本機的名字.n接著進程0向其他進程發(fā)送問候信息,其他進程接收進程0的消息.并輸出這一過程.n#includempi.hn#includen#includenvoid main (int argc, char *argv)nnchar message20;nint i,myid,nump
10、rocs;nint namelen;nmpi_status status;nchar processor_namempi_max_processor_name;nmpi_init(&argc, &argv);n mpi_comm_size(mpi_comm_world, &numprocs);nmpi_comm_rank(mpi_comm_world, &myid);nmpi_get_processor_name(processor_name, &namelen);ncouthello world!processmyid of numprocs on p
11、rocessor_nameendl;n if(myid=0)nstrcpy(message,“hello,world!);nfor(i=1;inumprocs ;i+)nmpi_send(message,strlen(message),mpi_char,i,99,mpi_comm_world);n coutprocess 0 sendmessageto process myidendl;nnnelse nmpi_recv(message,20,mpi_char,mpi_any_source,0,mpi_comm_world,&status);n coutprocessmyidrecvi
12、vedmessagefrom process 0endl;nn mpi_finalize();n開啟個進程運行結(jié)果:開啟個進程運行結(jié)果:mpi并行程序的兩種基本模式n兩種最基本的并行程序設(shè)計模式:n對等模式:各個部分地位相同,功能和代碼基本一致,只不過是處理的數(shù)據(jù)或?qū)ο蟛煌?,也容易用同樣的程序來實現(xiàn)。(典型應(yīng)用如jacobi迭代)n主從模式:具有主進程和從進程,主進程接收從進程的處理結(jié)果,并進行匯總處理(典型應(yīng)用如矩陣向量乘法)對等模式并行jacobi程序 這里的 jacobi迭代是計算一個矩陣的數(shù)據(jù)二維數(shù)組a(m,m)。其邊界值邊界賦為8,內(nèi)部初值為0,通過迭代求矩陣各點的值. 假設(shè)需要迭代
13、的數(shù)據(jù)是m*m的二維數(shù)組a(m,m),令m=4*n,按上圖進行數(shù)據(jù)劃分,則分布在4個不同進程上的數(shù)據(jù)分別是: 進程0:a(m,1:n); 進程1:a(m,n+1:2*n); 進程2:a(m,2*n+1:3*n); 進程3:a(m,3*n+1:4*n). 由于在迭代過程中,邊界點新值的計算需要相鄰邊界其他塊的數(shù)據(jù),因此在每一個數(shù)據(jù)塊的兩側(cè)各增加1列的數(shù)據(jù)空間,用于存放從相鄰數(shù)據(jù)塊通信得到的數(shù)據(jù)。每個數(shù)據(jù)塊的大小就從m*n擴大到m*(n+2)。 n為了并行求解,這里將參加迭代的數(shù)據(jù)按列進行分割,假設(shè)有4個進程同時并行計算,數(shù)據(jù)的分割結(jié)果如圖:n邊界點新值的計算需要相鄰邊界其他塊的數(shù)據(jù),因此在每一個
14、數(shù)據(jù)塊的兩側(cè)各增加1列進程0進程1進程2進程3按列劃分進程進程0進程進程1進程進程2進程進程3發(fā)送發(fā)送發(fā)送發(fā)送發(fā)送發(fā)送發(fā)送發(fā)送發(fā)送發(fā)送發(fā)送發(fā)送接收接收接收接收接收接收接收接收接收接收接收接收例子:并行jacobi程序program maininclude mpif.hinteger totalsize,mysize,stepsparameter (totalsize =16)(定義全局數(shù)組的規(guī)模)parameter (mysize =totalsize/4,steps=10)integer n,myid,numprocs,i,j,rcreal a(totalsize,mysize+2),b(t
15、otalsize,mysize+2)integer begin_col,end_col,ierrinteger status(mpi_status_size)call mpi_init(ierr)call mpi_comm_rank(mpi_comm_world,myid,ierr)call mpi_comm_size(mpi_comm_world,numprocs,ierr)print *,”process”, myid,” of”,numprocs,” is alive”n迭代計算一個二維數(shù)組a(m,m)(數(shù)組初始化)do j=1,mysize+2 do i=1,totalsize a(i
16、,j)=0.0 end doend doif (myid.eq.0) then do i=1,totalsize a(i,2)=8.0 end doend ifif (myid.eq.3) then do i=1,totalsize a(i,mysize+1)=8.0 end doend ifdo i=1,mysize+2 a(1,i)=8.0 a(totalsize,i)=8.0end do(jacobi迭代部分)do n=1,steps(從右側(cè)的鄰居得到數(shù)據(jù)) if (myid.lt.3)then call mpi_recv(a(1,mysize+2),totalsize,mpi_real
17、,myid+1, 10,mpi_comm_world,status,ierr) end if(向左側(cè)的鄰居發(fā)送數(shù)據(jù)) if (myid.gt.0)then call mpi_send(a(1,2),totalsize,mpi_real,myid-1, 10,mpi_comm_world,ierr) end if(向右側(cè)的鄰居發(fā)送數(shù)據(jù)) if (myid.lt.3) then call mpi_send(a(1,mysize+1),totalsize,mpi_real,myid+1, 10,mpi_comm_world,ierr) end if(從左側(cè)的鄰居接收數(shù)據(jù)) if (myid.gt.0
18、) then call mpi_recv(a(1,1),totalsize,mpi_real,myid-1, 10,mpi_comm_world,status,ierr) end ifbegin_col=2end_col=mysize+1if (myid.eq.0) then begin_col=3 end ifif (myid.eq.3) then end_col=mysize end ifdo j=begin_col,end_col do i=2,totalsize-1 b(i,j)=0.25*(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j) end do end
19、dodo j=begin_col,end_col do i=2,totalsize-1 a(i,j)=b(i,j) end doend doend dodo i=2,totalsize-1 print *,myid,(a(i,j),j=begin_col,end_col)end docall mpi_finalize(rc)end主從模式矩陣向量乘n對于矩陣c=a*b,主進程將向量b廣播給所有的從進程,然后將矩陣a的各行依次發(fā)送給從進程。從進程計算一行和b相乘的結(jié)果然后將結(jié)果發(fā)送給主進程。主進程循環(huán)向各個從進程發(fā)送一行的數(shù)據(jù)直到將a各行的數(shù)據(jù)發(fā)送完畢。一旦主進程將a的各行發(fā)送完畢則每收到一個結(jié)
20、果就向相應(yīng)的從進程發(fā)送結(jié)束標(biāo)志,從進程接收到結(jié)束標(biāo)志后退出執(zhí)行主進程收集完所有的結(jié)果后也結(jié)束。從進程主進程發(fā)送矩陣a的各行數(shù)據(jù)回收各行與b相乘的結(jié)果計算計算計算計算送回結(jié)果例子:矩陣向量乘program maininclude “mpif.h”integer max_rows,max_cols,rows,colsparameter (max_rows=1000,max_cols=1000)double precision a(max_rows,max_cols),b(max_cols),c(max_cols)double presicion buffer(max_cols),ansintege
21、r myid,master,numprocs,ierr,status(mpi_status_size)integer i,j,numsent,numrcvd,senderinteger anstype,rown計算矩陣call mpi_init(ierr)call mpi_comm_rank(mpi_comm_world,myid,ierr)call mpi_comm_size(mpi_comm_world,numprocs,ierr)master=0rows=100cols=100if (myid.eq.master) then (主進程對矩陣a和b賦初值) do i=1,cols b(i)
22、=1 do j=1,rows a(i,j)=i end do end donumsent =0 numrcvd =0 (將矩陣b發(fā)送給所有其他的從進程,通過下面的廣播語句實現(xiàn)) call mpi_bcast(b,cols,mpi_double_precision,master,* mpi_comm_world,ierr) (依次將矩陣a的各行發(fā)送給其他的numprocs-1個從進程) do i=1,min(numprocs-1,rows) do j=1,cols (將一行的數(shù)據(jù)取出來依次放到緩沖區(qū)中) buffer(j)=a(i,j) end do (將準(zhǔn)備好的一行數(shù)據(jù)發(fā)送出去) call m
23、pi_send(buffer,cols,mpi_double_precision,i,i,* mpi_comm_world,ierr) numsent =numsent+1 end do (對所有的行,依次接收從進程對一行數(shù)據(jù)的計算結(jié)果) do i=1,row call mpi_recv(ans,1,mpi_double_precision,mpi_any_source,* mpi_any_tag,mpi_comm_world,status,ierr) sender=status (mpi_source) anstype =status (mpi_tag) (將該行數(shù)據(jù)賦給結(jié)果數(shù)組c的相應(yīng)單元
24、) c(anstype)=ans (如果還有其他的行沒有被計算,則繼續(xù)發(fā)送) if (numsent.lt.rows) then do j=1,cols (準(zhǔn)備好新一行的數(shù)據(jù)) buffer(j)=a(numsent+1,j) end do (將該行數(shù)據(jù)發(fā)送出去) call mpi_send(buffer,cols,mpi_double_precision,sender,* numsent+1,mpi_comm_world,ierr) numsent =numsent+1else (若所有行都已發(fā)送出去,則每接收一個消息則向相應(yīng)的從進程發(fā) 送一個標(biāo)志為0的空消息,終止該從進程的執(zhí)行) call
25、 mpi_send(1.0,0,mpi_double_precision,sender,0,* mpi_comm_world,ierr) end if end doelse (下面為從進程的執(zhí)行步驟,首先是接收數(shù)組b) call mpi_bcast(b,cols,mpi_double_precision,master,* mpi_comm_world,ierr) (接收主進程發(fā)送過來的矩陣a一行的數(shù)據(jù)) call mpi_recv(buffer,cols,mpi_double_precision,master,* mpi_any_tag,mpi_comm_world,status,ierr)(若接收到標(biāo)志為0的消息,則退出執(zhí)行) if (status(mpi_tag).ne.0) then ro
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中語文敘事散文的思辨性閱讀教學(xué)研究
- 婦科護理常規(guī)指南
- 患者身份識別培訓(xùn)
- 中班健康:趕走蛀蟲牙
- 皮膚科激光治療的護理
- 頸椎護理課件視頻
- 比較思想政治教育
- 保育師培訓(xùn)活動
- 預(yù)防性駕駛技術(shù)課件
- 項目級安全教育培訓(xùn)課件
- 學(xué)霸提優(yōu)第四單元《我們講文明》重難點梳理 課件
- 安徽青碩建設(shè)有限公司招聘筆試真題2024
- 公司適用法律法規(guī)標(biāo)準(zhǔn)清單2025年08月更新
- 2025年4月自考00077金融市場學(xué)試題
- 國家開放大學(xué)機考答案 5個人與團隊管理2025-06-21
- 大慶師范學(xué)院《跳高》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年廣元市中考語文試卷真題(含標(biāo)準(zhǔn)答案)
- 幸福與健康課件
- 幼兒弱視防治指南
- 2025人教英語初中七年級下冊期末測試卷(含答案)
- 窗簾實施方案(3篇)
評論
0/150
提交評論