計(jì)算流體力學(xué)課件:MPI并行程序設(shè)計(jì)初步2_第1頁(yè)
計(jì)算流體力學(xué)課件:MPI并行程序設(shè)計(jì)初步2_第2頁(yè)
計(jì)算流體力學(xué)課件:MPI并行程序設(shè)計(jì)初步2_第3頁(yè)
計(jì)算流體力學(xué)課件:MPI并行程序設(shè)計(jì)初步2_第4頁(yè)
計(jì)算流體力學(xué)課件:MPI并行程序設(shè)計(jì)初步2_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

MPI并行程序設(shè)計(jì)(2)知識(shí)點(diǎn):

阻塞通信與非阻塞通信

非連續(xù)數(shù)據(jù)的發(fā)送與接收OpenMP并行程序設(shè)計(jì)初步

1服務(wù)器/前端機(jī)計(jì)算節(jié)點(diǎn)a.exea.exea.exeMPI程序的運(yùn)行原理:

服務(wù)器(前端機(jī))編譯

可執(zhí)行代碼復(fù)制

N份,每個(gè)節(jié)點(diǎn)運(yùn)行一份

調(diào)用MPI庫(kù)函數(shù)

得到每個(gè)節(jié)點(diǎn)號(hào)my_id

根據(jù)my_id不同,程序執(zhí)行情況不同

調(diào)用MPI庫(kù)函數(shù)進(jìn)行通訊MPI編程的基本思想:主從式,對(duì)等式2重點(diǎn):對(duì)等式程序設(shè)計(jì)知識(shí)回顧3計(jì)算節(jié)點(diǎn)a.exea.exea.exea.exe對(duì)等式設(shè)計(jì)“對(duì)等式”程序設(shè)計(jì)思想如果我是其中一個(gè)進(jìn)程;我應(yīng)當(dāng)做……完成我需要完成的任務(wù)站在其中一個(gè)進(jìn)程的角度思考基本的MPI函數(shù)(6個(gè))MPI初始化MPI_Init(ierr);MPI結(jié)束MPI_Finalize(ierr)得到當(dāng)前進(jìn)程標(biāo)識(shí)

MPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)得到通信域包含的進(jìn)程數(shù)MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)

消息發(fā)送MPI_Send(buf,count,datatype,dest,tag,comm,ierr)消息接收MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr)

4MPI的消息發(fā)送機(jī)制——兩步進(jìn)行MPI_Send(A,…)發(fā)送MPI_Recv(B,…)接收

發(fā)送變量A接收到變量B配合使用5阻塞發(fā)送開始結(jié)束消息成功發(fā)出緩沖區(qū)可釋放阻塞接收開始結(jié)束消息成功接收緩沖區(qū)數(shù)據(jù)可使用一、阻塞式通信與非阻塞式通信阻塞式發(fā)送與接收MPI_Send(A,…)MPI_Recv(B,…)6

MPI_Send()返回后緩沖區(qū)可釋放

sum=……callMPI_Send(sum,……)sum=……變量可重復(fù)利用

MPI_Recv()返回后緩沖區(qū)數(shù)據(jù)可使用CallMPI_Recv(sum1,……)Sum=sum0+sum1……7非阻塞發(fā)送啟動(dòng)發(fā)送立即返回計(jì)算通信完成釋放發(fā)送緩沖區(qū)發(fā)

送消息非阻塞接收啟動(dòng)接收立即返回計(jì)算通信完成引用接收數(shù)據(jù)接

收消息計(jì)算與通信重疊非阻塞消息發(fā)送與接收8非阻塞消息發(fā)送MPI_ISend(buf,count,datatype,dest,tag,comm,request,ierr)Inbuf,count,datatype,dest,tag,commOutrequest,ierrRequest(返回的非阻塞通信對(duì)象,整數(shù))非阻塞消息接收MPI_IRecv(buf,count,datatype,source,tag,comm,request,ierr)Inbuf,count,datatype,source,tag,commOutrequest,ierr非阻塞通信的完成MPI_Wait(request,status,ierr)等待消息收發(fā)完成MPI_Test(request,flag,stutus,ierr)MPI_Waitall(const,request_array,status,ierr)等待多個(gè)消息完成

InrequestOutstatus,flag(logical型)9非阻塞通信調(diào)用后立即返回,緩沖區(qū)不能立即使用Sum=……計(jì)算某變量MPI_Isend(sum….)發(fā)送該變量

