您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > 高性能计算-第二次课
1Chapter3基于MPI分布式内存编程AnIntroductiontoParallelProgrammingPeterPachecoHigh-performanceComputing&ApplicationsHigh-performanceComputing&Applications2Roadmap编写第一个MPI程序.常见的MPI函数.用MPI来实现梯形积分法.集合通信.MPI的派生数据类型.MPI程序的性能评估.并行排序算法.MPI程序的安全性.#ChapterSubtitleHigh-performanceComputing&Applications3分布式内存系统High-performanceComputing&Applications4消息传递并行程序设计MPI消息传递并行程序设计用户必须通过显式地发送和接收消息来实现处理机间的数据交换每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现适用于大规模并行处理机(MPP)和机群(Cluster)High-performanceComputing&Applications5并行计算粒度大,适合大规模可扩展并行算法消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法High-performanceComputing&Applications消息传递并行程序设计MPI6什么是MPI?MassagePassingInterface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C。一种新的库描述,不是一种语言;共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用;是一种标准或规范,而不是特指某一个对它的具体实现;MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准。High-performanceComputing&Applications7为什么要使用MPI?高可移植性MPI已在PC机、MSWindows以及所有主要的Unix工作站上和所有主流的并行机上得到实现使用MPI作消息传递的C或Fortran并行程序可不加改变地在上述平台实现High-performanceComputing&Applications8MPI的发展过程发展的两个阶段1994年5月完成1.0版支持C和Fortran77制定大部分并行功能1997年4月完成2.0版动态进程并行I/O支持Fortran90和C++High-performanceComputing&Applications9常用的MPI版本MPICH是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性当前最新版本有MPICH3.2LAMMPI美国Indiana大学OpenSystems实验室实现更多的商业版本MPIHP-MPI,MS-MPI,……所有的版本遵循MPI标准,MPI程序可以不加修改的运行High-performanceComputing&Applications10HelloWorld!(aclassic)High-performanceComputing&Applications11从简单入手下面我们首先分别以C语言的形式给出一个最简单的MPI并行程序Hello该程序在终端打印出HelloWorld!字样.High-performanceComputing&Applications12识别MPI进程在并行编程中,常见的是将进程按照非负整数来进行标注.p个进程被编号为0,1,2,..p-1High-performanceComputing&Applications1314编译,生成hello的可执行代码mpicc-g-Wall-ompi_hellompi_hello.cC语言编译器的包装脚本打印警告信息源文件创建编译后的输出文件(默认为a.out)加入调试信息High-performanceComputing&Applications15Executionmpiexec-nnumberofprocessesexecutablempiexec-n1./mpi_hellompiexec-n4./mpi_hello用1个进程运行程序用4个进程运行程序High-performanceComputing&Applications16Executionmpiexec-n1./mpi_hellompiexec-n4./mpi_helloGreetingsfromprocess0of1!Greetingsfromprocess0of4!Greetingsfromprocess1of4!Greetingsfromprocess2of4!Greetingsfromprocess3of4!High-performanceComputing&Applications173.1.2MPI程序C语言.包含了main函数.标准头文件stdio.h,string.h,etc.包含mpi.h头文件.所有MPI定义的标识符都由字符串“MPI_”开始.下划线后的第一字母大写。表示函数名和MPI定义的类型避免混淆High-performanceComputing&Applications18MPI程序的框架结构头文件包含MPI库相关变量的声明定义与通信有关的变量程序开始调用MPI初始化函数程序结束调用MPI结束函数程序体计算与通信调用MPI其它函数High-performanceComputing&Applications19第三部分第五部分第一部分用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();/*结束*/}第二部分第四部分High-performanceComputing&Applications20执行结果High-performanceComputing&Applications21MPI基本调用MPI为程序员提供一个并行环境库,程序员通过调用MPI的库程序来达到程序员所要达到的并行目的,可以只使用其中的6个最基本的函数就能编写一个完整的MPI程序去求解很多问题。这6个基本函数,包括启动和结束MPI环境,识别进程以及发送和接收消息:High-performanceComputing&Applications22从理论上说,MPI所有的通信功能可以用它的6个基本的调用来实现:MPI_Init:启动MPI环境MPI_Comm_size:确定进程数MPI_Comm_rank:确定自己的进程标识符MPI_Send:发送一条消息MPI_Recv:接收一条消息MPI_Finalize:结束MPI环境High-performanceComputing&Applications23(1)MPI初始化:通过MPI_Init函数进入MPI环境并完成所有的初始化工作,参数可直接设置为NULL。intMPI_Init(int*argc,char***argv)/*返回错误编码*/(2)MPI结束:通过MPI_Finalize函数从MPI环境中退出intMPI_Finalize(void)High-performanceComputing&Applications24(3)获取进程的编号:调用MPI_Comm_rank函数获得当前进程在指定通信域中的编号,将自身与其他程序区分。intMPI_Comm_rank(MPI_Commcomm,int*rank)*通信子:一组可以互相发送消息的进程集合。(4)获取指定通信域的进程数:调用MPI_Comm_size函数获取指定通信域的进程个数,确定自身完成任务比例。intMPI_Comm_size(MPI_Commcomm,int*size)High-performanceComputing&Applications25(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)High-performanceComputing&Applications26最简单的hello.c#includestdio.h#includempi.h“main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(“HelloWorld!\n);MPI_Finalize();}High-performanceComputing&Applications27MPI初始化-MPI_INITintMPI_Init(int*argc,char**argv)MPI_INIT(IERROR)MPI_INIT是MPI程序的第一个调用,完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句启动MPI环境,标志并行代码的开始并行代码之前,第一个mpi函数(除MPI_Initialize外)要求main必须带参数运行。否则出错High-performanceComputing&Applications28MPI结束-MPI_FINALIZEintMPI_Finalize(void)MPI_Finalize(IERROR)MPI_INIT是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。标志并行代码的结束,结束除主进程外其它进程之后串行代码仍可在主进程(rank=0)上运行(如果必须)High-performanceComputing&Applications29运行MPI程序hello.c编译:mpicc-ohellohello.c运行:./hello[0]Abortingprogram!Couldnotcreatep4procgroup.Possiblemissingfileorprogramstartedwithoutmpirun.运行:mpiexec-np4helloHelloWorld!HelloWorld!HelloWorld!HelloWorld!High-performanceComputing&Applications30Hello是如何被执行的?SPMD:SingleProgramMultipleData(MIMD)#includestdio.h#incl
本文标题:高性能计算-第二次课
链接地址:https://www.777doc.com/doc-3372961 .html