武汉理工大学硕士研究生课程大作业课程:《并行计算》开课学院:信息工程学院学期:2010-2011年度第1学期成绩并行计算课程报告题目:MPI并行编程环境概要指导老师:阮幼林教授学院:信息工程学院班级:信息研1001班姓名:余华学号:104972102820时间:2011年01-10摘要随着科技的发展,新一代的计算机,无论计算能力和计算速度,都比旧的计算机优越。但人类对高性能计算的需求,也不断提高.除了增强处理器本身的计算能力外,并行处理是一种提高计算能力的有效手段.从前,并行处理要采用昂贵的专用计算机,随着个人计算机及网络成本下降,现已广泛用分布式网络计算机系统进行并行处理。在分布网络计算机系统中,采用消息传递方法实现进程间的通讯。当前流行基于消息传递的并行编程环境是MPI(MessagePassingInterface)。关键词:消息传递;消息传递接口;并行编程;AbstractBecauseofthedevelopmentoftechnology,thenewgenerationofcomputershouldbebetterthantheformeronesinthepowerandspeedofcomputing.Butthepeople'sdemandofhighperformanceofcomputingisincreasingtoo.Inadditiontoenhancingthecomputingpoweroftheprocessor,parallelprocessingisalsoanefficientwaytoenhancethepowerofcomputing.Inthepast,theparallelprocessingcanonlyrunontheexpensiveandspecialcomputers.Asthecostofpersonalcomputersandnetworksdecreased,andnow,itispopulartoprocesstheparallelprocessingonthedistributednetworkcomputingsystems.Inthedistributednetworkcomputingsystems,messagepassingisusedforthecommunicationbetweenprocesses.MPI(MessagePassingInterface)arecommondevelopmentenvironmentsofparallelprocessingbasedonmessagepassing.Keyword:Messagepassing;Messagepassinginterface;Parallelprogramming;1并行计算机系统介绍1.1并行计算机的软件并行计算机的软件紧随并行实体发展,因此,在不同的并行计算机体系结构都有相应的并行计算机软件。并行计算机软件可分并行计算机系统软件和并行计算机应用软件。并行计算机系统软件管理及协调并行计算机运作,并为用户提供计算机的并行接口。因此它对充分发挥并行计算机的性能、令用户能有效及友善地使用算机十分重要。并行系统软件包括并行操作系统及并行编译系统。并行计算机应用软件是解决具体应用问题的程序,不同问题有不同应用软件。并行计算机应用软件广泛应用于科学计算、图形、图象处理等领域。并行程序在运行时,需要如任务的创建和终止、同步及通讯等操作。操作系统和编译系统是分两个层次处理:低层操作,如任务的创建和终止、同步锁、点对点消息传递等由系统提供。高层操作如编程方面,由程序员直接调用共享存储器并行机上的宏任务库、分布存储器并行机上的并行虚拟机器(ParallelVirtualMachine)及消息传递接口(Messagepassinginterface)等并行函数库;或在并行编译器辅助下,由程序员间接调用并行函数库。1.2并行程序设计语言并行计算机系统体系结构、并行计算机软件和并行算法是并行处理的三个要素。发挥并行计算机系统效率关键,在于充分利用程序中的并行部分。并行程序设计语言提供描述并行处理的语言设施。并行程序设计语言可分为向量计算机的向量语言、共享存储器并行计算机及分布式存储器并行计算机的并行语言。分布式存储器的并行系统,每台计算机有独立的地址空间,数据通讯常用消息传递方式。即必须通过发送及接收消息来交换计算机上的数据。合理的数据分布,能减少远程访问,提高运行效率。而其它影响效率的因素有:负载平衡、通讯延迟、通讯模式等。消息传递方式有点对点通讯及集体通讯。这种系统结构使用的并行程序设计语言须具备分布式数据描述及消息传递功能。并行程序设计语言中的实现消息传递机制的方法有:一、在原语言上提供并行函数库如PVM、MPI等;二、扩充原来的语言的关键字及语法,如C++、Fortran-M等;三、建立一种新的语言如Occam。第一种方法的好处是编写并行程序时,只要在原语言上调用并行函数库,不用掌握新语言。1.3并行计算机系统体系结构并行计算机体系结构是具体执行并行处理的实体,可分为向量并行计算机、共享存储器并行计算机及分布式存储器并行计算机。一)向量并行计算机能对向量计算进行高速并行处理。二)共享存储器并行计算机系统特征是多个处理器共享内存。三)分布式存储器并行计算机由多个节点构成,每个节点都有独立的处理器及内存节点之间以网络相连,而节点的数目可以由几个到有数千个不等。2MPI发展及并行编程环境2.1消息传递接口消息传递接口MPI(Message-PassingInterface)是一个基于消息传递的标准并行函数库,提供在并行机系统及网络并行计算机上编写并行程序的环境。来自美国及欧洲各国,共40个组织的80多位专家,其中包括生产并行机的厂家、大学、政府实验室和工厂的科研人员,参与了MPI标准化工作。1992年4月,召开关于消息传递标准的工作会议,会上探讨了标准消息传递的基本和必要的特点,成立一个工作组继续进行标准化工作。同年11月完成MPI的第一个草稿(MPI-1),于1993年3月发表修订版。1994年5月,MPI标准正式发表,于同年6月发表MPI1.1。在这段期间,他们制定了一个可移植的消息传递库定义标准,命名为MPI(MessagePassingInterface),可被C及Fortran77语言调用。MPI给出了并行库的规格说明,提供一套完整的消息传递函数库中例程。MPI引入一些新的概念,如派生数据类型(deriveddatatypes)、上下文(contexts)及通讯子(communicators)。虽然MPI集消息传递模型的优点,但也有欠缺,如并行I/0操作及PVM所提供的动态进程等。1995年的春天举行MPI-2论坛,此时并行计算已有很大的变化。若干旧式系统停产,新系统进入市场。MPI-2的标准化始于1995年4月,并于1997年4月间完成。首先修订94年原文件,更改了容易产生误解的地方及一些函数名称。MPI-2的文件中也包括MPI1.2。MPI1.2加进了讨论MPI-1时忽略的功能,如提取MPI版本号码。MPI-2包括并行I/O,远程储存器操作(或称单边通讯)及动态进程管理。也加进了一些新功能,如外部接口格式、支持C++及Fortran-90、支持多线程(threads)及混合语言编程等。MPI-1的主要功能包括:一、提供大量点对点通讯函数二、为进程组提供大量集体通讯函数三、使用通讯子(communicator)改善通讯的安全性四、进程拓扑(Processtopology)五、使用剖析功能(Profiling)供调试用六、产生派生数据类型处理不相连性数据七、支持C及Fortran语言的消息传递函数八、环境管理与查询函数2.2MPI并行编程环境MPI由一组库函数组成,在Fortran77,Fortran99,C和C++语言中皆可以直接对这些函数进行调用。作为一种消息传递式的并行编程环境,MPI并行程序要求将任务分块,同时启动多个进程并发执行,各进程之间通过调用MPI的库函数实现消息传递。(1)进程创建和执行一个MPI并行程序山若干个并发进程组成,这些进程可以相同也可以不同。MPI只支持静态进程创建,即:每个进程在执行前必须在MPI环境中登记,且它们必须一起启动。通常启动可执行的MPI程序是通过命令行来实现的。启动方法山具体实现确定。例如在MPICH实现中通过下列命令行可同时在独立的机器上启动相同的可执行程序:mpirun-npNprogramname其中N是同时运行的进程的个数,program-name是可执行的MPI程序的程序名。以这种方式执行时,需要首先对可用的机器进行配置,配置文件是$HOME/mpich/util/machines/machines.LINUX。在这个文件中,每一行写上可用的机器名。例如:linux1.comlinux2.comlinux3.comlinux4.comlinux5.comlinux6.com这样就有6台机器可供MPI使用,每台机器执行一个进程。(2)MPI的初始化与结束MPI程序的初始化工作是通过调用MPI_Init()函数完成的,该函数是MPI程序的第一个函数调用,也是MPI程序的第一条可执行语句。NIPI_Finalize()函数是MPI程序的最后一个调用,它结束MPI程序的运行,是MPI程序的最后一条执行语句,如果没有该函数调用,程序的运行结果是不可预知的。命令行的参数将传递给MPI_Init(),以允许MPI进行设置要发生的动作,即:main(intargc,char*argv[]){MPI_Init(&argc,&argv);……MPI_Finalize();}初始化后,MPI自动创建一个通信域称为MPI_COMM_WORLD,由它定义通信操作的作用域。并为域内每个进程分配一个独立的序号(进程标志),如果有n个进程,则其标识为0~n~1。用户可以使用MPI初始化创建的通信域,也可以按照MPI提供的函数调用方式,在己有的通信域上生成新的通信域。(3)MPI消息传递函数MPI提供了点对点通信和组通信的消息传递函数,两类函数调用其通信方式上都是用了通信域,用这种方法,可以使库的通信域与用户程序分开。①点对点通信通信在两个进程之间进行,即:将消息由源进程传递到目的进程。通常用MPI的发送和接收函数调用来完成。有4种函数调用模式,分别是:标准模式、缓存模式、同步模式和就绪模式。其中最常用的是标准模式,该模式下发送调用一般格式如下:MPI_Send(void*buf,intcount,MPI_Datatypedatatype,intdest,inttag,MPI_Commcomm)buf:发送缓冲区的起始地址(可选类型);count:将发送的数据的个数(非负整数);datatype:发送数据的数据类型(句柄);dest:目的进程标识号(整型);tag:消息标志(整型);comm:通信域(句柄)。②组通信通信的范围涉及组内所有进程。MPI提供了一个广播函数和一组汇集和散播函数调用,它们是:MPI_Bcast()从根进程向所有进程广播消息;MPI_Gather()根进程汇集所有进程发送的消息;MPI_Scatter()根进程散播消息给所有进程;MPI_Alltoall()所有进程向所有进程发送消息;MPI_Reduce()将所有进程发送缓冲区中的数据按给定操作组合,结果存入根进程的接受缓冲区;MPI_Reduce_scatter()在前个功能基础上再散播给所有进程;MPI_Scan()每个进程归约其及前面进程发送缓冲区中的数据。2.3MPI基本并行程序设计MPI为消息传递和相关操作提供了功能强大而又丰富的库函数,其内有上百个甚至几百个函数调用接口,但最常用的只是由6个函数构成的MPI子集,有了它们,就可以实现所有的消息传递并行程序功能。它们是C的调用格式描述:(1)MPI初始化函数MPI_Init(int*argc,char***arg