您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > MPI并行程序设计-129
并行编程原理及程序设计ParallelProgramming:FundamentalsandImplementation曙光信息产业有限公司2020年2月2020年2月MPI并行程序设计1/129参考文献•黄铠,徐志伟著,陆鑫达等译.可扩展并行计算技术,结构与编程.北京:机械工业出版社,P.33~56,P.227~237,2000.•陈国良著.并行计算—结构、算法、编程.北京:高等教育出版社,1999.•BarryWilkinsonandMichaelAllen.ParallelProgramming(TechniquesandApplicationsusingNetworkedWorkstationsandParallelComputers).PrenticeHall,1999.•李晓梅,莫则尧等著.可扩展并行算法的设计与分析.北京:国防工业出版社,2000.•张宝琳,谷同祥等著.数值并行计算原理与方法.北京:国防工业出版社,1999.•都志辉著.高性能计算并行编程技术—MPI并行程序设计.北京:清华大学出版社,2001.2020年2月MPI并行程序设计2/129相关网址•MPI:,•Pthreads:•PVM:•OpemMP:•网上搜索:并行程序设计ParallelProgrammingwiththeMassagePassingInterface(MPI)2020年2月MPI并行程序设计4/129并行编程标准•多线程库标准–Win32API.–POSIXthreads.•编译制导标准–OpenMP–可移植共享存储并行编程标准.•消息传递库标准–MPI–PVM2020年2月MPI并行程序设计5/129消息传递并行程序设计•消息传递并行程序设计–指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。–在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。–这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。•并行计算粒度大,特别适合于大规模可扩展并行算法–由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法.•消息传递是当前并行计算领域的一个非常重要的并行程序设计方式2020年2月MPI并行程序设计6/129什么是MPI?•MassagePassingInterface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C–一种新的库描述,不是一种语言。共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用–MPI是一种标准或规范的代表,而不是特指某一个对它的具体实现–MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准2020年2月MPI并行程序设计7/129MPI的发展过程•发展的两个阶段–MPI1.1:1995•MPICH:是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性–MPI1.2~2.0:动态进程,并行I/O,支持F90和C++(1997)2020年2月MPI并行程序设计8/129为什么要用MPI?•高可移植性–MPI已在IBMPC机上、MSWindows上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran并行程序可不加改变地运行在IBMPC、MSWindows、Unix工作站、以及各种并行机上。2020年2月MPI并行程序设计9/129讲座内容•基本的MPI–基本概念–点到点通信(Pointtopoint)•MPI中API的主要内容,为MPI最基本,最重要的内容–MPI程序的编译和运行•深入MPI–用户自定义(/派生)数据类型(User-defined(Derived)datatype)•事实上MPI的所有数据类型均为MPI自定义类型–支持异构系统–允许消息来自不连续的或类型不一致的存储区(结构,数组散元)–集合通信(Collective)•数据移动,数据聚集,同步•基于pointtopoint构建–MPI环境管理函数•组,上下文和通信空间/通信子的管理•实例2020年2月MPI并行程序设计10/129从简单入手!•下面我们首先分别以C语言和Fortran语言的形式给出一个最简单的MPI并行程序Hello(下页)。•该程序在终端打印出HelloWorld!字样。2020年2月MPI并行程序设计11/129Helloworld(C)#includestdio.h#includempi.h“main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}2020年2月MPI并行程序设计12/129Helloworld(Fortran)programmaininclude‘mpif.h’integerierrcallMPI_INIT(ierr)print*,'Hello,world!'callMPI_FINALIZE(ierr)end2020年2月MPI并行程序设计13/129C和Fortran中MPI函数约定•C–必须包含mpi.h.–MPI函数返回出错代码或MPI_SUCCESS成功标志.–MPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写.•Fortran–必须包含mpif.h.–通过子函数形式调用MPI,函数最后一个参数为返回值.–MPI-前缀,且函数名全部为大写.•MPI函数的参数被标志为以下三种类型:–IN:参数在例程的调用中不会被修正.–OUT:参数在例程的调用中可能会被修正.–INOUT:参数在一些例程中为IN,而在另一些例程中为OUT.2020年2月MPI并行程序设计14/129MPI初始化-MPI_INITintMPI_Init(int*argc,char**argv)MPI_INIT(IERROR)–MPI_INIT是MPI程序的第一个调用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句。–启动MPI环境,标志并行代码的开始.–并行代码之前,第一个mpi函数(除MPI_Initialize()外).–要求main必须带参数运行,否则出错.2020年2月MPI并行程序设计15/129MPI结束-MPI_FINALIZEintMPI_Finalize(void)MPI_FINALIZE(IERROR)–MPI_FINALIZE是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。–标志并行代码的结束,结束除主进程外其它进程.–之后串行代码仍可在主进程(rank=0)上运行(如果必须).2020年2月MPI并行程序设计16/129MPI程序的的编译与运行•mpif77hello.f或mpicchello.c–默认生成a.out的可执行代码.•mpif77–ohellohello.f或•mpicc–ohellohello.c–生成hello的可执行代码.•mpirun–np4a.out•mpirun–np4hello–4指定np的实参,表示进程数,由用户指定.–a.out/hello要运行的MPI并行程序.2020年2月MPI并行程序设计17/129%小写o%np:Thenumberofprocess.:运行我们的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并行程序设计18/129计算机打印字符我们输入的命令:Hello是如何被执行的?•SPMD:SingleProgramMultipleData(MIMD)::::2020年2月MPI并行程序设计19/129#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();}:开始写MPI并行程序•在写MPI程序时,我们常需要知道以下两个问题的答案:–任务由多少个进程来进行并行计算?–我是哪一个进程?2020年2月MPI并行程序设计20/129:开始写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并行程序设计21/129更新的HelloWorld(c)#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并行程序设计22/129更新的HelloWorld(Fortran)programmaininclude‘mpif.h’integerierr,myid,numprocscallMPI_INIT(ierr)callMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)callMPI
本文标题:MPI并行程序设计-129
链接地址:https://www.777doc.com/doc-3852779 .html