您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > MPI并行程序设计基础
MPI并行程序设计解决方案中心何沧平目录MPI简介基本功能6个基本函数实例:Helloworld!集合通信数据广播、收集、散发、转置、归约综合实例:并行计算𝜋值MPI软件包的安装、使用OpenMPI,Mpich2,mvapich2MPI简介多线程库标准Win32API.POSIXthreads.编译制导标准OpenMP–可移植共享存储并行编程标准.消息传递库标准MPIPVM(并行虚拟机)并行编程标准消息传递并行程序设计指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。并行计算粒度大,特别适合于大规模可扩展并行算法由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法.消息传递是当前并行计算领域的一个非常重要的并行程序设计方式消息传递程序特点MPI:MessagePassingInterface消息传递接口•MPI论坛开发,支持Fortran、C/C++•一种新的库描述,不是一种语言。共有一二百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调•MPI是一种标准或规范的代表,而不是特指某一个对它的具体实现MPI及其实现软件包MPICHMVAPICHOpenMPIIntelMPI开发者ArgonneNationalLabOhioStateUniversityOpenMPIdevelopmentTeamIntel是否开源是是是否支持的网络以太网InfiniBand/以太网InfiniBand/以太网InfiniBand/以太网MPI标准2.23.02.22.22.2前身MPICHMVAPICHLAM-MPI/MPI1.1:1995MPICH:是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性.MPI1.2~2.0:动态进程,并行I/O,远程存储访问、支持F90和C++(1997).MPI2.2(2009年)MPI3.02012年9月21日MPI的发展历程MPI基本功能C必须包含mpi.h.MPI函数返回出错代码或MPI_SUCCESS成功标志.MPI_前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写.Fortran必须包含mpif.h(fortran77),usempi(fortran95)通过子函数形式调用MPI,函数最后一个参数为返回值MPI_前缀,且函数名全部为大写C和Fortran中MPI函数约定MPI程序中,一个独立参与通信的个体称为一个进程(process)一个MPI进程通常对应于一个普通的进程或线程在共享内存/消息传递混合模式程序中,一个MPI进程可能代表一组UNIX线程部分或全部进程构成的一个有序集合称为一个进程组。进程组中的每个进程都被赋于一个唯一的序号(rank),称为进程号,从0开始编号一个进程组及其相关属性(进程拓扑连接关系等),称为一个通信器(communicator)两个内置通信器,MPI_COMM_WORLD包含所有进程,MPI_COMM_SELF只包含进程自身进程、通信器MPI调用接口的总数虽然庞大,但根据实际编写MPI的经验,使用其中的6个最基本的函数就能编写一个完整的MPI程序去求解很多问题。这6个基本函数,包括启动和结束MPI环境,识别进程以及发送和接收消息。1.MPI_Init(…);2.MPI_Comm_size(…);3.MPI_Comm_rank(…);4.MPI_Send(…);5.MPI_Recv(…);6.MPI_Finalize();最基本的MPI函数MPI_Init(…);…并行代码;…MPI_Fainalize();只能有串行代码;最先被调用的MPI函数,完成MPI程序的所有初始化工作。启动MPI环境,标志并行代码的开始.参数argc和argv遇main函数传来,从而main必须带参数运行参数用来初始化并行环境(进程数、计算结点名、通信协议等)启动、结束MPI环境最后调后的MPI函数,清除MPI并行环境,转为串行此后,MPI语句的运行结果是不可预知的之后串行代码仍可在主进程(rank=0)上运行(如果必须)获得通信域comm/COMM内的进程数目,保存于size/SIZE中基本的MPI通信域函数获得该进程在通信域comm/COMM内的进程序号,保存于rank/RANK中基本的MPI点对点通信函数从指定的进程source接收消息,并且该消息的数据类型和消息标识和本接收进程指定的数据类型和消息标识相一致,收到的消息所包含的数据元素的个数最多不能超过count.将发送缓冲区中的count个datatype数据类型的数据发送到目的进程实例:HelloWorld进程0rank=0..Send()...进程1rank=1进程2rank=2进程3rank=3..Send().....Send().....Recv()...HelloWorld(c)#includestdio.h#include”mpi.h”intmain(intargc,char*argv[]){intnumprocs;/*进程数,该变量为各处理器中的同名变量*/intmyid;/*本进程ID,存储也是分布的*/MPI_Statusstatus;/*消息接收状态变量,存储也是分布的*/charmessage[100];/*消息buffer,存储也是分布的*/intsourceMPI_Init(&argc,&argv);/*初始化MPI*//*该函数被各进程各调用一次,得到自己的进程rank值*/MPI_Comm_rank(MPI_COMM_WORLD,&myid);/*该函数被各进程各调用一次,得到进程数*/MPI_Comm_size(MPI_COMM_WORLD,&numprocs);if(myid!=0){/*建立消息*/sprintf(message,\HelloWorld\fromprocess%d/%d!,myid,numprocs);/*发送长度取strlen(message)+1,使\0也一同发送出去*/MPI_Send(message,100,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();/*关闭MPI,标志并行代码段的结束*/return0;}/*Endmain*/MPI编译工具安装-OpenMPI最新稳定版1.6,=/public/software/mpi/ompi-1.6-gnuCC=gccCXX=g++FC=gfortranF77=gfortran$make-j8$makeinstallintel编译器版$./configureCC=iccCXX=iccF77=ifortFC=ifort…创建环境变量文件/public/software/profile.d/ompi-1.6-gnu.sh#!/bin/bashMPI_HOME=/public/software/mpi/openmpi-1.6-gnuexportPATH=${MPI_HOME}/bin:$PATHexportLD_LIBRARY_PATH=${MPI_HOME}/lib:$LD_LIBRARY_PATHexportMANPATH=${MPI_HOME}/share/man:$MANPATHunsetMPI_HOME$source/public/software/profile.d/ompi-1.6-gnu.sh$mpicc-ohellohello.c$./hello()[0]Abortingprogram!Couldnotcreatep4procgroup.Possiblemissingfileorprogramstartedwithoutmpirun.$mpirun-np4hello()“HelloWorld”fromprocess1/4!“HelloWorld”fromprocess2/4!“HelloWorld”fromprocess3/4!$编译、运行计算机打印字符我们输入的命令SPMD:SingleProgramMultipleData单程序多数据Hello是如何被执行的?#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);…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();}hellohellohellohello#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);…MPI_Finalize();}rsh\ssh::::MPI原生数据类型MPIC语言数据类型MPIFortran语言数据类型MPI_CHARsignedcharMPI_CHARACTERcharacter(1)MPI_SHORTsignedshortintMPI_INTsignedintMPI_INTEGERintegerMPI_LONGsignedlongintMPI_UNSIGNED_CHARunsignedcharMPI_UNSIGNED_SHORTunsignedshortintMPI_UNSIGNEDunsignedintMPI_UNSIGNED_LONGunsignedlongintMPI_FLOATfloatMPI_REALrealMPI_DOUBLEdoubleMPI_DOUBLE_PRECISIONdoubleprecisionMPI_LONG_DOUBLElongdoubleMPI_COMPLEXcomplexMPI_LOGICALlogicalMPI_BYTE8binarydigitsMPI_BYTE8binarydigitsMPI_PACKEDdatapackedorunpackedwithMPI_Pack()/MPI_UnpackMPI_PACKEDdatapackedorunpackedwithMPI_Pack()/MPI_UnpackMPI集合通信Broadcast--数据广播数据.MPI_Bcast();.数据.MPI_Bcast();.数据.MPI_Bcas
本文标题:MPI并行程序设计基础
链接地址:https://www.777doc.com/doc-5969637 .html