《并行程序设计导论》-第三章PPT

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

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

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

资源描述

1Copyright©2010,ElsevierInc.AllrightsReservedChapter3用MPI进行分布式内存编程AnIntroductiontoParallelProgrammingPeterPacheco2Copyright©2010,ElsevierInc.AllrightsReservedRoadmap编写第一个MPI程序.常见的MPI函数.用MPI来实现梯形积分法.集合通信.MPI的派生数据类型.MPI程序的性能评估.并行排序算法.MPI程序的安全性.#ChapterSubtitle3分布式内存系统Copyright©2010,ElsevierInc.AllrightsReserved4共享内存系统Copyright©2010,ElsevierInc.AllrightsReserved5进程进程是一个程序,同时包含它的执行环境(内存、寄存器、程序计数器等),是操作系统中独立存在的可执行的基本程序单位。通俗理解:串行应用程序编译形成的可执行代码,分为“指令”和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。6正在微机上运行的进程7单机内的多个进程多个进程可以同时存在于单机内同一操作系统:由操作系统负责调度分时共享处理机资源(CPU、内存、存储、外设等)。进程间相互独立(内存空间不相交):在操作系统调度下各自独立地运行,例如多个串行应用程序在同一台计算机中运行。进程1内存进程28最基本的消息传递操作:发送消息(send)、接受消息(receive)、进程同步(barrier)、规约(reduction)。消息传递的实现:共享内存或信号量,用户不必关心。进程间可以相互交换信息:例如数据交换、同步等待,消息是这些交换信息的基本单位,消息传递是指这些信息在进程间的相互交换,是实现进程间通信的唯一方式。9同时运行于单机上的多个进程10进程1内存进程2并行程序的单机运行方式进程3进程411消息传递并行程序设计MPICopyright©2010,ElsevierInc.AllrightsReserved消息传递并行程序设计用户必须通过显式地发送和接收消息来实现处理机间的数据交换每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现适用于大规模并行处理机(MPP)和机群(Cluster)12Copyright©2010,ElsevierInc.AllrightsReserved并行计算粒度大,适合大规模可扩展并行算法消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法13什么是MPI?Copyright©2010,ElsevierInc.AllrightsReservedMassagePassingInterface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C。一种新的库描述,不是一种语言共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用是一种标准或规范,而不是特指某一个对它的具体实现MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准14为什么要使用MPI?Copyright©2010,ElsevierInc.AllrightsReserved高可移植性MPI已在PC机、MSWindows以及所有主要的Unix工作站上和所有主流的并行机上得到实现使用MPI作消息传递的C或Fortran并行程序可不加改变地在上述平台实现15MPI的发展过程Copyright©2010,ElsevierInc.AllrightsReserved发展的两个阶段1994年5月完成1.0版支持C和Fortran77制定大部分并行功能1997年4月完成2.0版动态进程并行I/O支持Fortran90和C++16常用的MPI版本Copyright©2010,ElsevierInc.AllrightsReservedMPICH是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性当前最新版本有MPICH3.2LAMMPI美国Indiana大学OpenSystems实验室实现更多的商业版本MPIHP-MPI,MS-MPI,……所有的版本遵循MPI标准,MPI程序可以不加修改的运行17HelloWorld!Copyright©2010,ElsevierInc.AllrightsReserved(aclassic)18从简单入手Copyright©2010,ElsevierInc.AllrightsReserved下面我们首先分别以C语言的形式给出一个最简单的MPI并行程序Hello该程序在终端打印出HelloWorld!字样.19识别MPI进程在并行编程中,常见的是将进程按照非负整数来进行标注.p个进程被编号为0,1,2,..p-1Copyright©2010,ElsevierInc.AllrightsReserved20第一个MPI程序Copyright©2010,ElsevierInc.AllrightsReserved21编译,生成hello的可执行代码Copyright©2010,ElsevierInc.AllrightsReservedmpicc-g-Wall-ompi_hellompi_hello.cC语言编译器的包装脚本打印警告信息源文件创建编译后的输出文件(默认为a.out)加入调试信息22执行Copyright©2010,ElsevierInc.AllrightsReservedmpiexec-nnumberofprocessesexecutablempiexec-n1./mpi_hellompiexec-n4./mpi_hello用1个进程运行程序用4个进程运行程序23ExecutionCopyright©2010,ElsevierInc.AllrightsReservedmpiexec-n1./mpi_hellompiexec-n4./mpi_helloGreetingsfromprocess0of1!Greetingsfromprocess0of4!Greetingsfromprocess1of4!Greetingsfromprocess2of4!Greetingsfromprocess3of4!243.1.2MPI程序C语言.包含了main函数.标准头文件stdio.h,string.h,etc.包含mpi.h头文件.所有MPI定义的标识符都由字符串“MPI_”开始.下划线后的第一字母大写。表示函数名和MPI定义的类型避免混淆Copyright©2010,ElsevierInc.AllrightsReserved25MPI程序的框架结构头文件包含MPI库相关变量的声明定义与通信有关的变量程序开始调用MPI初始化函数程序结束调用MPI结束函数程序体计算与通信调用MPI其它函数26第三部分第五部分第一部分用C+MPI实现helloworld!#includempi.h#includestdio.h#includemath.hvoidmain(intargc,char*argv[]){intmyid,numprocsnamelen;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();/*结束*/}第二部分第四部分27执行结果28MPI基本调用MPI为程序员提供一个并行环境库,程序员通过调用MPI的库程序来达到程序员所要达到的并行目的,可以只使用其中的6个最基本的函数就能编写一个完整的MPI程序去求解很多问题。这6个基本函数,包括启动和结束MPI环境,识别进程以及发送和接收消息:29从理论上说,MPI所有的通信功能可以用它的6个基本的调用来实现:MPI_INIT:启动MPI环境MPI_COMM_SIZE:确定进程数MPI_COMM_RANK:确定自己的进程标识符MPI_SEND:发送一条消息MPI_RECV:接收一条消息MPI_FINALIZE:结束MPI环境30(1)MPI初始化:通过MPI_Init函数进入MPI环境并完成所有的初始化工作。intMPI_Init(int*argc,char***argv)(2)MPI结束:通过MPI_Finalize函数从MPI环境中退出。intMPI_Finalize(void)31(3)获取进程的编号:调用MPI_Comm_rank函数获得当前进程在指定通信域中的编号,将自身与其他程序区分。intMPI_Comm_rank(MPI_Commcomm,int*rank)(4)获取指定通信域的进程数:调用MPI_Comm_size函数获取指定通信域的进程个数,确定自身完成任务比例。intMPI_Comm_size(MPI_Commcomm,int*size)32(5)消息发送:MPI_Send函数用于发送一个消息到目标进程。intMPI_Send(void*buf,intcount,MPI_Datatypedataytpe,intdest,inttag,MPI_Commcomm)(6)消息接受:MPI_Recv函数用于从指定进程接收一个消息intMPI_Recv(void*buf,intcount,MPI_Datatypedatatyepe,intsource,inttag,MPI_Commcomm,MPI_Status*status)33最简单的hello.cCopyright©2010,ElsevierInc.AllrightsReserved#includestdio.h#includempi.h“main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(“HelloWorld!\n);MPI_Finalize();}34MPI初始化-MPI_INITintMPI_Init(int*argc,char**argv)MPI_INIT(IERROR)MPI_INIT是MPI程序的第一个调用,完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句启动MPI环境,标志并行代码的开始并行代码之前,第一个mpi函数(除MPI_Initialize外)要求main必须带参数运行。否则出错Copyright©2010,ElsevierInc.AllrightsReserved35MPI结束-MPI_FINALIZEintMPI_Finalize(void)MPI_Finalize(IERROR)MPI_INIT是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。标志并行代码的结束,结束除主进程外其它进程之后串行代码仍可在主进程(rank=0)上运行(如果必须)Copyright©2010,ElsevierInc.AllrightsReserved36运行MPI程序hello.c编译:mpicc-

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

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

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

×
保存成功