sum=……不能給變量重新賦值(發(fā)送可能尚未完成)MPI_Irecv(sum1,……)sum=sum0+sum1數(shù)據(jù)不能立即使用(接收可能未完成)MPI_Isend(sum,…,request,…)……CallMPI_Wait(request,status,ierr)Sum=……√MPI_Irecv(sum1,……,request,…)……CallMPI_Wait(request,status,ierr)Sum=sum0+sum1√10利用通信與計(jì)算重疊技術(shù)提高效率例:計(jì)算差分串行程序

realA(N,N),B(N,N),h…..Doi=1,NB(I,1)=(A(I,2)-A(I,1))/hB(I,N)=(A(I,N)-A(I,N-1))/henddoDoj=2,N-1Doi=1,NB(i,j)=(A(i,j+1)-A(i,j-1))/(2.*h)EnddoEnddo0J=1,2,3……….N-1,Ni=1i=2i=N11并行程序——以兩個(gè)進(jìn)程并行為例realA(N,N/2),B(N,N/2),A1(N),h…………If(myid.eq.0)thencallMPI_send(A(1,N/2),N,MPI_real,1,99,MPI_Comm_world,ierr)callMPI_recv(A1,N,MPI_real,1,99,MPI_Comm_World,status,ierr)ElsecallMPI_recv(A1,N,MPI_real,0,99,MPI_Comm_World,status,ierr)callMPI_send(A(1,1),N,MPI_real,0,99,MPI_Comm_world,ierr)endif01J=1,2……N/2A(1,N/2)A(2,N/2)A(3,N/2)A(N,N/2)12If(myid.eq.0)thenDoi=1,NB(i,1)=(A(i,2)-A(i,1))/hB(i,N)=(A1(i)-A(i,N-1))/(2.*h)EnddoElseDoi=1,NB(i,1)=(A(i,2)-A1(i))/(2.*h)B(i,N)=(A(i,N)-A(i,N-1))/hEnddoendifDoj=2,N-1Doi=1,NB(i,j)=(A(i,j+1)-A(i,j-1))/(2.*h)EnddoEnddo01J=1,2……N/2特點(diǎn):

先收發(fā)邊界信息

再進(jìn)行計(jì)算缺點(diǎn):

通信過程中CPU空閑13“內(nèi)邊界”通信與計(jì)算重疊realA(N,N/2),B(N,N/2),A1(N),hintegermyid,ierr,req1,req2,status(…)……If(myid.eq.0)thencallMPI_ISend(A(1,N/2),N,MPI_real,1,99,MPI_Comm_world,req1,ierr)callMPI_Irecv(A1,N,MPI_real,1,99,MPI_Comm_World,req2,ierr)ElsecallMPI_Irecv(A1,N,MPI_real,0,99,MPI_Comm_World,req2,ierr)callMPI_Isend(A(1,1),N,MPI_real,0,99,MPI_Comm_world,req1,ierr)endif01J=1,2……N/214Doj=2,N-1Doi=1,NB(i,j)=(A(i,j+1)-A(i,j-1))/(2.*h)EnddoEnddoCallMPI_wait(req2,statue,ierr)If(myid.eq.0)thenDoi=1,NB(I,1)=(A(I,2)-A(I,1))/hB(I,N)=(A1(i)-A(I,N-1))/(2.*h)EnddoElseDoi=1,NB(I,1)=(A(I,2)-A1(i)))/(2.*h)B(I,N)=(A1(i)-A(I,N-1))/hEnddoendif01J=1,2……N/2特點(diǎn):傳遞邊界信息

同時(shí)進(jìn)行計(jì)算內(nèi)點(diǎn)讀取系統(tǒng)時(shí)間doubleprecisiontimetime=MPI_Wtime()

15二、

如何收發(fā)非連續(xù)數(shù)據(jù)例如:發(fā)送數(shù)組的一行A(100,50)發(fā)送A(1,1),A(1,2),A(1,3)……A(1,1),A(1,2),A(1,3)……方法1.多次發(fā)送

通信開銷大、效率低A(1,1),A(2,1),………A(1,2),A(2,2)…….A(1,3)….16方法2.將發(fā)送的數(shù)據(jù)拷貝到連續(xù)的數(shù)組中dimensionA(100,50),B(50)If(myid.eq.0)thenDoi=1,50B(i)=A(1,i)EnddocallMPI_Send(B,50,MPI_REAL,1,99,MPI_COMM_WORLD,ierr)ElsecallMPI_Recv(B,50,MPI_Real,0,99,…)Doi=1,50A(1,i)=B(i)Enddoendif不足:額外的內(nèi)存占用

額外的拷貝操作通信不復(fù)雜的情況,內(nèi)存拷貝工作量不大,該方法也可以采用。效果還可以17方法3:構(gòu)建新的數(shù)據(jù)結(jié)構(gòu)

