欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    MPI并行程序设计自学教程.ppt

    • 资源ID:2720015       资源大小:463KB        全文页数:53页
    • 资源格式: PPT        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    MPI并行程序设计自学教程.ppt

    2023年2月,1/55,并行程序设计简介,曙光信息产业(北京)有限公司,2023年2月,2/55,讲座内容提示,基本概念基本的MPI点到点通信(Point to point)MPI中API的主要内容,为MPI最基本,最重要的内容MPI程序的编译和运行实例,2023年2月,3/55,参考文献,MPI-the complete reference.Marc Snir,MIT Press,1998.ISBN 0262692155,0262692163.Using MPI:portable parallel programming with the message-passing interface,William Gropp,MIT Press,1999.2nd edition.ISBN 0262571323.Using MPI-2:advanced features of the message-passing interface.William Gropp,MIT Press,1999.ISBN 0262571331.高性能计算并行编程技术-MPI并行程序设计,都志辉,清华大学出版社,2001年8月。,2023年2月,4/55,多线程库标准 Win32 API.POSIX threads.编译制导标准 OpenMP 可移植共享存储并行编程标准.消息传递库标准 MPI PVM,并行编程标准,本讨论的重点,2023年2月,5/55,消息传递并行程序设计,消息传递并行程序设计指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。并行计算粒度大,特别适合于大规模可扩展并行算法由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法.消息传递是当前并行计算领域的一个非常重要的并行程序设计方式,2023年2月,6/55,什么是MPI?,Massage Passing Interface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C一种新的库描述,不是一种语言。共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用MPI是一种标准或规范的代表,而不是特指某一个对它的具体实现MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准,2023年2月,7/55,MPI的发展过程,发展的两个阶段MPI 1.1:1995MPICH:是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性.MPI 1.22.0:动态进程,并行 I/O,远程存储访问、支持F90和C+(1997).,2023年2月,8/55,为什么要用MPI?,高可移植性MPI已在IBM PC机上、MS Windows上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran并行程序可不加改变地运行在IBM PC、MS Windows、Unix工作站、以及各种并行机上。,2023年2月,9/55,:从简单入手Init和Finalize,下面我们首先分别以C语言和Fortran语言的形式给出一个最简单的MPI并行程序Hello(下页).该程序在终端打印出Hello World!字样.“Hello World”:一声来自新生儿的问候.,2023年2月,10/55,Hello world(C),#include#include mpi.h“main(int argc,char*argv)MPI_Init(,2023年2月,11/55,Hello world(Fortran),program maininclude mpif.hinteger ierrcall MPI_INIT(ierr)print*,Hello,world!call MPI_FINALIZE(ierr)end,2023年2月,12/55,C和Fortran中MPI函数约定,C必须包含mpi.h.MPI 函数返回出错代码或 MPI_SUCCESS成功标志.MPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写.Fortran必须包含mpif.h.通过子函数形式调用MPI,函数最后一个参数为返回值.MPI-前缀,且函数名全部为大写.MPI函数的参数被标志为以下三种类型:IN:参数在例程的调用中不会被修正.OUT:参数在例程的调用中可能会被修正.INOUT:参数有初始值,且在例程的调用中可能会被修正,2023年2月,13/55,MPI初始化-MPI_INIT,int MPI_Init(int*argc,char*argv)MPI_INIT(IERROR)MPI_INIT是MPI程序的第一个调用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句。启动MPI环境,标志并行代码的开始.并行代码之前,第一个mpi函数(除MPI_Initialized()外).要求main必须带参数运行,否则出错.,2023年2月,14/55,MPI结束-MPI_FINALIZE,int MPI_Finalize(void)MPI_FINALIZE(IERROR)MPI_FINALIZE是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。标志并行代码的结束,结束除主进程外其它进程.之后串行代码仍可在主进程(rank=0)上运行(如果必须).,2023年2月,15/55,MPI程序的的编译与运行,mpif77 hello.f 或 mpicc hello.c 默认生成a.out的可执行代码.mpif77 o hello hello.f 或mpicc o hello hello.c生成hello的可执行代码.mpirun np 4 a.outmpirun np 4 hello4 指定np的实参,表示进程数,由用户指定.a.out/hello 要运行的MPI并行程序.,%小写o,np:The number of process.,2023年2月,16/55,:运行我们的MPI程序!,dairnode01$mpicc-o hello hello.cdairnode01$./hello()0 Aborting program!Could not create p4 procgroup.Possible missing fileor program started without mpirun.dairnode01$mpirun-np 4 hello()Hello World!Hello World!Hello World!Hello World!dairnode01$,计算机打印字符,我们输入的命令,2023年2月,17/55,:Hello是如何被执行的?,SPMD:Single Program Multiple Data(SIMD):,#include mpi.h#include main(int argc,char*argv)MPI_Init(,#include mpi.h#include main(int argc,char*argv)MPI_Init(,#include mpi.h#include main(int argc,char*argv)MPI_Init(,#include mpi.h#include main(int argc,char*argv)MPI_Init(,Hello World!Hello World!Hello World!Hello World!,#include mpi.h#include main(int argc,char*argv)MPI_Init(,rshssh,2023年2月,18/55,:开始写MPI并行程序 Comm_size和Comm_rank,在写MPI程序时,我们常需要知道以下两个问题的答案:任务由多少个进程来进行并行计算?我是哪一个进程?,2023年2月,19/55,MPI 提供了下列函数来回答这些问题:用MPI_Comm_size 获得进程个数 p int MPI_Comm_size(MPI_Comm comm,int*size);用MPI_Comm_rank 获得进程的一个叫rank的值,该 rank值为0到p-1间的整数,相当于进程的IDint MPI_Comm_rank(MPI_Comm comm,int*rank);,2023年2月,20/55,更新的Hello World(c),#include#include mpi.hmain(int argc,char*argv)int myid,numprocs;MPI_Init(,2023年2月,21/55,更新的Hello World(F77),program maininclude mpif.hinteger ierr,myid,numprocscall MPI_INIT(ierr)call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)print*,I am,myid,of,numprocscall MPI_FINALIZE(ierr)end,2023年2月,22/55,:运行结果,dairnode01$mpicc o hello1 hello1.cdairnode01$mpirun-np 4 hello1I am 0 of 4I am 1 of 4I am 2 of 4I am 3 of 4dairnode01$,计算机打印字符,我们输入的命令,2023年2月,23/55,:写MPI并行通信程序-Send和Recv,Greeting执行过程,2023年2月,24/55,有消息传递greetings(c),#include#include mpi.hmain(int argc,char*argv)int numprocs,myid,source;MPI_Status status;char message100;MPI_Init(,2023年2月,25/55,有消息传递greetings(c),if(myid!=0)strcpy(message,Hello World!);MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);else/*myid=0*/for(source=1;source numprocs;source+)MPI_Recv(message,100,MPI_CHAR,source,99,MPI_COMM_WORLD,/*end main*/,2023年2月,26/55,解剖greetings程序,头文件:mpi.h/mpif.h.int MPI_Init(int*argc,char*argv)启动MPI环境,标志并行代码的开始.并行代码之前,第一个mpi函数(除MPI_Initialize()外).要求main必须带参数运行,否则出错.通信域(通信空间):MPI_COMM_WORLD:一个通信空间是一个进程组和一个上下文的组合.上下文可看作为组的超级标签,用于区分不同的通信域.在执行函数MPI_Init之后,一个MPI程序的所有进程形成一个缺省的组,这个组的通信域即被写作MPI_COMM_WORLD.该参数是MPI通信操作函数中必不可少的参数,用于限定参加通信的进程的范围.,2023年2月,27/55,解剖greetings程序,int MPI_Comm_size(MPI_Comm comm,int*size)获得通信空间comm中规定的组包含的进程的数量.指定一个communicator,也指定了一组共享该空间的进程,这些进程组成该communicator的group.int MPI_Comm_rank(MPI_Comm comm,int*rank)得到本进程在通信空间中的rank值,即在组中的逻辑编号(从0开始).int MPI_Finalize()标志并行代码的结束,结束除主进程外其它进程.之后串行代码仍可在主进程(rank=0)上运行(如果必须).,2023年2月,28/55,讲座内容提示,基本的MPI基本概念点到点通信(Point to point)MPI中API的主要内容,为MPI最基本,最重要的内容MPI程序的编译和运行深入MPI用户自定义(/派生)数据类型(User-defined(Derived)data type)事实上MPI的所有数据类型均为MPI自定义类型支持异构系统允许消息来自不连续的或类型不一致的存储区(结构,数组散元)集合通信(Collective)数据移动,数据聚集,同步基于point to point 构建MPI环境管理函数组,上下文和通信空间/通信域的管理实例,2023年2月,29/55,Point to Point通信,单个进程对单个进程的通信,重要且复杂术语Blocking(阻塞):一个例程须等待操作完成才返回,返回后用户可以重新使用调用中所占用的资源.Non-blocking(非阻塞):一个例程不必等待操作完成便可返回,但这并不意味着所占用的资源可被重用.Local(本地):过程的完成仅依赖于本地正在执行的进程。Non-local(非本地):如果过程的完成要求其他进程的 MPI 过程完成。,2023年2月,30/55,Blocking Send,int MPI_Send(void*buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm);IN buf 发送缓冲区的起始地址 IN count 要发送信息的元素个数 IN datatype 发送信息的数据类型 IN dest 目标进程的rank值 IN tag 消息标签 IN comm 通信域,2023年2月,31/55,Blocking Receive,int MPI_Recv(void*buf,int count,MPI_Datatype datatype,int source,int tag,MPI_Comm comm,MPI_Status*status);OUT buf 发送缓冲区的起始地址 IN count 要发送信息的元素个数 IN datatype 发送信息的数据类型 IN dest 目标进程的rank值 IN tag 消息标签 IN comm 通信域OUT statusstatus对象,包含实际接收到的消息的有关信息,2023年2月,32/55,MPI消息,MPI消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容数据:信封:,2023年2月,33/55,2023年2月,34/55,消息数据,由count个类型为datatype的连续数据空间组成,起始地址为buf不是以字节数,而是以元素的个数指定消息的长度count可以是零,这种情况下消息的数据部分是空的MPI基本数据类型相应于宿主语言的基本数据类型,2023年2月,35/55,MPI基本数据类型,2023年2月,36/55,MPI标识一条消息的信息包含四个域:Source:发送进程隐式确定,由进程的rank值唯一标识Destination:Send函数参数确定Tag:Send函数参数确定,用于识别不同的消息(0,UB),UB:MPI_TAG_UB=32767.Communicator:缺省MPI_COMM_WORLDGroup:有限/N,有序/Rank 0,1,2,N-1Contex:Super_tag,用于标识该通讯空间.,消息信封,2023年2月,37/55,status参数,当使用MPI_ANY_SOURCE或/和MPI_ANY_TAG接收消息时如何确定消息的来源source 和 tag值呢?在C中,结构,status.MPI_SOURCE,status.MPI_TAG.在Fortran中,数组,source=status(MPI_SOURCE),tag=status(MPI_TAG).Status还可用于返回实际接收到消息的长度int MPI_Get_count(MPI_Status status,MPI_Datatype datatype,int*count)IN status 接收操作的返回值.IN datatype 接收缓冲区中元素的数据类型.OUT count 接收消息中的元素个数.,2023年2月,38/55,消息匹配,接收buffer必须至少可以容纳count个由datatype参数指明类型的数据.如果接收buf太小,将导致溢出、出错.消息匹配参数匹配 dest,tag,comm/source,tag,commSource=MPI_ANY_SOURCE:接收任意处理器来的数据(任意消息来源).Tag=MPI_ANY_TAG:匹配任意tag值的消息(任意tag消息).Source=destination 是允许的,但是不安全的,可能导致死锁。消息传送被限制在同一个communicator.在send函数中必须指定唯一的接收者(Push/pull通讯机制).,2023年2月,39/55,分析greetings,#include#include mpi.h“main(int argc,char*argv)int numprocs;/*进程数,该变量为各处理器中的同名变量,存储是分布的*/int myid;/*我的进程ID,存储也是分布的*/MPI_Status status;/*消息接收状态变量,存储也是分布的*/char message100;/*消息buffer,存储也是分布的*/*初始化MPI*/MPI_Init(,2023年2月,40/55,分析greetings,if(myid!=0)/*建立消息*/sprintf(message,Greetings from process%d!,myid);/*发送长度取strlen(message)+1,使0也一同发送出去*/MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);else/*my_rank=0*/for(source=1;source numprocs;source+)MPI_Recv(message,100,MPI_CHAR,source,99,MPI_COMM_WORLD,/*End main*/,2023年2月,41/55,Greetings执行过程,假设进程数为3(进程0)(进程1)(进程2)(rank=0)(rank=1)(rank=2),.Recv();.Recv();.,.Send();.,.Send().,问题:进程1和2谁先开始发送消息?谁先完成发送?,?,%,2023年2月,42/55,运行greetings,dairnode01$mpicc o greeting greeting.cdairnode01$mpirun-np 4 greeting Greetings from process 1!Greetings from process 2!Greetings from process 3!dairnode01$,计算机打印字符,我们输入的命令,2023年2月,43/55,最基本的MPI,MPI调用借口的总数虽然庞大,但根据实际编写MPI的经验,常用的MPI调用的个数非常有限。上面介绍的是6个最基本的MPI函数。MPI_Init();MPI_Comm_size();MPI_Comm_rank();MPI_Send();MPI_Recv();MPI_Finalize();,MPI_Init();并行代码;MPI_Fainalize();只能有串行代码;,2023年2月,44/55,现在您已经能够用MPI进行并行编程了!,2023年2月,45/55,实例分析:求PI,2023年2月,46/55,串行代码,h=1.0/(double)n;sum=0.0;for(i=1;i=n;i+)x=h*(double)i 0.5);sum+=f(x);pi=h*sum;,double f(double a)return(4.0/(1.0+a*a);,2023年2月,47/55,并行代码,h=1.0/(double)n;sum=0.0;for(i=myid+1;i=n;i+=numprocs)x=h*(double)i 0.5);sum+=f(x);mypi=h*sum;MPI_Reduce(,double f(double a)return(4.0/(1.0+a*a);,2023年2月,48/55,cpi.c,#include mpi.h#include#include double f(double);double f(double a);return(4.0/(1.0+a*a);,2023年2月,49/55,cpi.c,int main(int argc,char*argv)int done=0,n,myid,numprocs,i;double PI25DT=3.141592653589793238462643;double mypi,pi,h,sum,x;double startwtime=0.0,endwtime;int namelen;char processor_nameMPI_MAX_PROCESSOR_NAME;MPI_Init(,2023年2月,50/55,cpi.c,n=0;while(!done)if(myid=0)if(n=0)n=100;else n=0;startwtime=MPI_Wtime();MPI_Bcast(,2023年2月,51/55,cpi.c,if(n=0)done=1;else h=1.0/(double)n;sum=0.0;for(i=myid+1;i=n;i+=numprocs)x=h*(double)i-0.5);sum+=f(x);mypi=h*sum;,2023年2月,52/55,cpi.c,MPI_Reduce(,2023年2月,53/55,谢谢!,

    注意事项

    本文(MPI并行程序设计自学教程.ppt)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开