22_MPI并行程序开发-基本

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

MPI分布内存并行程序开发联想集团高性能服务器事业部2003/3第一章并行计算概述为什麽要采用并行计算?串行程序速度提升缓慢可以加快速度——更短的时间内解决相同的问题;相同的时间内解决更多更复杂的问题可以加大规模——计算更大规模的问题并行计算设计的分类共享内存–ccNUMA;SMP分布式内存–MPP;Cluster三种计算模型并行化分解方法任务分解–多任务并发执行功能分解–分解被执行的计算区域分解–分解被执行的数据分布内存并行方式任务并行–不同参数的大量工况计算区域分解并行–大规模多节点分块并行计算第二章MPI简介MPI(MessagePassingInterface)是1994年5月发布的一种消息传递接口。它实际上是一个消息传递函数库的标准说明,以语言独立的形式来定义这个接口库,并提供了与C和Fortran语言的绑定.。MPI的历史MPI初稿:美国并行计算中心工作会议(92年4月)MPI-1公布:第一届MPI大会(93年1月);MPI标准正式发布:1994年5月;MPI-2发布:MPI论坛(97年)。MPICH:最重要的MPI实现(),与MPI-1规范同步发展的版本,支持部分MPI-2的特征如动态生成进程等。CHIMP:EPCC(EdinburghParallelComputingCenter)开发。下载。LAM(LocalAreaMulticomputer):OhioStateUniversity开发。下载。MPI的实现第三章MPI编程MPI为程序员提供一个并行环境库,程序员通过调用MPI的库程序来达到程序员所要达到的并行目的,可以只使用其中的6个最基本的函数就能编写一个完整的MPI程序去求解很多问题。这6个基本函数,包括启动和结束MPI环境,识别进程以及发送和接收消息:MPI_INIT:启动MPI环境MPI_COMM_SIZE:确定进程数MPI_COMM_RANK:确定自己的进程标识符MPI_SEND:发送一条消息MPI_RECV:接收一条消息MPI_FINALIZE:结束MPI环境程序1、简单例子programmaininclude'mpif.h'character*(MPI_MAX_PROCESSOR_NAME)processor_nameintegermyid,numprocs,namelen,rc,ierrcallMPI_INIT(ierr)callMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)callMPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)callMPI_GET_PROCESSOR_NAME(processor_name,namelen,ierr)write(*,10)myid,numprocs,processor_name10FORMAT('HelloWorld!Process',I2,'of',I1,'on',20A)callMPI_FINALIZE(rc)end程序1、简单例子#include“mpi.h”main(intargc,char**argv){intnumprocs,myrank,i,j,k;MPI_Statusstatus;charmsg[20];MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Comm_rank(MPI_COMM_WORLD,&myrank);if(myrank==0){strcpy(msg,”HelloWorld”);MPI_Send(msg,strlen(msg)+1,MPI_CHAR,1,99,MPI_COMM_WORLD);}elseif(myrank==1){MPI_Recv(msg,20,MPI_CHAR,0,99,MPI_COMM_WORLD,&status);printf(“Receivemessage=%s\n”,msg);}MPI_Finalize();}MPI程序的一般结构包含MPI头文件初始化MPI环境消息交换处理及计算等退出MPI环境头文件MPI程序要求:所有包含MPI调用的程序文件头应加入:C包含文件Fortran包含文件#include“mpi.h”Include‘mpif.h’编译,执行:mpicc-ohellohello.c:生成执行文件hellompirun-npnhello:加载n个进程运行,0号进程发送,1号进程接受并打印字符串通信因子和组MPI通过指定通信因子和组来对进程进行一种逻辑上的划分,通讯因子定义了进程组内或组间通讯的上下文(具体就是指明通讯链路的数据结构指针)。MPI_COMM_WORLD通信因子是在MPI环境初始化过程中创建进程号(rank)在一个通信因子中,每个进程都有一个唯一的整数标识符,称作“进程ID”,进程号是从0开始的连续整数。if(rank==0){第0进程运行的程序段}elseif(rank==1){第1进程运行的程序段}MPI消息MPI消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容。数据:起始地址,数据个数,数据类型信封:源/目,标识,通信域MPI的基本函数–MPI_Init–MPI_Comm_size–MPI_Comm_rank–MPI_Send–MPI_Recv–MPI_FinalizeMPI_Init()MPI的初始化例行函数,用于初始化MPI运行环境。必须调用;首先调用;调用一次。MPI_Init(*argc,*argv)。每个进程都有一个参数表。MPI_Comm_size()该函数返回与该组通信因子相关的进程数,显然这里的通讯因子必须是组内通讯因子。MPI_Comm_size(comm,*size)MPI_Comm_rank()该函数返回该进程在指定通信因子中的进程号(0~进程数-1),一个进程在不同通信因子中的进程号可能不同:MPI_Comm_rank(comm,*rank)MPI_Send()该函数将发送缓冲区中的count个datatype数据类型的数据发送到目的进程MPI_Send(buf,count,datatype,dest,tag,comm)MPI_Recv()该函数从指定的进程source接收消息,并且该消息的数据类型和消息标识和本接收进程指定的数据类型和消息标识相一致,收到的消息所包含的数据元素的个数最多不能超过count.MPI_Recv(buf,count,datatype,source,comm,status)MPI_Finalize()结束MPI执行环境。该函数一旦被应用程序调用时,就不能调用MPI的其它例行函数(包括MPI_Init),用户必须保证在进程调用MPI_Finalize之前把与完成进程有关的所有通信结束。MPI_Finalize()参数说明–缓冲区(buffer)–数据个数(count)–数据类型(type)–目的地(dest)–源(source)–标识符(tag)–通信因子(comm)–状态(status)缓冲区(buffer)指应用程序定义地用于发送或接收数据的消息缓冲区。数据个数(count)指发送或接收指定数据类型的个数。数据类型的长度*数据个数的值为用户实际传递的消息长度。数据类型(type)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_Unpack续上页目的地(dest)发送进程指定的接收该消息的目的进程,也就是接收进程的进程号(注意组间通讯的情况)。源(source)接收进程指定的发送该消息的源进程,也就是发送进程的进程号。如果该值为MPI_ANY_SOURCE表示接收任意源进程发来的消息。标识符(tag)由程序员指定地为标识一个消息的唯一非负整数值(0-32767),发送操作和接收操作的标识符一定要匹配,但对于接收操作来说,如果tag指定为MPI_ANY_TAG则可与任何发送操作的tag相匹配。通信因子(comm)包含源与目的进程的一组上下文相关的进程集合,除非用户自己定义(创建)了新的通信因子,否则一般使用系统预先定义的全局通信因子MPI_COMM_WORLD。状态(status)对于接收操作,包含了接收消息的源进程(source)和消息的标识符(tag)。在FORTRAN程序中,这个参数是包含MPI_STATUS_SIZE个整数的数组,status(MPI_SOURCE)、status(MPI_TAG)和status(MPI_ERROR)分别表示数据的进程标识、发送数据使用tag标识和接收操作返回的错误代码。相当于一种在接受方对消息的监测机制,并且以其为依据对消息作出不同的处理(当用通配符接受消息时)。程序1、简单例子#include“mpi.h”main(intargc,char**argv){intnumprocs,myrank,i,j,k;MPI_Statusstatus;charmsg[20];MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Comm_rank(MPI_COMM_WORLD,&myrank);if(myrank==0){strcpy(msg,”HelloWorld”);MPI_Send(msg,strlen(msg)+1,MPI_CHAR,1,99,MPI_COMM_WORLD);}elseif(myrank==1){MPI_Recv(msg,20,MPI_CHAR,0,99,MPI_COMM_WORLD,&status);printf(“Receivemessage=%s\n”,msg);}MPI_Finalize();}程序2、π的计算#include“mpi.h”#includestdio.h#includemath.hdoublef(doublex);/*定义函数f(x)*/{return(4.0/(1.0+x*x));}intmain(intargc,char*argv[]){intdone=0,n,myid,numprocs,i;doublePI25DT=3.141592653589793238462643;doublemypi,pi,h,sum,x;do

1 / 44
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功