您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 消息传递并行编程环境
消息传递并行编程环境王彦棡2010年5月MPI123456789123456789123456789……11111111122222222333333334444444455555555……串行并行MPIOPENMPMPIMPIMPI是一种实现手段进程单个进程(process)–进程与程序相联,程序一旦在操作系统中运行即成为进程。进程拥有独立的执行环境(内存、寄存器、程序计数器等),是操作系统中独立存在的可执行的基本程序单位–串行应用程序编译形成的可执行代码,分为“指令”和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。进程1进程2内存进程单机内多个进程–多个进程可同时存在于单机内同一操作系统。操作系统负责调度分时共享处理机资源(CPU、内存、存储、外设等)–进程间相互独立(内存空间不相交)。在操作系统调度下各自独立地运行,例如多个串行应用程序在同一台计算机运行–进程间可以相互交换信息。例如数据交换、同步等待,消息是这些交换信息的基本单位,消息传递是指这些信息在进程间的相互交换,是实现进程间通信的唯一方式进程包含于通过网络联接的不同处理器的多个进程–进程独立存在,并位于不同的处理器,由各自独立的操作系统调度,享有独立的CPU和内存资源–进程间相互信息交换,可依靠消息传递–最基本的消息传递操作包括发送消息send、接受消息receive、进程同步barrier、归约reduction等线程•将一个进程分解成两个部分:–一部分由其资源特征构成,仍称之为进程–一部分由其执行特征构成,称之为线程•进程可由单个线程来执行•进程也可由多个线程来并行执行•多个线程将共享该进程的所有资源特征线程单进程多线程执行示意图OpenMPOpenMP应用编程接口API是在共享存储体系结构上的一个编程模型包含编译制导(CompilerDirective)、运行库例程(RuntimeLibrary)和环境变量(EnvironmentVariables)支持增量并行化(IncrementalParallelization)OpenMP什么是OpenMP•应用编程接口API(ApplicationProgrammingInterface)•由三个基本API部分(编译指令、运行部分和环境变量)构成•是C/C++和Fortan等的应用编程接口•已经被大多数计算机硬件和软件厂家所标准化OpenMP不包含的性质•不是建立在分布式存储系统上的•不是在所有的环境下都是一样的•不是能保证让多数共享存储器均能有效的利用OpenMPFORKJOINFORKJOIN主线程并行域并行域•基于线程的并行编程模型(ProgrammingModel)•OpenMP使用Fork-Join并行执行模型OpenMPintmain(intargc,char*argv[]){#pragmaompparallelforfor(inti=0;i10;i++){printf(i=%d\n,i);}return0;}消息传递平台MPI•什么是MPI(MessagePassingInterface)–是函数库规范,而不是并行语言;操作如同库函数调用–是一种标准和规范,而非某个对它的具体实现(MPICH等),与编程语言无关–是一种消息传递编程模型,并成为这类编程模型的代表•Whatisthemessage?DATA+ENVELOPE•MPI的目标–较高的通信性能–较好的程序可移植性–强大的功能消息传递平台MPIMPI程序编译与运行–程序编译C:%mpicc-ompiprogmpisrc.cFortran77:%mpif77-ompiprogmpisrc.f–程序运行%mpirun-np4mpiprog•程序执行过程中不能动态改变进程的个数•申请的进程数np与实际处理器个数无关例子#includempi.hintmain(intargc,char**argv){intmyid,numprocs;intnamelen;charprocessor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Get_processor_name(processor_name,&namelen);fprintf(stderr,HelloWorld!Process%dof%don%s\n,myid,numprocs,processor_name);MPI_Finalize();}头文件相关变量声明程序开始程序结束程序体计算与通信MPI基础知识•MPI重要概念•MPI函数一般形式•MPI原始数据类型•MPI程序基本结构•MPI几个基本函数•并行编程模式MPI重要概念•进程组(processgroup)–指MPI程序的全部进程集合的一个有序子集且进程组中每个进程被赋于一个在该组中唯一的序号(rank),用于在该组中标识该进程。序号的取值范围是[0,进程数-1]•通信器(communicator)–理解为一类进程的集合即一个进程组,且在该进程组,进程间可以相互通信–任何MPI通信函数均必须在某个通信器内发生–MPI系统提供省缺的通信器MPI_COMM_WORLD–组内通信器和组间通信器MPI重要概念•进程序号(rank)–MPI程序中的进程由进程组或通信器序号唯一确定,序号相对于进程组或通信器而言(假设np个处理器,标号0…np-1)–同一个进程在不同的进程组或通信器中可以有不同的序号,进程的序号是在进程组或通信器被创建时赋予的–MPI系统提供了一个特殊的进程序号MPI_PROC_NULL,它代表空进程(不存在的进程),与MPI_PROC_NULL间的通信实际上没有任何作用•消息(message)–分为数据(data)和包装(envelope)两个部分–包装由接收进程序号/发送进程序号、消息标号和通信器三部分组成;数据包含用户将要传递的内容MPI函数一般形式C:error=MPI_Xxxxx(parameter,...);MPI_Xxxxx(parameter,...);–整型错误码由函数值返回–除MPI_Wtime()和MPI_Wtick()外,所有MPI的C函数均返回一个整型错误码。成功时返回MPI_SUCCESS,其他错误代码依赖于执行Fortran:CALLMPI_XXXXX(parameter,...,IERROR)–整型错误码由函数的参数返回–除MPI_WTIME()和MPI_WTICK()外为子函数程序(function),Fortran77的所有MPI过程都是Fortran77的子例行程序(subroutine)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_PACKEDMPI几个基本函数MPI_InitMPI_InitializedMPI_Comm_sizeMPI_Comm_rankMPI_FinalizeMPI_AbortMPI_Get_processor_nameMPI_Get_versionMPI_WtimeMPI几个基本函数初始化MPI系统C:intMPI_Init(int*argc,char*argv[])Fortran77:MPI_INIT(IERROR)INTEGERIERROR•通常为第一个调用的MPI函数,除MPI_Initialized外•在C接口中,MPI系统通过argc和argv得到命令行参数,并且会把MPI系统专用的参数删除,留下用户的解释参数MPI几个基本函数获取通信器的进程数和进程在通信器中的标号C:intMPI_Comm_size(MPI_Commcomm,int*size)intMPI_Comm_rank(MPI_Commcomm,int*rank)Fortran77:MPI_COMM_SIZE(COMM,SIZE,IERROR)MPI_COMM_RANK(COMM,RANK,IERROR)INTEGERCOMM,SIZE,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:MPI_Get_processor_name(char*name,int*resultlen)Fortran77:MPI_GET_PROCESSOR_NAME(NAME,RESULTLEN,IERR)•在返回的name中存储所在处理器的名称•resultlen存放返回名字所占字节•应提供参数name不少于MPI_MAX_PRCESSOR_NAME个字节的存储空间MPI几个基本函数获取墙上时间C:doubleMPI_Wtime(void)Fortran77:DOUBLEPRECISIONMPI_WTIME()•返回调用时刻的墙上时间,用浮点数表示秒数•经常用来计算程序运行时间Sample:HelloWorld-CC+MPI#include“mpi.h”#includestdio.h#includemath.hvoidmain(intargc,char*argv[]){intmyid,numprocs,namelen;charprocessor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Get_processor_name(processor_name,&namelen);printf(HelloWorld!Process%dof%don%s\n,myid,numprocs,processor_name);MPI_Finalize();}Sample:HelloWorld-FortranFortran+MPIprogrammaininclude'mpif.h‘character*(MPI_MAX_PROCE
本文标题:消息传递并行编程环境
链接地址:https://www.777doc.com/doc-918342 .html