CFD2020-第15讲-MPI并行程序设计初步2课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《CFD2020-第15讲-MPI并行程序设计初步2课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CFD2020 15 MPI 并行 程序设计 初步 课件
- 资源描述:
-
1、计算流体力学讲义计算流体力学讲义2020 第第15讲讲 MPI并行程序设计并行程序设计 (2)李新亮李新亮知识点:知识点: 阻塞通信与非阻塞通信阻塞通信与非阻塞通信 非连续数据的发送与接收非连续数据的发送与接收 OpenMPOpenMP并行程序设计初步并行程序设计初步 1Copyright by Li Xinliang服务器服务器/前端机前端机计算节点计算节点a.exea.exea.exeMPI 程序的运行原理:程序的运行原理: 服务器(前端机)编译服务器(前端机)编译 可执行代码可执行代码复制复制 N 份,份,每个节点运行一份每个节点运行一份 调用调用MPI库函数库函数 得到每个节点号得到每
2、个节点号 my_id 根据根据my_id 不同,程序执行情况不同不同,程序执行情况不同 调用调用MPI 库函数进行通讯库函数进行通讯MPI 编程的基本思想:编程的基本思想: 主从式,主从式,对等式对等式2Copyright by Li Xinliang重点:对等式程序设计重点:对等式程序设计知识回顾知识回顾Copyright by Li Xinliang3推荐学习网站:推荐学习网站: “超算习堂超算习堂” ()easyhpc. Net 教材资料、在线课程; 在线实训Copyright by Li Xinliang4计算节点计算节点a.exea.exea.exea.exe对等式对等式设计设计“对
3、等式对等式”程序设计思想程序设计思想如果我是其中一个进程;如果我是其中一个进程;我应当做我应当做完成我需要完成的任务完成我需要完成的任务站在其中一个进程的角度思考站在其中一个进程的角度思考基本的基本的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) 消息发送消息发
4、送MPI_Send(buf,count,datatype,dest,tag,comm, ierr) 消息接收消息接收MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr) 5Copyright by Li XinliangMPI的消息发送机制的消息发送机制 两步进行两步进行MPI_Send( A, ) 发送发送MPI_Recv( B, ) 接收接收 发送发送 变量变量A接收接收 到变量到变量B配合使用配合使用6Copyright by Li Xinliang阻塞发送阻塞发送开始开始结束结束消息成功发出消息成功发出缓冲区可释放缓冲区可释放
5、阻塞接收阻塞接收开始开始结束结束消息成功接收消息成功接收缓冲区数据可使用缓冲区数据可使用一、一、 阻塞式通信与非阻塞式通信阻塞式通信与非阻塞式通信阻塞式发送与接收阻塞式发送与接收MPI_Send( A, )MPI_Recv( B , )7Copyright by Li Xinliang MPI_SendMPI_Send( ) ( ) 返回后缓冲区可释放返回后缓冲区可释放 sum= sum= call call MPI_SendMPI_Send(sum,)(sum,) sum= sum= 变量可重复利用变量可重复利用 MPI_RecvMPI_Recv() () 返回后缓冲区数据可使用返回后缓冲区
6、数据可使用Call Call MPI_RecvMPI_Recv(sum1,)(sum1,)Sum=sum0+sum1Sum=sum0+sum1 8Copyright by Li Xinliang非阻塞发送非阻塞发送启动发送启动发送立即返回立即返回计计算算通信完成通信完成释放发送缓冲区释放发送缓冲区发发送送消消息息非阻塞接收非阻塞接收启动接收启动接收立即返回立即返回计计算算通信完成通信完成引用接收数据引用接收数据接接收收消消息息计算计算与与通信通信重叠重叠非阻塞消息发送与接收非阻塞消息发送与接收9Copyright by Li Xinliang非阻塞消息发送非阻塞消息发送MPI_ISend(bu
7、f,count,datatype,dest,tag,comm,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,ie
8、rr) 等待消息收发完成等待消息收发完成 MPI_Test(request, flag,stutus,ierr) MPI_Waitall(const,request_array,status,ierr) 等待多个消息完成等待多个消息完成 In requestOut status, flag (logical型型)10Copyright by Li Xinliang非阻塞通信调用后立即返回,缓冲区不能非阻塞通信调用后立即返回,缓冲区不能立即使用立即使用Sum= 计算某变量计算某变量MPI_Isend(sum .) 发送该变量发送该变量 sum= 不能给变量重新赋值不能给变量重新赋值 (发送可能尚
9、未完成)(发送可能尚未完成)MPI_Irecv(sum1, )sum=sum0+sum1 数据不能立即使用数据不能立即使用 (接收可能未完成)(接收可能未完成)MPI_Isend(sum, , request, )Call MPI_Wait(request,status,ierr)Sum= MPI_Irecv(sum1, , request, )Call MPI_Wait(request,status,ierr)Sum=sum0+sum1 11Copyright by Li Xinliang利用通信与计算重叠技术提高效率利用通信与计算重叠技术提高效率例:例: 计算差分计算差分串行程序串行程序
10、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)EnddoEnddo0)2/()()(1,1,hfffjijijiyJ=1,2,3 . N-1, Ni=1i=2 i=N12Copyright by Li Xinliang并行程序并行程序 以两个进程并行为例以两个进程并行为例real A(N,N/2),B(N,N/2),A1(N),hIf(myid .eq. 0) then cal
11、l 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,MPI_Comm_world,ierr)endif01J=1,2 N/2A(1,N/2)A(2,N/2)A(3,N/2)A(N,N/2)13Copyright
12、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) 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特点:特点: 先收发边界信息先收发边界信息 再进行计算再进行计算缺点:缺点: 通信过程中通信过程
13、中CPU 空闲空闲14Copyright 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_World,req2,ierr)Else call MPI_Irecv(A1,N,MPI_re
14、al,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 N/215Copyright 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(
15、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特点:特点: 传递边界信息传递边界信息 同时同时进行计算进行计算内点内点读取系统时间读取系统时间 doubleprecision time time=MPI_Wtime( ) 16Copyright by Li Xinliang二、二、 如何收发非连续数据如何收发非连续数据例如:例如: 发送数组的一行发送数组的一行A(100,50)发送发送 A(1,1),A(1,2) ,A(1,3)
16、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).17Copyright 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 MP
17、I_Recv(B,50,MPI_Real,0,99, ) Do i=1,50 A(1,i)=B(i) Enddoendif不足:不足: 额外的内存占用额外的内存占用 额外的拷贝操作额外的拷贝操作通信不复杂的情况,内存拷贝工作量不大,该方法也可以采用。通信不复杂的情况,内存拷贝工作量不大,该方法也可以采用。效果还效果还可以可以18Copyright by Li Xinliang方法方法3: 构建新的数据结构构建新的数据结构 Count: 块的数量;块的数量; blocklength: 每块的元素个数每块的元素个数Stride: 跨度跨度 (各块起始元素之间的距离)(各块起始元素之间的距离)Old
18、type: 旧数据类型,旧数据类型, Newtype: 新数据类型新数据类型 (整数)(整数)例:例:integer MY_TYPE Call MPI_TYPE_VECTOR(4,1,3,MPI_REAL,MY_TYPE,ierr) Call MPI_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(
19、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,:)在内存中的排列次序19Copyright by Li Xinliang例:例: 发送三维数组中的一个面发送三维数组中的一个面 (Fortran) 数组:数组: real A(M,N,P) 通
20、信通信 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)通
21、信通信3) 连续分布,无需构造新类型连续分布,无需构造新类型 20Copyright by Li XinliangMPI_TYPE_INDEXED(count, array_of_blocklengths, array_of_displacements, oldtype,newtype,ierr)构造数据类型更灵活的函数构造数据类型更灵活的函数 直接指定每块的元素个数及偏移量直接指定每块的元素个数及偏移量块的数量块的数量(整数)(整数)每块元素的个数每块元素的个数(整形数组)(整形数组)每块的偏移量每块的偏移量(整形数组)(整形数组)例:例: 数组数组 real A(N,N), 欲将其欲将其上
22、三角元素上三角元素作为消息发送,试构造其数据类型作为消息发送,试构造其数据类型 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为列优先次
23、序存储为列优先次序存储观察规律:观察规律: 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_INDEXED(count, blocklengths, & displacements,MPI_REAL,newtype,ierr)Call M
24、PI_TYPE_Commit(Newtype, ierr) call MPI_Send (A(1,1),1,Newtype, )21Copyright by Li XinliangN三、三、 MPI的通信域和组的通信域和组1.预定义通讯域预定义通讯域 MPI_Comm_World : 包含所有进程的组包含所有进程的组2.通讯域的分割通讯域的分割 MPI_Comm_Split(comm,color, key,New_Comm ) 02143576891011Color 相同的进程在同一组相同的进程在同一组根据根据key的大小排序的大小排序 (key相同时按原相同时按原ID排序)排序)例如:例如:
25、 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)Call MPI_Comm_rank(Comm_line, myi
展开阅读全文