中科院计算流体力学讲义CFD2011-第14讲-MPI并行程序设计初步2电子教案

上传人:yulij****0329 文档编号:141733362 上传时间:2020-08-11 格式:PPT 页数:79 大小:964.50KB
返回 下载 相关 举报
中科院计算流体力学讲义CFD2011-第14讲-MPI并行程序设计初步2电子教案_第1页
第1页 / 共79页
中科院计算流体力学讲义CFD2011-第14讲-MPI并行程序设计初步2电子教案_第2页
第2页 / 共79页
中科院计算流体力学讲义CFD2011-第14讲-MPI并行程序设计初步2电子教案_第3页
第3页 / 共79页
中科院计算流体力学讲义CFD2011-第14讲-MPI并行程序设计初步2电子教案_第4页
第4页 / 共79页
中科院计算流体力学讲义CFD2011-第14讲-MPI并行程序设计初步2电子教案_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《中科院计算流体力学讲义CFD2011-第14讲-MPI并行程序设计初步2电子教案》由会员分享,可在线阅读,更多相关《中科院计算流体力学讲义CFD2011-第14讲-MPI并行程序设计初步2电子教案(79页珍藏版)》请在金锄头文库上搜索。

1、计算流体力学讲义 第六讲 MPI并行程序设计 (2) 李新亮 ;力学所主楼219; 82543801,知识点: 阻塞通信与非阻塞通信 非连续数据的发送与接收 OpenMP并行程序设计初步,1,Copyright by Li Xinliang,讲义、课件上传至 (流体中文网) - “流体论坛” -“ CFD基础理论” 也可到如下网址下载:http:/cid-,MPI 程序的运行原理: 服务器(前端机)编译 可执行代码复制 N 份,每个节点运行一份 调用MPI库函数 得到每个节点号 my_id 根据my_id 不同,程序执行情况不同 调用MPI 库函数进行通讯,MPI 编程的基本思想: 主从式,对

2、等式,2,Copyright by Li Xinliang,重点:对等式程序设计,知识回顾,Copyright by Li Xinliang,3,a.exe,对等式 设计,“对等式”程序设计思想,如果我是其中一个进程; 我应当做 完成我需要完成的任务,站在其中一个进程的角度思考,MPI的消息发送机制 两步进行 MPI_Send( A, ) 发送 MPI_Recv( B, ) 接收,发送 变量A,接收 到变量B,配合使用,5,Copyright by Li Xinliang,一、 阻塞式通信与非阻塞式通信,阻塞式发送与接收,MPI_Send( A, ),MPI_Recv( B , ),6,Cop

3、yright by Li Xinliang,MPI_Send( ) 返回后缓冲区可释放 sum= call MPI_Send(sum,) sum= 变量可重复利用 MPI_Recv() 返回后缓冲区数据可使用 Call MPI_Recv(sum1,) Sum=sum0+sum1 ,7,Copyright by Li Xinliang,非阻塞发送,启动发送,立即返回,计 算,通信完成,释放发送缓冲区,发 送 消 息,非阻塞接收,启动接收,立即返回,计 算,通信完成,引用接收数据,接 收 消 息,计算 与 通信 重叠,非阻塞消息发送与接收,8,Copyright by Li Xinliang,非阻

4、塞消息发送 MPI_ISend(buf,count,datatype,dest,tag,comm,request,ierr) In buf,count,datatype,dest,tag,comm Out request,ierr Request (返回的非阻塞通信对象, 整数) 非阻塞消息接收 MPI_IRecv(buf,count,datatype,source,tag,comm,request,ierr) In buf,count,datatype,source,tag,comm Out request,ierr 非阻塞通信的完成 MPI_Wait(request,status,ierr

5、) 等待消息收发完成 MPI_Test(request, flag,stutus,ierr) MPI_Waitall(const,request_array,status,ierr) 等待多个消息完成 In request Out status, flag (logical型),9,Copyright by Li Xinliang,非阻塞通信调用后立即返回,缓冲区不能立即使用 Sum= 计算某变量 MPI_Isend(sum .) 发送该变量 sum= 不能给变量重新赋值 (发送可能尚未完成) MPI_Irecv(sum1, ) sum=sum0+sum1 数据不能立即使用 (接收可能未完成)

6、 MPI_Isend(sum, , request, ) Call MPI_Wait(request,status,ierr) Sum= ,MPI_Irecv(sum1, , request, ) Call MPI_Wait(request,status,ierr) Sum=sum0+sum1 ,10,Copyright by Li Xinliang,利用通信与计算重叠技术提高效率,例: 计算差分 串行程序 real A(N,N),B(N,N),h . Do i=1,N B(I,1)=(A(I,2)-A(I,1)/h B(I,N)=(A(I,N)-A(I,N-1)/h enddo Do j=2

7、,N-1 Do i=1,N B(i,j)=(A(i,j+1)-A(i,j-1)/(2.*h) Enddo Enddo,0,J=1,2,3 . N-1, N,i=1 i=2 i=N,11,Copyright by Li Xinliang,并行程序 以两个进程并行为例 real A(N,N/2),B(N,N/2),A1(N),h If(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,

8、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) endif,0,1,J=1,2 N/2,A(1,N/2) A(2,N/2) A(3,N/2) A(N,N/2),12,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) En

9、ddo Else 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 Enddo endif Do j=2,N-1 Do i=1,N B(i,j)=(A(i,j+1)-A(i,j-1)/(2.*h) Enddo Enddo,0,1,J=1,2 N/2,特点: 先收发边界信息 再进行计算 缺点: 通信过程中CPU 空闲,13,Copyright by Li Xinliang,“内边界”,通信与计算重叠 real A(N,N/2),B(N,N/2),A1(N),h integer myid,ierr, req1, req2,

10、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) endif,0,1,J=1,

11、2 N/2,14,Copyright by Li Xinliang,Do j=2,N-1 Do i=1,N B(i,j)=(A(i,j+1)-A(i,j-1)/(2.*h) Enddo Enddo Call 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) Enddo Else Do i=1,N B(I,1)=(A(I,2)-A1(i)/(2.*h) B(I,N)=(A1(i)-A(I,N-1)/h Enddo endif,

12、0,1,J=1,2 N/2,特点: 传递边界信息 同时进行计算,内点,读取系统时间 doubleprecision time time=MPI_Wtime( ),15,Copyright 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. 多次发送 通信开销大、效率低,16,Copyright by Li Xinliang,方法2. 将发送的数据拷贝到连续的数组中 dimension A(100,50), B(50) If(myid .eq

13、. 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) Enddo endif,不足: 额外的内存占用 额外的拷贝操作 通信不复杂的情况,内存拷贝工作量不大,该方法也可以采用。,效果还可以,17,Copyright by Li Xinliang,方法3: 构建新的数据结构,Count: 块的数量; blocklength: 每块的元素个数 St

14、ride: 跨度 (各块起始元素之间的距离) 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_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,

15、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,:),在内存中的排列次序,18,Copyright 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,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) 连续分布,无需构造新类型,19,Copyright by Li Xinliang,MPI_TYPE_INDEXED(count, array_of_blocklengths, array_of_displacements, oldtype,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号