CFD2020第15讲MPI并行程序设计初步课件.ppt
《CFD2020第15讲MPI并行程序设计初步课件.ppt》由会员分享,可在线阅读,更多相关《CFD2020第15讲MPI并行程序设计初步课件.ppt(64页珍藏版)》请在三一办公上搜索。
1、计算流体力学讲义2020 第15讲 MPI并行程序设计(2)李新亮,知识点:阻塞通信与非阻塞通信 非连续数据的发送与接收 OpenMP并行程序设计初步,1,Copyright by Li Xinliang,MPI 程序的运行原理:服务器(前端机)编译 可执行代码复制 N 份,每个节点运行一份 调用MPI库函数 得到每个节点号 my_id 根据my_id 不同,程序执行情况不同 调用MPI 库函数进行通讯,MPI 编程的基本思想:主从式,对等式,2,Copyright by Li Xinliang,重点:对等式程序设计,知识回顾,Copyright by Li Xinliang,3,推荐学习网站
2、:“超算习堂”(),easyhpc.Net 教材资料、在线课程;在线实训,Copyright by Li Xinliang,4,a.exe,对等式设计,“对等式”程序设计思想,如果我是其中一个进程;我应当做完成我需要完成的任务,站在其中一个进程的角度思考,基本的MPI函数(6个)MPI初始化 MPI_Init(ierr);MPI结束 MPI_Finalize(ierr)得到当前进程标识 MPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)得到通信域包含的进程数 MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)消息发送MPI_Sen
3、d(buf,count,datatype,dest,tag,comm,ierr)消息接收MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr),5,Copyright by Li Xinliang,MPI的消息发送机制 两步进行MPI_Send(A,)发送MPI_Recv(B,)接收,发送 变量A,接收 到变量B,配合使用,6,Copyright by Li Xinliang,一、阻塞式通信与非阻塞式通信,阻塞式发送与接收,MPI_Send(A,),MPI_Recv(B,),7,Copyright by Li Xinliang,MPI_
4、Send()返回后缓冲区可释放 sum=call MPI_Send(sum,)sum=变量可重复利用 MPI_Recv()返回后缓冲区数据可使用Call MPI_Recv(sum1,)Sum=sum0+sum1,8,Copyright by Li Xinliang,非阻塞发送,启动发送,立即返回,计算,通信完成,释放发送缓冲区,发送消息,非阻塞接收,启动接收,立即返回,计算,通信完成,引用接收数据,接收消息,计算与通信重叠,非阻塞消息发送与接收,9,Copyright by Li Xinliang,非阻塞消息发送MPI_ISend(buf,count,datatype,dest,tag,com
5、m,request,ierr)In buf,count,datatype,dest,tag,commOut request,ierr Request(返回的非阻塞通信对象,整数)非阻塞消息接收MPI_IRecv(buf,count,datatype,source,tag,comm,request,ierr)In buf,count,datatype,source,tag,commOut request,ierr非阻塞通信的完成 MPI_Wait(request,status,ierr)等待消息收发完成 MPI_Test(request,flag,stutus,ierr)MPI_Waitall(
6、const,request_array,status,ierr)等待多个消息完成 In requestOut status,flag(logical型),10,Copyright by Li Xinliang,非阻塞通信调用后立即返回,缓冲区不能立即使用Sum=计算某变量MPI_Isend(sum.)发送该变量 sum=不能给变量重新赋值(发送可能尚未完成)MPI_Irecv(sum1,)sum=sum0+sum1 数据不能立即使用(接收可能未完成)MPI_Isend(sum,request,)Call MPI_Wait(request,status,ierr)Sum=,MPI_Irecv(s
7、um1,request,)Call MPI_Wait(request,status,ierr)Sum=sum0+sum1,11,Copyright by Li Xinliang,利用通信与计算重叠技术提高效率,例:计算差分串行程序 real A(N,N),B(N,N),h.Do i=1,NB(I,1)=(A(I,2)-A(I,1)/h B(I,N)=(A(I,N)-A(I,N-1)/henddoDo j=2,N-1Do i=1,NB(i,j)=(A(i,j+1)-A(i,j-1)/(2.*h)EnddoEnddo,0,J=1,2,3.N-1,N,i=1i=2 i=N,12,Copyright
8、by Li Xinliang,并行程序 以两个进程并行为例real A(N,N/2),B(N,N/2),A1(N),hIf(myid.eq.0)then call MPI_send(A(1,N/2),N,MPI_real,1,99,MPI_Comm_world,ierr)call MPI_recv(A1,N,MPI_real,1,99,MPI_Comm_World,status,ierr)Else call MPI_recv(A1,N,MPI_real,0,99,MPI_Comm_World,status,ierr)call MPI_send(A(1,1),N,MPI_real,0,99,MP
9、I_Comm_world,ierr)endif,0,1,J=1,2 N/2,A(1,N/2)A(2,N/2)A(3,N/2)A(N,N/2),13,Copyright by Li Xinliang,If(myid.eq.0)then Do i=1,N B(i,1)=(A(i,2)-A(i,1)/h B(i,N)=(A1(i)-A(i,N-1)/(2.*h)EnddoElse Do i=1,N B(i,1)=(A(i,2)-A1(i)/(2.*h)B(i,N)=(A(i,N)-A(i,N-1)/h EnddoendifDo j=2,N-1Do i=1,NB(i,j)=(A(i,j+1)-A(i,
10、j-1)/(2.*h)EnddoEnddo,0,1,J=1,2 N/2,特点:先收发边界信息 再进行计算缺点:通信过程中CPU 空闲,14,Copyright by Li Xinliang,“内边界”,通信与计算重叠real A(N,N/2),B(N,N/2),A1(N),hinteger myid,ierr,req1,req2,status()If(myid.eq.0)then call MPI_ISend(A(1,N/2),N,MPI_real,1,99,MPI_Comm_world,req1,ierr)call MPI_Irecv(A1,N,MPI_real,1,99,MPI_Comm_
11、World,req2,ierr)Else call MPI_Irecv(A1,N,MPI_real,0,99,MPI_Comm_World,req2,ierr)call MPI_Isend(A(1,1),N,MPI_real,0,99,MPI_Comm_world,req1,ierr)endif,0,1,J=1,2 N/2,15,Copyright by Li Xinliang,Do j=2,N-1Do i=1,NB(i,j)=(A(i,j+1)-A(i,j-1)/(2.*h)EnddoEnddoCall MPI_wait(req2,statue,ierr)If(myid.eq.0)then
12、Do i=1,N B(I,1)=(A(I,2)-A(I,1)/h B(I,N)=(A1(i)-A(I,N-1)/(2.*h)EnddoElse Do i=1,N B(I,1)=(A(I,2)-A1(i)/(2.*h)B(I,N)=(A1(i)-A(I,N-1)/h Enddoendif,0,1,J=1,2 N/2,特点:传递边界信息 同时进行计算,内点,读取系统时间 doubleprecision time time=MPI_Wtime(),16,Copyright by Li Xinliang,二、如何收发非连续数据例如:发送数组的一行A(100,50)发送 A(1,1),A(1,2),A(
13、1,3),A(1,1),A(1,2),A(1,3),方法1.多次发送 通信开销大、效率低,17,Copyright by Li Xinliang,方法2.将发送的数据拷贝到连续的数组中dimension A(100,50),B(50)If(myid.eq.0)then Do i=1,50 B(i)=A(1,i)Enddo call MPI_Send(B,50,MPI_REAL,1,99,MPI_COMM_WORLD,ierr)Else call MPI_Recv(B,50,MPI_Real,0,99,)Do i=1,50 A(1,i)=B(i)Enddoendif,不足:额外的内存占用 额外的
14、拷贝操作通信不复杂的情况,内存拷贝工作量不大,该方法也可以采用。,效果还可以,18,Copyright by Li Xinliang,方法3:构建新的数据结构,Count:块的数量;blocklength:每块的元素个数Stride:跨度(各块起始元素之间的距离)Oldtype:旧数据类型,Newtype:新数据类型(整数)例:integer MY_TYPE Call MPI_TYPE_VECTOR(4,1,3,MPI_REAL,MY_TYPE,ierr)Call MPI_TYPE_Commit(MY_TYPE,ierr),Stride=3,固定间隔(跨度)的非连续数据 MPI_TYPE_VE
15、CTOR(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 数组的一行Real A(3,4).A(1,:),在内存中的排列次序,19,Copyright by Li Xinliang,例:发送三维数组中的一个面(Fortran)数组:real A(M,N,P)通信 1)A(i,:,:);2)A(:,j,:);3)A(:,:,k)通信1)A(1,1,1)
16、,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)连续分布,无需构造新类型,20,Copyright by Li Xinliang,MPI_TYPE_INDEXED(count,array_o
17、f_blocklengths,array_of_displacements,oldtype,newtype,ierr),构造数据类型更灵活的函数 直接指定每块的元素个数及偏移量,块的数量(整数),每块元素的个数(整形数组),每块的偏移量(整形数组),例:数组 real A(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
18、(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,ierr count=N do k=1,N blocklengthes(k)=k displacements(k)
19、=(k-1)*N enddocall MPI_TYPE_INDEXED(count,blocklengths,&displacements,MPI_REAL,newtype,ierr)Call MPI_TYPE_Commit(Newtype,ierr)call MPI_Send(A(1,1),1,Newtype,),21,Copyright by Li Xinliang,N,三、MPI的通信域和组预定义通讯域 MPI_Comm_World:包含所有进程的组通讯域的分割 MPI_Comm_Split(comm,color,key,New_Comm),0,2,1,4,3,5,7,6,8,9,10,
20、11,Color 相同的进程在同一组根据key的大小排序(key相同时按原ID排序)例如:12个进程,分成 3行4列Integer myid,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)Call MPI_Comm_rank(Comm_Raw,myid_raw,ierr)Ca
21、ll MPI_Comm_rank(Comm_line,myid_line,ierr),MPI_Comm_World,RAW,Column,Color,分组标准,Key,排序依据如相同,按原ID排,提交新定义的组(否则新组无效,不要忘记),计算行号、列号,22,Copyright by Li Xinliang,例:计算差分 三维分割 A(M1,N1,P1)(M1=M/NM,N1=N/NN,P1=P/NP)基本思路:1)“扩大”的数组 A(0:M1+1,0:N1+1,0:P1+1)2)分割成三个组 Comm_X,Comm_Y,Comm_Z 得到组内编号 建立三个方向通讯的数据结构4)通信,计算内点
22、差分5)计算边界差分,0,2,1,4,3,5,7,6,8,9,10,11,MPI_Comm_World,23,Copyright by Li Xinliang,Parameter(M1=M/NM,N1=N/NN,P1=P/NP)Real A(0:M1+1,0:N1+1,0:P1+1)Integer myid,Comm_X,Comm_Y,Comm_Z,id_X,id_Y,id_Z,request(12),.Call MPI_Comm_Rank(MPI_Comm_World,myid,ierr)Call MPI_Comm_Split(MPI_Comm_World,mod(myid,NM),0,Co
23、mm_X,ierr)Call MPI_Comm_Split(MPI_Comm_World,mod(myid,NM*NN)/NM,0,Comm_Y,ierr)Call MPI_Comm_Split(MPI_Comm_World,myid/(NM*NN),0,Comm_Z,ierr)Call MPI_Comm_Rank(Comm_X,id_x,ierr)Call MPI_Comm_Rank(Comm_Y,id_y,ierr)Call MPI_Comm_Rank(Comm_Z,id_z,ierr),定义三个方向的通信域,24,Copyright by Li Xinliang,Call MPI_Typ
24、e_Vector(N1+2)*(P1+2),1,M1+2,MPI_real,Type_X,ierr)Call MPI_Type_Vector(P1+2,N1+2,(M1+2)*(N1+2),MPI_real,Type_Y,ierr)Call MPI_Type_Commit(Type_X,ierr)Call MPI_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-NM Call
25、MPI_Isend(A(1,0,0),1,TYPE_X,id_X_Pre,99,Comm_X,request(1),ierr)Call MPI_Isend(A(M1,0,0),1,TYPE_X,id_X_next,99,Comm_X,request(2),ierr)Call MPI_Irecv(A(0,0,0),1,TYPE_X,id_X_next,99,Comm_X,request(3),ierr)Call MPI_Irecv(A(M1+1,0,0),1,TYPE_X,id_X_Pre,99,Comm_X,request(4),ierr),定义新的数据结构,25,Copyright by L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CFD2020 15 MPI 并行 程序设计 初步 课件
链接地址:https://www.31ppt.com/p-3851033.html