MPI并行编程

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

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

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

资源描述

MPI并行编程大纲•MPI并行编程简介•Linux下MPI并行编程环境的搭建•MPI并行程序设计•实例分析:矩阵乘法1.1什么是并行计算进程1发送信息进程2接收信息传统的串行计算,分为“指令”和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。并行计算将进程相对独立的分配于不同的节点上,由各自独立的操作系统调度,享有独立的CPU和内存资源(内存可以共享);进程间相互信息交换通过消息传递;进程1进程21.2并行计算在电力行业的研究和应用•中国电科院发明专利“电力系统潮流分网并行计算方法”获得中国专利金奖(发明人:周孝信、吴中习、郭剑、李亚楼、田芳)2010.11•《大规模电网并行潮流算法》2008•《电力系统状态估计的分布式并行处理》2003•《电力系统最优潮流的分布式并行算法》2003•《电网在线安全分析的并行处理方法》1996•《基于GPU的电力系统并行潮流计算的实现》2010•《基于MPI和P.Q分解法的电力系统潮流并行算法的研究》2005•《基于并行计算的电力系统风险评估》2009•《基于并行协调算法的电力系统状态估计》2007•《基于改进并行遗传算法的电网状态估计》2006•《应用网格平台的潮流计算并行算法》2009•《基于MPI电力系统潮流P—Q分解法的并行算法》2008•《2008电网控制中心新技术综述》20091.3并行编程标准•多线程库标准––Win32API.––POSIXthreads.•编译制导标准––OpenMP–可移植共享存储并行编程标准.•消息传递库标准––MPI––PVM1.4MassagePassingInterface(MPI)•MPI是由MPI委员会(MPIForum)在1992年到1994年举行的一系列会议上逐渐产生的一个消息传递标准()。•发展•MPI1.1:1995»MPICH:是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性.•MPI1.2(1997)•….•MPI2.2(2009-09)MPI是一个库,而不是一门语言•这个标准支持C语言和FORTRAN语言•MPI库可以被FORTRAN77/C/Fortran90/C++调用•它遵守所有对库函数/过程的调用规则,和一般的函数/过程没有什么区别MPI是一种标准或规范,而不是具体实现实现:Mpich、OpenMPI、Chimp、Lam例如:MPI_Init(int*argc,char***argv)的实现•MPICH的实现•intMPI_Init(int*argc,char***argv)•{•staticconstcharFCNAME[]=MPI_Init;•intmpi_errno=MPI_SUCCESS;•intrc;。。。。。。•}•OpenMPI的实现•intMPI_Init(int*argc,char***argv)•{interr;intprovided;char*env;intrequired=MPI_THREAD_SINGLE;。。。。。。•}MPI是一种消息传递编程模型•节点间基于消息进行通讯2.1MPICH的实验环境实验环境:RedHat9.0+Vmware6.0+MPICH2-1.0Fedora14+DellBlade*1(主节点)+DellPC*2(从节点)+MPICH2-1.2.1p12.2MPICH的搭建步骤搭建步骤1-挂载NFS文件系统实现分节点内容与主节点内容的同步更新和自动目录对应2-配置SSH公钥认证实现MPI节点间用户的无密码访问各节点间进行消息传递3-安装MPICH至NFS目录4-修改各种配置文件5-试运行example文件夹中的例子3.1基于MPI的HelloWorld(C)#includestdio.h#includempi.h“main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}3.2MPI程序的的编译与运行•mpif77hello.f或mpicchello.c–默认生成a.out的可执行代码.(mpicchello.c)•mpif77–ohellohello.f或•mpicc–ohellohello.c–生成hello的可执行代码.•mpirun–np4a.out•mpirun–np4hello–4指定np的实参,表示进程数,由用户指定.–a.out/hello要运行的MPI并行程序.2020年1月MPI并行程序设计13/217%小写o%np:TheNumberofProcess.3.3运行MPI程序[dair@node01~]$mpicc-ohellohello.c[dair@node01~]$./hello()[0]Abortingprogram!Couldnotcreatep4procgroup.Possiblemissingfileorprogramstartedwithoutmpirun.[dair@node01~]$mpirun-np4hello()HelloWorld!HelloWorld!HelloWorld!HelloWorld![dair@node01~]$计算机打印字符我们输入的命令3.4HelloWorld是如何被执行的?•SPMD:SingleProgramMultipleData(SPMD)::::2020年1月MPI并行程序设计15/217#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程序的执行过程3.5进一步的MPI并行程序•在写MPI程序时,我们常需要知道以下两个问题的答案:任务由多少个进程来进行并行计算?(多少个节目)我是哪一个进程?(节目名程)好比是晚会导演安排节目次序,每个节目拿到的是相同的节目单。对号入座3.5.1MPI相关接口•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);3.5.2更新的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();}运行结果•[dair@node01~]$mpicc–ohello1hello1.c•[dair@node01~]$mpirun-np4hello1Iam0of4Iam1of4Iam2of4Iam3of4•[dair@node01~]$计算机打印字符我们输入的命令3.6.1MPI消息•消息:指在进程间进行的一次数据交换。•一个消息由源地址、数据个数、数据类型、目标地址、消息标识和通信体构成。•消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容。•MPI_Send(buf,count,datatype,dest,tag,comm)消息数据消息信封3.6.2消息传递过程3.6.3MPI点对点通信函数MPI_Send(void*buf,intcount,MPI_Datatypedatatype,intdest,inttag,MPI_Commcomm)被发送消息的地址被发送数据项的个数消息数据的类型目标进程的序号消息标志通信体3.6.3MPI点对点通信函数•MPI_Recv(void*buf,intcount,MPI_Datatypedatatype,intsource,inttag,MPI_Commcomm,MPI_Status*status)被接收消息的地址被接收数据项的个数消息数据的类型源进程的序号消息标志通信体返回的通信状态3.6.4加入消息传递的HelloWorld(c)#includestdio.h#includempi.h“main(intargc,char*argv[]){intnumprocs;/*进程数,该变量为各处理器中的同名变量,存储是分布的*/intmyid;/*我的进程ID,存储也是分布的*/MPI_Statusstatus;/*消息接收状态变量,存储也是分布的*/charmessage[100];/*消息buffer,存储也是分布的*//*初始化MPI*/MPI_Init(&argc,&argv);/*该函数被各进程各调用一次,得到自己的进程rank值*/MPI_Comm_rank(MPI_COMM_WORLD,&myid);/*该函数被各进程各调用一次,得到进程数*/MPI_Comm_size(MPI_COMM_WORLD,&numprocs);3.6.4加入消息传递的HelloWorld(c)(续)if(myid!=0){/*建立消息*/sprintf(message,“HelloWorldfromprocess%d!,myid);/*发送长度取strlen(message)+1,使\0也一同发送出去*/MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);}else{/*my_rank==0*/for(source=1;sourcenumprocs;source++){MPI_Recv(message,100,MPI_CHAR,source,99,MPI_COMM_WORLD,&status);printf(“%s\n,message);}}/*关闭MPI,标志并行代码段的结束*/MPI_Finalize();}/*Endmain*/进程0rank=0..Send()...进程1rank=1进程2rank=2进程3rank=3..Send().....Send().....Recv()...问题:进程1、2、3谁先向进程0发送消息??运行结果•[dair@no

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

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

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

×
保存成功