您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 计算流体力学中科院力学所第6讲-MPI并行程序设计初步2
计算流体力学讲义第六讲MPI并行程序设计(2)李新亮lixlimech.ac;力学所主楼219;82543801知识点:阻塞通信与非阻塞通信非连续数据的发送与接收1讲义、课件上传至cfluid(流体中文网)-“流体论坛”-“CFD基础理论”CopyrightbyLiXinliangPart2MPI并行程序设计1.阻塞式通信与非阻塞式通信2.非连续数据的传送与接收3.MPI的通信域与组;算例计算三维差分4.分布式数据的存储Part3实例教学1.谱方法求解不可压缩N-S方程2.利用紧致型差分格式求导数2CopyrightbyLiXinliangMPI的消息发送机制——两步进行MPI_Send(A,…)发送MPI_Recv(B,…)接收发送变量A接收到变量B配合使用3CopyrightbyLiXinliang阻塞发送开始结束消息成功发出缓冲区可释放阻塞接收开始结束消息成功接收缓冲区数据可使用一、阻塞式通信与非阻塞式通信阻塞式发送与接收MPI_Send(A,…)MPI_Recv(B,…)4CopyrightbyLiXinliangMPI_Send()返回后缓冲区可释放sum=……callMPI_Send(sum,……)sum=……变量可重复利用MPI_Recv()返回后缓冲区数据可使用CallMPI_Recv(sum1,……)Sum=sum0+sum1……5CopyrightbyLiXinliang非阻塞发送启动发送立即返回计算通信完成释放发送缓冲区发送消息非阻塞接收启动接收立即返回计算通信完成引用接收数据接收消息计算与通信重叠非阻塞消息发送与接收6CopyrightbyLiXinliang•非阻塞消息发送•MPI_ISend(buf,count,datatype,dest,tag,comm,request,ierr)•Inbuf,count,datatype,dest,tag,comm•Outrequest,ierr•Request(返回的非阻塞通信对象,整数)•非阻塞消息接收•MPI_IRecv(buf,count,datatype,source,tag,comm,request,ierr)•Inbuf,count,datatype,source,tag,comm•Outrequest,ierr•非阻塞通信的完成•MPI_Wait(request,status,ierr)等待消息收发完成MPI_Test(request,flag,stutus,ierr)MPI_Waitall(const,request_array,status,ierr)等待多个消息完成•Inrequest•Outstatus,flag(logical型)7CopyrightbyLiXinliang非阻塞通信调用后立即返回,缓冲区不能立即使用Sum=……计算某变量MPI_Isend(sum….)发送该变量sum=……不能给变量重新赋值(发送可能尚未完成)MPI_Irecv(sum1,……)sum=sum0+sum1数据不能立即使用(接收可能未完成)MPI_Isend(sum,…,request,…)……CallMPI_Wait(request,status,ierr)Sum=……√MPI_Irecv(sum1,……,request,…)……CallMPI_Wait(request,status,ierr)Sum=sum0+sum1√8CopyrightbyLiXinliang利用通信与计算重叠技术提高效率例:计算差分串行程序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)EnddoEnddo0)2/()()(1,1,,hfffjijijiyJ=1,2,3……………………….N-1,Ni=1i=2i=N9CopyrightbyLiXinliang并行程序——以两个进程并行为例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)10CopyrightbyLiXinliangIf(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特点:先收发边界信息再进行计算缺点:通信过程中CPU空闲11CopyrightbyLiXinliang“内边界”通信与计算重叠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/212CopyrightbyLiXinliangDoj=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特点:传递边界信息同时进行计算内点读取系统时间doubleprecisiontimetime=MPI_Wtime()13CopyrightbyLiXinliang二、如何收发非连续数据例如:发送数组的一行A(100,50)发送A(1,1),A(1,2),A(1,3)……A(1,1),A(1,2),A(1,3)……方法1.多次发送通信开销大、效率低A(1,1),A(2,1),………A(1,2),A(2,2)…….A(1,3)….14CopyrightbyLiXinliang方法2.将发送的数据拷贝到连续的数组中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不足:额外的内存占用额外的拷贝操作通信不复杂的情况,内存拷贝工作量不大,该方法也可以采用。效果还可以15CopyrightbyLiXinliang方法3:构建新的数据结构Count:块的数量;blocklength:每块的元素个数Stride:跨度(各块起始元素之间的距离)Oldtype:旧数据类型,Newtype:新数据类型(整数)例:integerMY_TYPECallMPI_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固定间隔(跨度)的非连续数据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个元素,跨度为3(个元素)Fortran数组的一行RealA(3,4)…..A(1,:)在内存中的排列次序16CopyrightbyLiXinliang例:发送三维数组中的一个面(Fortran)数组: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)连续分布,无需构造新类型17CopyrightbyLiXinliangMPI_TYPE_INDEXED(count,array_of_blocklengths,array_of_displacements,oldtype,newtype,ierr)构造数据类型更灵活的函数——直接指定每块的元素个数及偏移量块的数量(整数)每块元素的个数(整形数组)每块的偏移量(整形数组)例:数组realA(N,N),欲将其上三角元素作为消息发送,试构造其数据类型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)内存中的存储次序(Fortran)N列N行注意:Fortran行优先次序存储;C为列优先次序存储观察规律:N块;第k块有k个元素;第k块的偏移为(k-1)*N(从0算起)Integer::count,blocklengths(N),displacements(N)Integer::Newtype,ierrcount=Ndok=1,Nblocklengthes(k)=kdisplacements(k)=(k-1)*NenddocallMPI_TYPE_INDEXED(count
本文标题:计算流体力学中科院力学所第6讲-MPI并行程序设计初步2
链接地址:https://www.777doc.com/doc-1851077 .html