Count:塊的數(shù)量;blocklength:每塊的元素個(gè)數(shù)Stride:跨度(各塊起始元素之間的距離)Oldtype:舊數(shù)據(jù)類型,Newtype:新數(shù)據(jù)類型(整數(shù))例:integerMY_TYPE

CallMPI_TYPE_VECTOR(4,1,3,MPI_REAL,MY_TYPE,ierr)CallMPI_TYPE_Commit(MY_TYPE,ierr)A(1,1),A(2,1),A(3,1),A(1,2),A(2,2),A(3,2),A(1,3),A(2,3),A(3,3),A(1,4),A(2,4),A(3,4)Stride=3固定間隔(跨度)的非連續(xù)數(shù)據(jù)MPI_TYPE_VECTOR(count,blocklength,stride,oldtype,newtype,ierr)A(1,1)A(1,2)A(1,3)A(1,4)A(2,1)A(2,2)A(2,3)A(2,4)A(3,1)A(3,2)A(3,3)A(3,4)4塊,每塊1個(gè)元素,跨度為3(個(gè)元素)Fortran數(shù)組的一行RealA(3,4)…..A(1,:)在內(nèi)存中的排列次序18例:發(fā)送三維數(shù)組中的一個(gè)面(Fortran)

數(shù)組:realA(M,N,P)

通信1)

A(i,:,:);2)A(:,j,:);3)A(:,:,k)通信1)

A(1,1,1),A(2,1,1),A(3,1,1)……,A(M,1,1),A(1,2,1),A(2,2,1)…..,MPI_Type_Vector(N*P,1,M,MPI_Real,My_Type,ierr)

通信2)

A(1,1,1),A(2,1,1),A(3,1,1)….,A(1,2,1),A(2,2,1),A(3,2,1)……,A(1,1,2),A(2,1,2),A(3,1,2)……,MPI_Type_Vector(P,M,M*N,MPI_Real,My_Type,ierr)通信3)

連續(xù)分布,無(wú)需構(gòu)造新類型

19MPI_TYPE_INDEXED(count,array_of_blocklengths,array_of_displacements,oldtype,newtype,ierr)構(gòu)造數(shù)據(jù)類型更靈活的函數(shù)——直接指定每塊的元素個(gè)數(shù)及偏移量塊的數(shù)量(整數(shù))每塊元素的個(gè)數(shù)(整形數(shù)組)每塊的偏移量(整形數(shù)組)例:數(shù)組realA(N,N),欲將其上三角元素作為消息發(fā)送,試構(gòu)造其數(shù)據(jù)類型

A(1,1)A(1,2)A(1,3)A(1,4)A(2,2)A(2,3)A(2,4)A(4,4)A(3,3)A(3,4)A(2,1)A(3,1)A(3,2)A(4,1)A(4,2)A(4,3)A(1,1)A(2,1)A(1,2)A(2,2)A(3,1)A(4,1)A(3,2)A(4,2)A(1,3)A(2,3)A(3,3)A(4,3)A(1,4)A(2,4)A(3,4)A(4,4)內(nèi)存中的存儲(chǔ)次序(Fortran)N列N行注意:Fortran行優(yōu)先次序存儲(chǔ);C為列優(yōu)先次序存儲(chǔ)觀察規(guī)律:N塊;第k塊有k個(gè)元素;第k塊的偏移為(k-1)*N(從0算起)Integer::count,blocklengths(N),displacements(N)Integer::Newtype,ierr

count=Ndok=1,N

blocklengthes(k)=kdisplacements(k)=(k-1)*NenddocallMPI_TYPE_INDEXED(count,blocklengths,&displacements,MPI_REAL,newtype,ierr)CallMPI_TYPE_Commit(Newtype,ierr)callMPI_Send(A(1,1),1,Newtype,……)20N三、MPI的通信域和組預(yù)定義通訊域MPI_Comm_World:包含所有進(jìn)程的組通訊域的分割

MPI_Comm_Split(comm,color,key,New_Comm)

02143576891011Color相同的進(jìn)程在同一組根據(jù)key的大小排序(key相同時(shí)按原ID排序)例如:12個(gè)進(jìn)程,分成3行4列Integermyid,Comm_Raw,Comm_column,myid_raw,myid_line,ierr,raw,columnRaw=mod(myid,3);column=int(myid/3)MPI_Comm_Split(MPI_Comm_World,raw,0,Comm_Raw)MPI_Comm_Split(MPI_Comm_World,column,0,Comm_column)CallMPI_Comm_rank(Comm_Raw,myid_raw,ierr)CallMPI_Comm_rank(Comm_line,myid_line,ierr)MPI_Comm_WorldRAWColumnColor,分組標(biāo)準(zhǔn)Key,排序依據(jù)如相同,按原ID排提交新定義的組(否則新組無(wú)效,不要忘記)計(jì)算行號(hào)、列號(hào)21例:計(jì)算差分三維分割A(yù)(M1,N1,P1)(M1=M/NM,N1=N/NN,P1=P/NP)基本思路:1)“擴(kuò)大”的數(shù)組

