您好,欢迎访问三七文档
MPI并行编程入门中国科学院计算机网络信息中心超级计算中心参考材料莫则尧科学出版社张林波清华大学出版社都志辉清华大学出版社消息传递平台MPI•什么是MPI(MessagePassingInterface)–是函数库规范,而不是并行语言;操作如同库函数调用–是一种标准和规范,而非某个对它的具体实现(MPICH等),与编程语言无关–是一种消息传递编程模型,并成为这类编程模型的代表•Whatisthemessage?DATA+ENVELOPE•MPI的目标–较高的通信性能–较好的程序可移植性–强大的功能•MPI的产生–1992-1994年,MPI1.1版本问世–1995-1997年,MPI2.0版本出现•扩充并行I/O•远程存储访问•动态进程管理等•MPI的语言绑定–Fortran(科学与工程计算)–C(系统和应用程序开发)•主要的MPI实现–并行机厂商提供–高校、科研部门•MPICH()•LAMMPI()消息传递平台MPI•MPI程序编译与运行–程序编译C:%mpicc-ompiprogmpisrc.cFortran77:%mpif77-ompiprogmpisrc.f–程序运行%mpirun-np4mpiprog消息传递平台MPI•程序执行过程中不能动态改变进程的个数•申请的进程数np与实际处理器个数无关MPI基础知识•进程与消息传递•MPI重要概念•MPI函数一般形式•MPI原始数据类型•MPI程序基本结构•MPI几个基本函数•并行编程模式进程1进程2•单个进程(process)–进程与程序相联,程序一旦在操作系统中运行即成为进程。进程拥有独立的执行环境(内存、寄存器、程序计数器等),是操作系统中独立存在的可执行的基本程序单位–串行应用程序编译形成的可执行代码,分为“指令”和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。进程与消息传递内存•单机内多个进程–多个进程可同时存在于单机内同一操作系统。操作系统负责调度分时共享处理机资源(CPU、内存、存储、外设等)–进程间相互独立(内存空间不相交)。在操作系统调度下各自独立地运行,例如多个串行应用程序在同一台计算机运行–进程间可以相互交换信息。例如数据交换、同步等待,消息是这些交换信息的基本单位,消息传递是指这些信息在进程间的相互交换,是实现进程间通信的唯一方式进程与消息传递•包含于通过网络联接的不同处理器的多个进程–进程独立存在,并位于不同的处理器,由各自独立的操作系统调度,享有独立的CPU和内存资源–进程间相互信息交换,可依靠消息传递–最基本的消息传递操作包括发送消息send、接受消息receive、进程同步barrier、归约reduction等进程与消息传递•进程组(processgroup)指MPI程序的全部进程集合的一个有序子集且进程组中每个进程被赋于一个在该组中唯一的序号(rank),用于在该组中标识该进程。序号的取值范围是[0,进程数-1]•通信器(communicator)–理解为一类进程的集合即一个进程组,且在该进程组,进程间可以相互通信–任何MPI通信函数均必须在某个通信器内发生–MPI系统提供省缺的通信器MPI_COMM_WORLD,所有启动的MPI进程通过调用函数MPI_Init()包含在该通信器内;各进程通过函数MPI_Comm_size()获取通信器包含的(初始启动)的MPI进程个数–组内通信器和组间通信器MPI重要概念•进程序号(rank)用来在一个进程组或通信器中标识一个进程–MPI程序中的进程由进程组或通信器序号唯一确定,序号相对于进程组或通信器而言(假设np个处理器,标号0…np-1)–同一个进程在不同的进程组或通信器中可以有不同的序号,进程的序号是在进程组或通信器被创建时赋予的–MPI系统提供了一个特殊的进程序号MPI_PROC_NULL,它代表空进程(不存在的进程),与MPI_PROC_NULL间的通信实际上没有任何作用•消息(message)–分为数据(data)和包装(envelope)两个部分–包装由接收进程序号/发送进程序号、消息标号和通信器三部分组成;数据包含用户将要传递的内容MPI重要概念•MPI对象MPI系统内部定义的数据结构,包括数据类型(如MPI_INT)、通信器(MPI_Comm)、通信请求(MPI_Request)等,它们对用户不透明。在FORTRAN语言中,所有MPI对象均必须说明为“整型变量INTEGER”。•MPI联接器(handles)联接MPI对象的具体变量,用户可以通过它访问和参与相应MPI对象的具体操作。例如,MPI系统内部提供的通信器MPI_COMM_WORLD。在FORTRAN语言中,所有MPI联接器均必须说明为“整型变量INTEGER”MPI重要概念C:error=MPI_Xxxxx(parameter,...);MPI_Xxxxx(parameter,...);–整型错误码由函数值返回–除MPI_Wtime()和MPI_Wtick()外,所有MPI的C函数均返回一个整型错误码。成功时返回MPI_SUCCESS,其他错误代码依赖于执行Fortran77:CALLMPI_XXXXX(parameter,...,IERROR)–整型错误码由函数的参数返回–除MPI_WTIME()和MPI_WTICK()外为子函数程序(function),Fortran77的所有MPI过程都是Fortran77的子例行程序(subroutine)MPI函数一般形式MPI原始数据类型MPIDatatypeCDatatypeMPI_CHARSignedcharMPI_SHORTSignedshortintMPI_INTSignedintMPI_LONGSignedlogintMPI_UNSIGNED_CHARUnsignedcharMPI_UNSIGNED_SHORTUnsignedshortintMPI_UNSIGNEDUnsignedintMPI_UNSIGNED_LONGUnsignedlongintMPI_FLOATFloatMPI_DOUBLEDoubleMPI_LONG_DOUBLELongdoubleMPI_BYTEMPI_PACKEDMPI_BYTE一个字节MPI_PACKED打包数据MPI原始数据类型MPIDatatypeFortranDatatypeMPI_INTEGERINTEGERMPI_REALREALMPI_DOUBLE_PRECISIONDOUBLEPRECISIONMPI_COMPLEXCOMPLEXMPI_LOGICALLOGICALMPI_CHARACTERCHARACTER(1)MPI_BYTEMPI_PACKEDMPIincludefile#includempi.hvoidmain(intargc,char*argv[]){intnp,rank,ierr;ierr=MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&np);/*DoSomeWorks*/ierr=MPI_Finalize();}变量定义#includempi.hvoidmain(intargc,char*argv[]){intnp,rank,ierr;ierr=MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&np);/*DoSomeWorks*/ierr=MPI_Finalize();}MPI环境初始化#includempi.hvoidmain(intargc,char*argv[]){intnp,rank,ierr;ierr=MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&np);/*DoSomeWorks*/ierr=MPI_Finalize();}执行程序进程间通信#includempi.hvoidmain(intargc,char*argv[]){intnp,rank,ierr;ierr=MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&np);/*DoSomeWorks*/ierr=MPI_Finalize();}退出MPI环境#includempi.hvoidmain(intargc,char*argv[]){intnp,rank,ierr;ierr=MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&np);/*DoSomeWorks*/ierr=MPI_Finalize();}MPI程序基本结构•Index–MPI_Init–MPI_Initialized–MPI_Comm_size–MPI_Comm_rank–MPI_Finalize–MPI_Abort–MPI_Get_processor_name–MPI_Get_version–MPI_WtimeMPI几个基本函数•初始化MPI系统C:intMPI_Init(int*argc,char*argv[])Fortran77:MPI_INIT(IERROR)INTEGERIERROR•通常为第一个调用的MPI函数,除MPI_Initialized外•在C接口中,MPI系统通过argc和argv得到命令行参数,并且会把MPI系统专用的参数删除,留下用户的解释参数MPI几个基本函数•检测MPI系统是否已经初始化C:intMPI_Initialized(int*flag)Fortran77:MPI_INIT(FLAG,IERROR)LOGICALFLAGINTEGERIERROR•唯一可在MPI_Init前使用的函数•已经调用MPI_Init,返回flag=true,否则flag=falseMPI几个基本函数•得到通信器的进程数和进程在通信器中的标号C:intMPI_Comm_size(MPI_Commcomm,int*size)intMPI_Comm_rank(MPI_Commcomm,int*rank)Fortran77:MPI_COMM_SIZE(COMM,SIZE,IERROR)INTEGERCOMM,SIZE,IERRORMPI_COMM_RANK(COMM,RANK,IERROR)INTEGERCOMM,RANK,IERRORMPI几个基本函数•退出MPI系统C:intMPI_Finalize(void)Fortran77:MPI_FINALIZE(IERROR)•每个进程都必须调用,使用后不准许调用任何MPI函数•若不执行MPI退出函数,进程可能被悬挂•用户在调用该函数前,应确保非阻塞通讯结束MPI几个基本函数•异常终止MPI程序C:intMPI_Abort(MPI_Commcomm,interrorcode)Fortran77:MPI_ABORT(COMM,ERRORCODE,IERROR)INTEGERCOMM,ERRORCODE,IERROR•在出现了致命错误而希望异常终止MPI程序时执行•MPI系统会设法终止comm通信器中所有进程•输入整型参数errorcode,将被作为进程的退出码返回给系统MPI几个基本函数•获取处理器的名称C:intMPI_Get_processor_name(char*name,int*resultlen)
本文标题:MPI并行编程入门
链接地址:https://www.777doc.com/doc-7372427 .html