您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 第5讲-MPI并行程序设计语言
第五讲MPI并行程序设计语言计算机学院计算机科学与技术系主讲:陈蕾博士/副教授E-mail:chenlei@njupt.edu.com2020年2月基本的MPI基本概念点到点通信(Pointtopoint)MPI中API的主要内容,为MPI最基本,最重要的内容MPI程序的编译和运行深入MPI用户自定义(/派生)数据类型(User-defined(Derived)datatype)事实上MPI的所有数据类型均为MPI自定义类型支持异构系统允许消息来自不连续的或类型不一致的存储区(结构,数组散元)集合通信(Collective)数据移动,数据聚集,同步基于pointtopoint构建MPI环境管理函数组,上下文和通信空间/通信子的管理实例消息传递并行程序设计MPI并行程序设计2020年2月消息传递并行程序设计消息传递并行程序设计指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。并行计算粒度大,特别适合于大规模可扩展并行算法由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法.消息传递是当前并行计算领域的一个非常重要的并行程序设计方式MPI并行程序设计什么是MPI?MPI(MessagePassingInterface)是一个消息传递接口标准,具有多种不同的免费、高效、实用的实现版本MPI提供一个可移植、高效、灵活的消息传递接口库MPI以语言独立的形式存在,可运行在不同的操作系统和硬件平台上几乎所有的并行计算机厂商都提供对它的支持,成为了事实上的并行编程标准MPI提供与C和Fortran语言的绑定MPI并行程序设计2020年2月MPI标准产生于1992年4月MPI是一个库,而不是一门语言,因此对MPI的使用必须和特定的语言结合起来进行MPI的版本MPICH:最重要的一种MPI实现,免费获取网址:(LocalAreaMulticomputer):由美国OhioStateUniversity开发,:由Edinburgh大学开发的另外一个免费MPI实现,是在EdinburghParallelComputingCenter的支持下进行的,并行程序设计2020年2月2020年2月MPI并行程序设计为什么要用MPI?高可移植性MPI已在IBMPC机上、MSWindows上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran并行程序可不加改变地运行在IBMPC、MSWindows、Unix工作站、以及各种并行机上。2020年2月MPI并行程序设计从简单入手!下面我们首先以C语言的形式给出一个最简单的MPI并行程序.该程序在终端打印出HelloWorld!字样.“HelloWorld”:一声来自新生儿的问候.2020年2月MPI并行程序设计Helloworld#includestdio.h#includempi.h“main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}2020年2月MPI并行程序设计MPI函数约定C必须包含mpi.h.MPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写.MPI函数的参数被标志为以下三种类型:IN:参数在例程的调用中不会被修正.OUT:参数在例程的调用中可能会被修正.INOUT:参数在一些例程中为IN,而在另一些例程中为OUT.2020年2月MPI并行程序设计MPI初始化-MPI_INITintMPI_Init(int*argc,char**argv)MPI_Init是MPI程序的第一个调用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句。启动MPI环境,标志并行代码的开始.并行代码之前,第一个mpi函数.要求main必须带参数运行,否则出错.2020年2月MPI并行程序设计MPI结束-MPI_FINALIZEintMPI_Finalize(void)MPI_Finalize是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。标志并行代码的结束,结束除主进程外其它进程.之后串行代码仍可在主进程(rank=0)上运行(如果必须).2020年2月MPI并行程序设计MPI程序的的编译与运行mpicchello.c默认生成a.out的可执行代码.mpicc–ohellohello.c生成hello的可执行代码.mpirun–np4a.outmpirun–np4hello4指定np的实参,表示进程数,由用户指定.a.out/hello要运行的MPI并行程序.%小写o%np:Thenumberofprocess.2020年2月MPI并行程序设计:运行我们的MPI程序![dair@node01~]$mpicc-ohellohello.c[dair@node01~]$./hello()[0]Abortingprogram!Couldnotcreatep4procgroup.Possiblemissingfileorprogramstartedwithoutmpirun.[dair@node01~]$mpirun-np4hello()HelloWorld!HelloWorld!HelloWorld!HelloWorld![dair@node01~]$计算机打印字符我们输入的命令2020年2月MPI并行程序设计:Hello是如何被执行的?SPMD:SingleProgramMultipleData(SPMD)::::#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}HelloWorld!HelloWorld!HelloWorld!HelloWorld!#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}2020年2月MPI并行程序设计:开始写MPI并行程序在写MPI程序时,我们常需要知道以下两个问题的答案:任务由多少个进程来进行并行计算?我是哪一个进程?2020年2月MPI并行程序设计:开始写MPI并行程序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);2020年2月MPI并行程序设计更新的HelloWorld#includestdio.h#includempi.hmain(intargc,char*argv[]){intmyid,numprocs;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);printf(“Iam%dof%d\n,myid,numprocs);MPI_Finalize();}2020年2月MPI并行程序设计:运行结果[dair@node01~]$mpicc–ohellohello.c[dair@node01~]$mpirun-np4helloIam0of4Iam1of4Iam2of4Iam3of4[dair@node01~]$计算机打印字符我们输入的命令2020年2月MPI并行程序设计有消息传递Greeting进程0rank=0..Send()...进程1rank=1进程2rank=2进程3rank=3..Send().....Send().....Recv()...2020年2月MPI并行程序设计greetings#includestdio.h#includempi.hmain(intargc,char*argv[]){intnumprocs,myid,source;MPI_Statusstatus;charmessage[100];MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);2020年2月MPI并行程序设计有消息传递greetingsif(myid!=0){strcpy(message,HelloWorld!);MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);}else{/*myid==0*/for(source=1;sourcenumprocs;source++){MPI_Recv(message,100,MPI_CHAR,source,99,MPI_COMM_WORLD,&status);printf(%s\n,message);}}MPI_Finalize();}/*endmain*/2020年2月MPI并行程序设计解析greetings程序头文件:mpi.h.intMPI_Init(int*argc,char***argv)启动MPI环境,标志并行代码的开始.并行代码之前,第一个mpi函数.要求main必须带参数运行,否则出错.通信子(通信空间):MPI_COMM_WORLD:一个通信空间是一个进程组和一个上下文的组合.上下文可看作为组的超级标签,用于区分不同的通信子.在执行函数MPI_Init之后,一个MPI程序的所有进程形成一个缺省的组,这个组的通信子即被写作MPI_COMM_WORLD.该参数是MPI通信操作函数中必不可少的参数,用于限定参加通信的进程的范围.2020年2月MPI并行程序设计解析greetings程序intMPI_Comm_size(MPI_Commcomm,int*size)获得通信空间comm中规定的组包含的进程的数量.指定一个communicator,也指定了一组共享该空间的进程,这些进程组成该communicat
本文标题:第5讲-MPI并行程序设计语言
链接地址:https://www.777doc.com/doc-3993079 .html