A(0:M1+1,0:N1+1,0:P1+1)2)分割成三個(gè)組

Comm_X,Comm_Y,Comm_Z

得到組內(nèi)編號(hào)

建立三個(gè)方向通訊的數(shù)據(jù)結(jié)構(gòu)4)通信,計(jì)算內(nèi)點(diǎn)差分5)計(jì)算邊界差分02143576891011MPI_Comm_World22Parameter(M1=M/NM,N1=N/NN,P1=P/NP)RealA(0:M1+1,0:N1+1,0:P1+1)Integermyid,Comm_X,Comm_Y,Comm_Z,id_X,id_Y,id_Z,request(12),…….……CallMPI_Comm_Rank(MPI_Comm_World,myid,ierr)CallMPI_Comm_Split(MPI_Comm_World,mod(myid,NM),0,Comm_X,ierr)CallMPI_Comm_Split(MPI_Comm_World,mod(myid,NM*NN)/NM,0,Comm_Y,ierr)CallMPI_Comm_Split(MPI_Comm_World,myid/(NM*NN),0,Comm_Z,ierr)CallMPI_Comm_Rank(Comm_X,id_x,ierr)CallMPI_Comm_Rank(Comm_Y,id_y,ierr)CallMPI_Comm_Rank(Comm_Z,id_z,ierr)定義三個(gè)方向的通信域23CallMPI_Type_Vector((N1+2)*(P1+2),1,M1+2,MPI_real,Type_X,ierr)CallMPI_Type_Vector(P1+2,N1+2,(M1+2)*(N1+2),MPI_real,Type_Y,ierr)CallMPI_Type_Commit(Type_X,ierr)CallMPI_Type_Commit(Type_Y,ierr)……..id_X_Pre=id_X-1,if(id_X_Pre.le.0)id_X_pre=id_X_Pre+NMId_X_Next=id_X+1,if(id_X_Next.ge.NM)id_X_Next=id_X_Next-NMCallMPI_Isend(A(1,0,0),1,TYPE_X,id_X_Pre,99,Comm_X,request(1),ierr)CallMPI_Isend(A(M1,0,0),1,TYPE_X,id_X_next,99,Comm_X,request(2),ierr)CallMPI_Irecv(A(0,0,0),1,TYPE_X,id_X_next,99,Comm_X,request(3),ierr)CallMPI_Irecv(A(M1+1,0,0),1,TYPE_X,id_X_Pre,99,Comm_X,request(4),ierr)…………

定義新的數(shù)據(jù)結(jié)構(gòu)24Dok=2,P1-1Doj=2,N1-1Doi=2,M1-1Ax(I,j,k)=(A(i+1,j,k)-A(i-1,j,k))/(2.*hx)Ay(I,j,k)=(A(I,j+1,k)-A(I,j-1,k))/(2.*hy)Az(I,j,k)=(A(I,j,k+1)-A(I,j,k-1))/(2.*hz)EnddoEnddoEnddo

callMPI_Wait_All(12,request,status,ierr)

dok=1,P1doj=1,N1Ax(1,j,k)=(A(2,j,k)-A(0,j,k))/(2.*hx)Ax(M1,j,k)=(A(M1+1,j,k)-A(M1-1,j,k))/(2.*hx)enddoEnddo……….內(nèi)點(diǎn)邊界點(diǎn)25四、分布數(shù)組的文件存儲(chǔ)

分布數(shù)組realA(M/m1,N/n1)

存儲(chǔ)方式1.每個(gè)進(jìn)程存儲(chǔ)到獨(dú)立的文件realA(M/m1,N/n1)character(len=50)filename……

write(filename,”(‘file-’I4.4’.dat’)”)myidopen(55,file=filename,form=‘unformatted’)write(55)Aclose(55)…

----------------------------------file-0000.datfile-0001.datfile-0002.dat……

優(yōu)點(diǎn):程序簡(jiǎn)單缺點(diǎn):數(shù)據(jù)文件多,不易處理;改變處理器數(shù)目時(shí)需特殊處理012326

分布數(shù)組realA(M/m1,N/n1)

