MPI并行程序设计自学教程ppt课件.ppt_第1页
MPI并行程序设计自学教程ppt课件.ppt_第2页
MPI并行程序设计自学教程ppt课件.ppt_第3页
MPI并行程序设计自学教程ppt课件.ppt_第4页
MPI并行程序设计自学教程ppt课件.ppt_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2019年12月,1/55,并行程序设计简介,2019年12月,2/55,讲座内容提示,基本概念基本的MPI点到点通信(Pointtopoint)MPI中API的主要内容,为MPI最基本,最重要的内容MPI程序的编译和运行实例,2019年12月,3/55,参考文献,MPI-thecompletereference.MarcSnir,MITPress,1998.ISBN0262692155,0262692163.UsingMPI:portableparallelprogrammingwiththemessage-passinginterface,WilliamGropp,MITPress,1999.2ndedition.ISBN0262571323.UsingMPI-2:advancedfeaturesofthemessage-passinginterface.WilliamGropp,MITPress,1999.ISBN0262571331.高性能计算并行编程技术-MPI并行程序设计,都志辉,清华大学出版社,2001年8月。,2019年12月,4/55,多线程库标准Win32API.POSIXthreads.编译制导标准OpenMP可移植共享存储并行编程标准.消息传递库标准MPIPVM,并行编程标准,本讨论的重点,2019年12月,5/55,消息传递并行程序设计,消息传递并行程序设计指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。并行计算粒度大,特别适合于大规模可扩展并行算法由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法.消息传递是当前并行计算领域的一个非常重要的并行程序设计方式,2019年12月,6/55,什么是MPI?,MassagePassingInterface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C一种新的库描述,不是一种语言。共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用MPI是一种标准或规范的代表,而不是特指某一个对它的具体实现MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准,2019年12月,7/55,MPI的发展过程,发展的两个阶段MPI1.1:1995MPICH:是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性.MPI1.22.0:动态进程,并行I/O,远程存储访问、支持F90和C+(1997).,2019年12月,8/55,为什么要用MPI?,高可移植性MPI已在IBMPC机上、MSWindows上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran并行程序可不加改变地运行在IBMPC、MSWindows、Unix工作站、以及各种并行机上。,2019年12月,9/55,:从简单入手Init和Finalize,下面我们首先分别以C语言和Fortran语言的形式给出一个最简单的MPI并行程序Hello(下页).该程序在终端打印出HelloWorld!字样.“HelloWorld”:一声来自新生儿的问候.,2019年12月,10/55,Helloworld(C),#include#includempi.h“main(intargc,char*argv)MPI_Init(,2019年12月,11/55,Helloworld(Fortran),programmainincludempif.hintegerierrcallMPI_INIT(ierr)print*,Hello,world!callMPI_FINALIZE(ierr)end,2019年12月,12/55,C和Fortran中MPI函数约定,C必须包含mpi.h.MPI函数返回出错代码或MPI_SUCCESS成功标志.MPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写.Fortran必须包含mpif.h.通过子函数形式调用MPI,函数最后一个参数为返回值.MPI-前缀,且函数名全部为大写.MPI函数的参数被标志为以下三种类型:IN:参数在例程的调用中不会被修正.OUT:参数在例程的调用中可能会被修正.INOUT:参数有初始值,且在例程的调用中可能会被修正,2019年12月,13/55,MPI初始化-MPI_INIT,intMPI_Init(int*argc,char*argv)MPI_INIT(IERROR)MPI_INIT是MPI程序的第一个调用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句。启动MPI环境,标志并行代码的开始.并行代码之前,第一个mpi函数(除MPI_Initialized()外).要求main必须带参数运行,否则出错.,2019年12月,14/55,MPI结束-MPI_FINALIZE,intMPI_Finalize(void)MPI_FINALIZE(IERROR)MPI_FINALIZE是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。标志并行代码的结束,结束除主进程外其它进程.之后串行代码仍可在主进程(rank=0)上运行(如果必须).,2019年12月,15/55,MPI程序的的编译与运行,mpif77hello.f或mpicchello.c默认生成a.out的可执行代码.mpif77ohellohello.f或mpiccohellohello.c生成hello的可执行代码.mpirunnp4a.outmpirunnp4hello4指定np的实参,表示进程数,由用户指定.a.out/hello要运行的MPI并行程序.,%小写o,np:Thenumberofprocess.,2019年12月,16/55,:运行我们的MPI程序!,dairnode01$mpicc-ohellohello.cdairnode01$./hello()0Abortingprogram!Couldnotcreatep4procgroup.Possiblemissingfileorprogramstartedwithoutmpirun.dairnode01$mpirun-np4hello()HelloWorld!HelloWorld!HelloWorld!HelloWorld!dairnode01$,计算机打印字符,我们输入的命令,2019年12月,17/55,:Hello是如何被执行的?,SPMD:SingleProgramMultipleData(SIMD):,#includempi.h#includemain(intargc,char*argv)MPI_Init(,#includempi.h#includemain(intargc,char*argv)MPI_Init(,#includempi.h#includemain(intargc,char*argv)MPI_Init(,#includempi.h#includemain(intargc,char*argv)MPI_Init(,HelloWorld!HelloWorld!HelloWorld!HelloWorld!,#includempi.h#includemain(intargc,char*argv)MPI_Init(,rshssh,2019年12月,18/55,:开始写MPI并行程序Comm_size和Comm_rank,在写MPI程序时,我们常需要知道以下两个问题的答案:任务由多少个进程来进行并行计算?我是哪一个进程?,2019年12月,19/55,MPI提供了下列函数来回答这些问题:用MPI_Comm_size获得进程个数pintMPI_Comm_size(MPI_Commcomm,int*size);用MPI_Comm_rank获得进程的一个叫rank的值,该rank值为0到p-1间的整数,相当于进程的IDintMPI_Comm_rank(MPI_Commcomm,int*rank);,2019年12月,20/55,更新的HelloWorld(c),#include#includempi.hmain(intargc,char*argv)intmyid,numprocs;MPI_Init(,2019年12月,21/55,更新的HelloWorld(F77),programmainincludempif.hintegerierr,myid,numprocscallMPI_INIT(ierr)callMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)callMPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)print*,Iam,myid,of,numprocscallMPI_FINALIZE(ierr)end,2019年12月,22/55,:运行结果,dairnode01$mpiccohello1hello1.cdairnode01$mpirun-np4hello1Iam0of4Iam1of4Iam2of4Iam3of4dairnode01$,计算机打印字符,我们输入的命令,2019年12月,23/55,:写MPI并行通信程序-Send和Recv,Greeting执行过程,2019年12月,24/55,有消息传递greetings(c),#include#includempi.hmain(intargc,char*argv)intnumprocs,myid,source;MPI_Statusstatus;charmessage100;MPI_Init(,2019年12月,25/55,有消息传递greetings(c),if(myid!=0)strcpy(message,HelloWorld!);MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);else/*myid=0*/for(source=1;source=32767.Communicator:缺省MPI_COMM_WORLDGroup:有限/N,有序/Rank0,1,2,N-1Contex:Super_tag,用于标识该通讯空间.,消息信封,2019年12月,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还可用于返回实际接收到消息的长度intMPI_Get_count(MPI_Statusstatus,MPI_Datatypedatatype,int*count)INstatus接收操作的返回值.INdatatype接收缓冲区中元素的数据类型.OUTcount接收消息中的元素个数.,2019年12月,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通讯机制).,2019年12月,39/55,分析greetings,#include#includempi.h“main(intargc,char*argv)intnumprocs;/*进程数,该变量为各处理器中的同名变量,存储是分布的*/intmyid;/*我的进程ID,存储也是分布的*/MPI_Statusstatus;/*消息接收状态变量,存储也是分布的*/charmessage100;/*消息buffer,存储也是分布的*/*初始化MPI*/MPI_Init(,2019年12月,40/55,分析greetings,if(myid!=0)/*建立消息*/sprintf(message,Greetingsfromprocess%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;sourcenumprocs;source+)MPI_Recv(message,100,MPI_CHAR,source,99,MPI_COMM_WORLD,/*Endmain*/,2019年12月,41/55,Greetings执行过程,假设进程数为3(进程0)(进程1)(进程2)(rank=0)(rank=1)(rank=2),.Recv();.Recv();.,.Send();.,.Send().,问题:进程1和2谁先开始发送消息?谁先完成发送?,?,%,2019年12月,42/55,运行greetings,dairnode01$mpiccogreetinggreeting.cdairnode01$mpirun-np4greetingGreetingsfromprocess1!Greetingsfromprocess2!Greetingsfromprocess3!dairnode01$,计算机打印字符,我们输入的命令,2019年12月,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();只能有串行代码;,2019年12月,44/55,现在您已经能够用MPI进行并行编程了!,2019年12月,45/55,实例分析:求PI,2019年12月,46/55,串行代码,h=1.0/(double)n;sum=0.0;for(i=1;i=n;i+)x=h*(double)i0.5);sum+=f(x);pi=h*sum;,doublef(doublea)return(4.0/(1.0+a*a);,2019年12月,47/55,并行代码,h=1.0/(double)n;sum=0.0;for(i=myi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论