【教学课件】第6讲-MPI并行程序设计初步.ppt
《【教学课件】第6讲-MPI并行程序设计初步.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第6讲-MPI并行程序设计初步.ppt(54页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、计算流体力学讲义计算流体力学讲义 第六讲第六讲 MPI并行程序设计并行程序设计(2)李新亮李新亮;力学所主楼;力学所主楼219;82543801 知识点:知识点:阻塞通信与非阻塞通信阻塞通信与非阻塞通信 非连续数据的发送与接收非连续数据的发送与接收 1讲义、课件上传至讲义、课件上传至 (流体中文网)流体中文网)-“流体论坛流体论坛”-“CFD基础理论基础理论”Copyright by Li XinliangPart 2 MPI 并行程序设计并行程序设计 1.阻塞式通信与非阻塞式通信阻塞式通信与非阻塞式通信 2.非连续数据的传送与接收非连续数据的传送与接收 3.MPI的通信域与组;的通信域与组;
2、算例计算三维差分算例计算三维差分 4.分布式数据的存储分布式数据的存储Part 3 实例教学实例教学 1.谱方法求解不可压缩谱方法求解不可压缩N-S方程方程 2.利用紧致型差分格式求导数利用紧致型差分格式求导数 2Copyright by Li XinliangMPI的消息的消息发送机制送机制 两步两步进行行MPI_Send(A,)发送送MPI_Recv(B,)接收接收 发送发送 变量变量A接收接收 到变量到变量B配合使用配合使用3Copyright by Li Xinliang阻塞发送阻塞发送开始开始结束结束消息成功发出消息成功发出缓冲区可释放缓冲区可释放阻塞接收阻塞接收开始开始结束结束消息
3、成功接收消息成功接收缓冲区数据可使用缓冲区数据可使用一、一、阻塞式通信与非阻塞式通信阻塞式通信与非阻塞式通信阻塞式发送与接收阻塞式发送与接收MPI_Send(A,)MPI_Recv(B,)4Copyright by Li Xinliang MPI_Send()MPI_Send()返回后缓冲区可释放返回后缓冲区可释放 sum=sum=call MPI_Send(sum,)call MPI_Send(sum,)sum=sum=变量可重复利用变量可重复利用 MPI_Recv()MPI_Recv()返回后缓冲区数据可使用返回后缓冲区数据可使用Call MPI_Recv(sum1,)Call MPI_R
4、ecv(sum1,)Sum=sum0+sum1Sum=sum0+sum1 5Copyright by Li Xinliang非阻塞发送非阻塞发送启动发送启动发送立即返回立即返回计计算算通信完成通信完成释放发送缓冲区释放发送缓冲区发发送送消消息息非阻塞接收非阻塞接收启动接收启动接收立即返回立即返回计计算算通信完成通信完成引用接收数据引用接收数据接接收收消消息息计算计算与与通信通信重叠重叠非阻塞消息发送与接收非阻塞消息发送与接收6Copyright by Li Xinliang非阻塞消息非阻塞消息发送送MPI_ISend(buf,count,datatype,dest,tag,comm,reque
5、st,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,fl
6、ag,stutus,ierr)MPI_Waitall(const,request_array,status,ierr)等待多个消息完成等待多个消息完成 In requestOut status,flag (logical型型)7Copyright by Li Xinliang非阻塞通信调用后立即返回,缓冲区不能非阻塞通信调用后立即返回,缓冲区不能立即使用立即使用Sum=计算某变量计算某变量MPI_Isend(sum.)发送该变量发送该变量 sum=不能给变量重新赋值不能给变量重新赋值 (发送可能尚未完成)(发送可能尚未完成)MPI_Irecv(sum1,)sum=sum0+sum1 数据不能立
7、即使用数据不能立即使用(接收可能未完成)(接收可能未完成)MPI_Isend(sum,request,)Call MPI_Wait(request,status,ierr)Sum=MPI_Irecv(sum1,request,)Call MPI_Wait(request,status,ierr)Sum=sum0+sum1 8Copyright 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
8、(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)EnddoEnddo0J=1,2,3.N-1,Ni=1i=2 i=N9Copyright 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
9、_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,MPI_Comm_world,ierr)endif01J=1,2 N/2A(1,N/2)A(2,N/2)A(3,N/2)A(N,N/2)10Copyright by Li XinliangIf(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)
10、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,j-1)/(2.*h)EnddoEnddo01J=1,2 N/2特点:特点:先收发边界信息先收发边界信息 再进行计算再进行计算缺点:缺点:通信过程中通信过程中CPU 空闲空闲11Copyright by Li Xinliang“内边界”通信与计算重叠通信与计算重叠real A(N,N/2),B(N,N/2),A1(N),hinteger myid,ierr
11、,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_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)endif01J=1,2
12、 N/212Copyright by Li XinliangDo 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 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 Enddoendif01J=1,2 N/2特点:特点:传
13、递边界信息传递边界信息 同时同时进行计算进行计算内点内点读取系统时间读取系统时间 doubleprecision time time=MPI_Wtime()13Copyright by Li Xinliang二、二、如何收发非连续数据如何收发非连续数据例如:例如:发送数组的一行发送数组的一行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).14Copyright by Li Xinliang方法方法2.
14、将发送的数据拷贝到连续的数组中将发送的数据拷贝到连续的数组中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不足:不足:额外的内存占用额外的内存占用 额外的拷贝操作额外的拷贝操作通信不复杂的情况,内存拷贝工作量不大,该方法也可以采用。通信不复杂的情况,内存拷贝工
15、作量不大,该方法也可以采用。效果还效果还可以可以15Copyright 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,ier
16、r)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 数
17、组的一行数组的一行Real A(3,4).A(1,:)在内存中的排列次序16Copyright by Li Xinliang例:例:发送三维数组中的一个面发送三维数组中的一个面 (Fortran)数组:数组:real A(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
18、,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)连续分布,无需构造新类型连续分布,无需构造新类型 17Copyright by Li XinliangMPI_TYPE_INDEXED(count,array_of_blocklengths,array_of_displacements,oldtype,newtype,ierr)构造数据类型更灵活的函数构造数据类型更灵活的函数 直接指定每块的元素个数及偏移量直接指定每块的元素个数及偏移量块的数量
19、块的数量(整数)(整数)每块元素的个数每块元素的个数(整形数组)(整形数组)每块的偏移量每块的偏移量(整形数组)(整形数组)例:例:数组数组 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(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(
20、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)=(k-1)*N enddocall MPI_TYPE_
21、INDEXED(count,blocklengths,&displacements,MPI_REAL,newtype,ierr)Call MPI_TYPE_Commit(Newtype,ierr)call MPI_Send(A(1,1),1,Newtype,)18Copyright by Li XinliangN三、三、MPI的通信域和组的通信域和组1.预定义通讯域预定义通讯域 MPI_Comm_World:包含所有进程的组包含所有进程的组2.通讯域的分割通讯域的分割 MPI_Comm_Split(comm,color,key,New_Comm)02143576891011Color 相同的进
22、程在同一组相同的进程在同一组根据根据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(Com
23、m_Raw,myid_raw,ierr)Call MPI_Comm_rank(Comm_line,myid_line,ierr)MPI_Comm_WorldRAWColumnColor,分组标准Key,排序依据如相同,按原ID排 提交新定义的组提交新定义的组(否则新组无效,不要忘记)(否则新组无效,不要忘记)计算行号、列号19Copyright 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)分割成三
24、个组)分割成三个组 Comm_X,Comm_Y,Comm_Z 得到组内编号得到组内编号 3)建立三个方向通讯的数据结构建立三个方向通讯的数据结构4)通信通信 ,计算内点差分计算内点差分5)计算边界差分计算边界差分02143576891011MPI_Comm_World20Copyright by Li XinliangParameter(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_Ra
25、nk(MPI_Comm_World,myid,ierr)Call MPI_Comm_Split(MPI_Comm_World,mod(myid,NM),0,Comm_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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 MPI 并行 程序设计 初步
限制150内