存儲(chǔ)方式2:

收集到0節(jié)點(diǎn)存儲(chǔ)

存儲(chǔ)到一個(gè)文件

缺點(diǎn):改變處理器規(guī)模時(shí),需要處理存儲(chǔ)方式3:

收集到0節(jié)點(diǎn),重新裝配成大數(shù)組

收集A(M/m1,N/n1)組成A0(M,N)realA0(M,N),A(M/m1,N/n1),A1(M/m1,N/n1)……if(myid.eq.0)thendok=0,m1*n1callMPI_recv(A1,M/m1*N/n1,MPI_real,k,…..)……..A0(i_global,j_global)=A1(i,j)把A1裝配到A0enddo

Write(33)A0elsecallMPI_Send(A,……)endif

01230123027存儲(chǔ)方式4.按列搜集后存儲(chǔ)

RealAj(M)If(myid.eq.0)thenopen(33,file=“A.dat”,form=“binary”)doj=1,N

收集矩陣A0的第j列存儲(chǔ)到Aj(:)write(33)AjenddoElse……endif第1列第2列第3列優(yōu)點(diǎn):存儲(chǔ)的數(shù)據(jù)形式與內(nèi)存中A0的存放格式一致。存儲(chǔ)的文件串行程序可直接讀取

realA(M,N)open(55,file=“A.dat”,form=“binary”)read(55)Aclose(55)28存儲(chǔ)方式5并行IO(MPI2.0)

打開文件:MPI_file_open(Comm,filename,mode,info,fileno,ierr)mode打開類型:MPI_Mode_RDONLY,MPI_Mode_RDWR,……fileno文件號(hào),info整數(shù)(信息)

關(guān)閉文件:MPI_file_close(fileno,ierr)

指定偏移位置讀寫MPI_file_read_at(fileno,offset,buff,const,datatype,status,ierr)MPI_file_write_at(fileno,offset,buff,const,datatype,status,ierr)offset偏移,buff緩沖區(qū),const數(shù)目

29Part3實(shí)例教學(xué)—CFD程序的MPI實(shí)現(xiàn)實(shí)例(1)用擬譜方法求解不可壓N-S方程

實(shí)例(2)用流水線方法計(jì)算緊致差分

常用的優(yōu)化方法30回顧

基本的MPI函數(shù)(6個(gè))MPI初始化MPI_Init(ierr);MPI結(jié)束MPI_Finalize(ierr)得到當(dāng)前進(jìn)程標(biāo)識(shí)

MPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)得到通信域包含的進(jìn)程數(shù)MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)

消息發(fā)送MPI_Send(buf,count,datatype,dest,tag,comm,ierr)消息接收MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr)

31非阻塞消息發(fā)送MPI_ISend(buf,count,datatype,dest,tag,comm,request,ierr)Inbuf,count,datatype,dest,tag,commOutrequest,ierrRequest(返回的非阻塞通信對(duì)象,整數(shù))非阻塞消息接收MPI_IRecv(buf,count,datatype,source,tag,comm,request,ierr)Inbuf,count,datatype,source,tag,commOutrequest,ierr非阻塞通信的完成MPI_Wait(request,status,ierr)等待消息收發(fā)完成MPI_Test(request,flag,stutus,ierr)MPI_Waitall(const,request_array,status,ierr)等待多個(gè)消息完成

InrequestOutstatus,flag(logical型)32發(fā)送非連續(xù)數(shù)據(jù)——構(gòu)建新的數(shù)據(jù)結(jié)構(gòu)MPI_TYPE_VECTOR(count,blocklength,stride,oldtype,newtype,ierr)Count:塊的數(shù)量;blocklength:每塊的元素個(gè)數(shù)Stride:跨度(各塊起始元素之間的距離)Oldtype:舊數(shù)據(jù)類型,Newtype:新數(shù)據(jù)類型(整數(shù))例:integerMY_TYPE

CallMPI_TYPE_VECTOR(50,1,100,MPI_REAL,MY_TYPE,ierr)CallMPI_TYPE_Commit(MY_TYPE,ierr)A(1,1),A(2,1),………A(1,2),A(2,2)…….A(1,3)….33通訊域的分割

MPI_Comm_Split(comm,color,key,New_Comm)

02143576891011Color相同的進(jìn)程在同一組根據(jù)key的大小排序例如:12個(gè)進(jìn)程,分成3行4列Line=mod(myid,3);raw=myid/3MPI_Comm_Split(MPI_Comm_World,raw,0,Comm_Raw)MPI_Comm_Split(MPI_Comm_World,line,Comm_Line)CallMPI_Comm_rank(Comm_Raw,myid_raw,ierr)CallMPI_Comm_rank(Comm_line,myid_line,ierr)MPI_Comm_World34實(shí)例1.用(擬)譜方法求解二維不可壓N-S方程2p物理模型周期性邊界條件按照給定能譜布置初始流動(dòng)

研究流動(dòng)的演化規(guī)律35Fourier變換(1D)Fourier變換的特點(diǎn):求導(dǎo)數(shù)->乘積困難:非線性項(xiàng)卷積計(jì)算量巨大在物理空間計(jì)算Fourier變換的快速算法FFT36二維Fourier變換兩次一維Fourier變換37求解步驟:

1)讀入初值2)調(diào)用FFT得到3)計(jì)算調(diào)用FFT得到4)計(jì)算調(diào)用FFT得到5)計(jì)算6)積分求出下一時(shí)間步的值7)調(diào)用FFT得到8)循環(huán)3)-7)直到給定的時(shí)間38實(shí)際計(jì)算中,要采用抑制混淆誤差的措施程序的并行化:二維FFT二維FFT:調(diào)用兩次一維FFT一維FFT算法復(fù)雜,并行化難度大二維FFT的并行:重新分布

SubroutineFFT2d(nx,ny,u)integernx,nyComplexu(nx,ny),Fu(nx,ny),u1(ny),u2(nx),…doi=1,nxu1(:)=u(i,:)callFFT1d(ny,u1)Fu(i,:)=u1(:)enddodoj=1,nyu2(:)=Fu(:,j)callFFT1d(nx,u1)u(:,j)=u1(:)enddoend39數(shù)據(jù)重分布的實(shí)現(xiàn)A1(M/P,N)A2(M,N/P)1234abcd對(duì)等式編程思想——“我”需要完成的工作1)將數(shù)據(jù)A1(M/P,N)切割成P塊,存入數(shù)組B1(M/P,N/P,P)2)將數(shù)據(jù)B1(:,:,k)發(fā)到進(jìn)程k(k=0,1….P-1)3)從進(jìn)程k接收B2(:,:,k)

4)組合B2(:,:,k)成A240程序:SubroutineRedistibute_ItoJ(A1,A2,M,N,P)IntegerM,N,P,k,ierr,status(MPI_Status_Size)realA1(M/P,N),A2(M,N/P),B1(M/P,N/P,P),B2(M/P,N/P,P)

dok=1,PB1(:,:,P)=A1(:,(k-1)*N/P+1:k*N/P))callMPI_Send(B1,M*N/(P*P),MPI_Real,k-1,…...)Enddodok=1,PcallMPI_Recv(B2,M*N/(P*P),MPI_Real,k-1,…...)A2((k-1)*M/P+1:k*M/P),:

)=B2(:,:,P)Enddoend

問題:全部發(fā)送,發(fā)送成功后再啟動(dòng)接收。容易死鎖

按行分布->按列分布41SubroutineRedistibute_ItoJ(A1,A2,M,N,P)IntegerM,N,P,k,ierr,status(MPI_Status_Size)realA1(M/P,N),A2(M,N/P),B1(M/P,N/P,P),B2(M/P,N/P,P)

dok=1,PB1(:,:,P)=A1(:,(k-1)*N/P+1:k*N/P))id_send=myid-kmodPid_recv=myid+kmodPcallMPI_Send(B1,M*N/(P*P),MPI_Real,id_send,…...)callMPI_Recv(B2,M*N/(P*P),MPI_Real,id_recv,…...)A2((k-1)*M/P+1:k*M/P),:

)=B2(:,:,P)Enddoend

問題:按順序發(fā)送、接收,不易死鎖42數(shù)據(jù)全交換:MPI_AlltoAll(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,ierr)

sendbuf發(fā)送緩沖區(qū)(首地址)recvbuf接收緩沖區(qū)(首地址)sendcount發(fā)送數(shù)目recvcount接收數(shù)目sendtype發(fā)送類型recvtype接收類型Comm通信域ierr整數(shù),返回錯(cuò)誤值(0為成功)

To0To1To2To3Sendbuf的數(shù)據(jù)格式sendcountFrom0From1From2From3Recvbuf的數(shù)據(jù)格式recvcount43程序:SubroutineRedistibute_ItoJ(A1,A2,M,N,P)IntegerM,N,P,k,ierr,status(MPI_Status_Size)realA1(M/P,N),A2(M,N/P),B1(M/P,N/P,P),B2(M/P,N/P,P)

dok=1,PB1(:,:,P)=A1(:,(k-1)*N/P+1:k*N/P))enddo

callMPI_AlltoAll(B1,M*N/(P*P),MPI_Real,B2,M*N/(P*P),MPI_Real,MPI_Comm_World,ierr)

dok=1,PA2((k-1)*M/P+1:k*M/P),:

)=B2(:,:,P)Enddoend

問題:無(wú)法做到計(jì)算與通信重疊

44二維并行FFT的實(shí)現(xiàn)(輸入數(shù)據(jù)、輸出數(shù)據(jù)均為按列分布)1)調(diào)用一維FFT實(shí)現(xiàn)i-方向的變換u->u12)重新分布數(shù)據(jù)(按列->按行)u1->u2調(diào)用一維FFT實(shí)現(xiàn)j-方向的變換u2->Fu2

重新分布數(shù)據(jù)(按行->按列)Fu2->Fu45實(shí)例(2)利用流水線實(shí)現(xiàn)緊致差分的并行化緊致型差分格式:相同網(wǎng)格點(diǎn)上引入更多信息。性能更優(yōu)化。

是的差分逼近普通差分格式:顯式給出Fi

的表達(dá)式緊致型差分格式:隱式給出Fi

的表達(dá)式6階中心6階對(duì)稱緊致(Lele)5階迎風(fēng)緊致(Fu)j-2j-1jj+1j+246

普通差分格式:直接計(jì)算導(dǎo)數(shù),并行容易緊致格式的計(jì)算:遞推遞推公式:計(jì)算出(由邊界條件或邊界格式給出)2)

由遞推計(jì)算出全部導(dǎo)數(shù)

后面的數(shù)據(jù)必須等待前一步計(jì)算完成,無(wú)法并行47二維問題:流水線法求解流水線示意圖步驟:1)計(jì)算d(:,:)2)fork=1,M{

如果myid=0,計(jì)算F(k,0),否則從myid-1接收F(k,0);fori=1,N1(N1=N/P)計(jì)算F(k,i);

如果myid≠P-1向myid+1發(fā)送F(k,N1)}

缺點(diǎn):通信次數(shù)過多48通信次數(shù)過于頻繁——解決方法:分塊流水線步驟:1)計(jì)算d(:,:)2)forkp=1,MP{

如果myid=0,計(jì)算F(kp,0),否則從myid-1接收F(kp,0);forj=1,N1(N1=N/P)計(jì)算F(kp,j);

如果myid≠P-1向myid+1發(fā)送F(kp,N1)}

F(kp,i)表示第kp塊

49對(duì)稱緊致格式追趕法令則代入(1)得對(duì)比(2)得邊界處導(dǎo)數(shù)可由邊界條件或邊界格式給出:則步驟:1)2)由(3)式遞推,得到3)

4)由(2)式遞推,得到特點(diǎn):兩次遞推。并行方法與前文類似50常用的并行優(yōu)化方法

1)通信與計(jì)算重疊

采用非阻塞通信Isend,Irecv

2)用重復(fù)計(jì)算代替通信3)拆分長(zhǎng)消息、合并短消息

4)優(yōu)化通信方式

51用重復(fù)計(jì)算代替通信

例如:計(jì)算差分

u分布存儲(chǔ),f(u)為u的函數(shù)01方法1)

計(jì)算出v=f(u)

通信得到uN+1,vN+1

計(jì)算差分方法2)

計(jì)算出v=f(u)

通信得到uN+1(邊界外)

計(jì)算出vN+1=f(uN+1)

計(jì)算差分方法2)計(jì)算量大,通信量小

當(dāng)函數(shù)f(u)不復(fù)雜時(shí),可提高效率1,2NN+152長(zhǎng)消息切割成多個(gè)短消息發(fā)送、接收

callMPI_Send(A(1),100000,MPI_Real,1,…)

改為:dom=1,10callMPI_Send(A((m-1)*10000+1),10000,MPI_real,1…)enddo

長(zhǎng)消息:非緩沖;

短消息:緩沖

緩沖區(qū)MPI_Send緩沖區(qū)MPI_SendMPI_RecvMPI_Recv53合并短消息dom=1,100callMPI_Send(A(1,m),1,MPI_real,1…)enddo

改為dom=1,100B(m)=A(1,m)enddocallMPI_Send(B(1),100,MPI_Real,1,…)

……54

優(yōu)化通信方式

例:數(shù)據(jù)散發(fā)0號(hào)

進(jìn)程:數(shù)據(jù)A(100),散發(fā)給0-99方式1)0進(jìn)程執(zhí)行100次MPI_Send

其他進(jìn)程執(zhí)行MPI_Recv

MPI_Scatter()采用該算法方式2)0進(jìn)程把A(100)切割成10份

,發(fā)送給10個(gè)進(jìn)程10個(gè)進(jìn)程接收A1(10)后再散發(fā)

55OpenMP并行編程入門一、特點(diǎn)1.針對(duì)共享內(nèi)存計(jì)算機(jī)結(jié)構(gòu)

全部CPU/線程均可訪問內(nèi)存

2.程序改動(dòng)量小、實(shí)現(xiàn)方便

(以編譯指示符為主)

3.適用于小規(guī)模并行或與MPI配合

進(jìn)行大規(guī)模并行

內(nèi)存CPU(核心)CPU(核心)CPU(核心)…1臺(tái)PC機(jī)/1個(gè)計(jì)算節(jié)點(diǎn)(共享內(nèi)存構(gòu)架)CPU內(nèi)存CPU內(nèi)存CPU內(nèi)存外部網(wǎng)絡(luò)節(jié)點(diǎn)1節(jié)點(diǎn)2Cluster結(jié)構(gòu),分布內(nèi)存構(gòu)架print*,"code1"!$OMPPARALLELprint*,"code2"!$OMPENDPARALLELprint*,"code3"end例1(test1.f90):編譯(在深騰7000)運(yùn)行結(jié)果(屏幕截圖)iforttest1.f90-openmp添加–openmp選項(xiàng)運(yùn)行:1.設(shè)置線程數(shù)(并行執(zhí)行的數(shù)目)exportOMP_NUM_THREADS=4(例如,4個(gè))2.執(zhí)行:./a.out顯示結(jié)果:code1code2code2code2code2code3并行域中的代碼執(zhí)行了4次Test2.f90:

print*,"code1"!$OMPPARALLELprint*,"code2“!$OMPPARALLELprint*,“code3”!$OMPENDPARALLEL!$OMPENDPARALLELprint*,"code4"endDO循環(huán)分解(openMP最常用的并行方法)!$OMPPARALLEL!$OMPDO

dok=1,12print*,kenddo!$OMPENDDO!$OMPENDPARALLELend示例:線程0k=1,2,3線程1k=4,5,6線程2k=7,8,9線程2k=10,11,12!$OMPPARALLEL!$OMPDO!$OMPPARALLELDO簡(jiǎn)寫運(yùn)行結(jié)果(屏幕截圖)運(yùn)行結(jié)果:123789456101112線程0線程2線程1線程3implicitnoneinteger,parameter::N=100000000integer::kreal*8,dimension(:),allocatable::x,y,zreal*8::time1,time2,OMP_get_wtimeallocate(x(N),y(N),z(N))!$time1=OMP_get_wtime()!$OMPPARALLELDOSHARED(x,y,z)PRIVATE(k)dok=1,Nx(k)=(k-1.d0)/(N-1.d0)y(k)=(k+1.d0)/(N-1.d0)z(k)=x(k)+y(k)enddo!$OMPENDPARALLELDO!$time2=OMP_get_wtime()deallocate(x,y,z)print*,"TotalWallTimeis",time2-time1end例:test4屏幕截圖采用單線程執(zhí)行:耗時(shí)2.15秒采用2線程執(zhí)行:耗時(shí)1.43秒采用4線程執(zhí)行:耗時(shí)1.28秒三、OpenMP的數(shù)據(jù)結(jié)構(gòu):共享與私有!$OMPPARALLELDO

dok=1,6print*,kenddo!$OMPENDPARALLELDOend線程0k線程1k循環(huán)變量k在兩個(gè)線程中的值是不同的;K是一個(gè)進(jìn)程私有變量(PRIVATE)共享變量:全體進(jìn)程均可訪問的公共變量私有變量:各個(gè)進(jìn)程私有的變量x=8.0;y=x+2.0;….!$OMPPARALLELDOSHARED(x,y)PRIVATE(k,z)

dok=1,6z=k*x+yprint*,x,y,zenddo!$OMPENDPARALLELDOend線程0k,z線程1k,zx,y私有變量公共變量例:將下面代碼并行化Integer,parameter::N=1024Real,dimension(N)::x,y,zRealr…..(給x,y賦值)Dok=1,Nr=sqrt(x(k)*x(k)+y(k)*y(k))z(k)=1.0/(1.0+r)Enddo關(guān)鍵:分析哪些是共享變量,哪些是私有變量。

顯然:r,k是私有變量,其他均為共享變量!$OMPPARALLELDOSHARED(DEFAULT)PREATE(r,k)Dok=1,Nr=sqrt(x(k)*x(k)+y(k)*y(k))

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論