第五章 消息传递接口MPI
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第5章消息传递接口MPI
MPI(消息传递接口)是用于分布式存储器并行计算机的标准编程环境。MPI的核心构造是消息传递:一个进程将信息打包成消息,并将该消息发送给其他进程。但是,MPI包含比简单的消息传递更多的内容。MPI包含一些例程,这些例程可以同步进程、求分布在进程集中的数值的总和、在同一个进程集中分配数据,以及实现更多的功能。
在20世纪90年代早期人们创建了MPI,以提供一种能够运行在集群、MPP、甚至是共享存储器机器中的通用消息传递环境。MPI以一种库的形式发布,官方的规范定义了对C 和Fortran的绑定(对其他语言的绑定也已经被定义)。当今MPI程序员主要使用MPI版本1.1(1995年发行)。在1997年发行了一个增强版本的规范,MPI 2.0,它具有并行I/O、动态进程管理、单路通信和其他高级功能。遗憾的是,由于它对原有的标准增加了复杂的内容,使得到目前为止,仅有少量的MPI实现支持MPI 2.0。因为这个原因,我们将在本章中集中介绍MPI1.1。
5.1 MPI编程的基本概念
5.1.1什么是MPI
对MPI的定义是多种多样的,但不外乎下面三个方面,它们限定了MPI的内涵和外延。
1 MPI是一个库,而不是一门语言。
许多人认为MPI就是一种并行语言,这是不准确的。但是按照并行语言的分类,可以把FORTRAN+MPI或C+MPI,看作是一种在原来串行语言基础之上扩展后得到的并行语言。MPI库可以被FORTRAN77/C/Fortran90/C++调用,从语法上说,它遵守所有对库函数/过程的调用规则,和一般的函数/过程没有什么区别。
2 MPI是一种标准或规范的代表,而不特指某一个对它的具体实现。
迄今为止,所有的并行计算机制造商都提供对MPI的支持,可以在网上免费得到MPI 在不同并行计算机上的实现,一个正确的MPI程序,可以不加修改地在所有的并行机上运行。
3 MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准。MPI 虽然很庞大,但是它的最终目的是服务于进程间通信这一目标的。
关于什么是MPI的问题设计到多个不同的方面。当我们提到MPI时,不同的上下文中会有不同的含义,它可以是一种编程模型,也可以是一种标准,当然也可以指一类库。只要全面把握了MPI的概念,这些区别是不难理解的。
5.1.2 MPI的三个主要目的
1 较高的通信性能;
2 较好的程序可移植性;
3 强大的功能。
MPI为自己制定了一个雄心勃勃的目标,总结概括起来,它包括几个在实际使用中都十分重要但有时又是相互矛盾的三个方面,具体地说,包括以下几个方面:
提供应用程序编程接口。
提高通信效率。措施包括避免存储器到存储器的多次重复拷贝,允许计算和通信的重叠等。
可在异构环境下提供实现。
提供的接口可以方便 C 语言和Fortran 77的调用。
提供可靠的通信接口。即用户不必处理通信失败。
定义的接口和现在已有接口(如PVM,NX,Express,p4等)差别不能太大,但是允许扩展以提供更大的灵活性。
定义的接口能在基本的通信和系统软件无重大改变时,在许多并行计算机生产商的平台上实现。接口的语义是独立于语言的。
接口设计应是线程安全的。
MPI提供了一种与语言和平台无关,可以被广泛使用的编写消息传递程序的标准,用它来编写消息传递程序,不仅实用、可移植、高效和灵活,而且和当前已有的实现没有太大的变化。
5.1.3 MPI的语言绑定与实现
在MPI-1中,明确提出了MPI和FORTRAN 77与C语言的绑定,并且给出了通用接口和针对FORTRAN 77与C的专用接口说明,MPI-1的成功说明MPI选择的语言绑定策略是正确和可行的。
Fortran90是FORTRAN的扩充,它在表达数组运算方面有独特的优势,还增加了模块等现代语言的方便开发与使用的各种特征,它目前面临的一个问题是Fortran90编译器远不如FORTRAN 77编译器那样随处可见,但提供Fortran90编译器的厂商正在逐步增多。C++作为面向对象的高级语言,随着编译器效率和处理器速度的提高,它可以取得接近于C的代码效率,面向对象的编程思想已经被广为接受,因此在MPI-2中,除了和原来的FORTRAN 77和C语言实现绑定之外,进一步与Fortran90和C++结合起来,提供了四种不同的接口,为编程者提供了更多选择的余地。但是MPI-2目前还没有完整的实现版本。下面列出了一些主要的MPI免费实现。
表5.1 MPI的一些实现
取得。更为重要的是,MPICH是一个与MPI-1规范同步发展的版本,每当MPI推出新的版本,就会有相应的MPICH的实现版本,目前MPICH的最新版本是MPICH-1.2.1,它支持部分的MPI-2的特征。Argonne and MSU(阿尔贡)国家试验室和MSU(密西根州立大学)对MPICH作出了重要的贡献。在本书中,未特别说明,均指在基于Linux集群的MPICH 实现。
CHIMP是Edinburgh(爱丁堡、英国苏格兰首府)开发的另一个免费MPI实现,是在EPCC(Edinburgh Parallel Computing Centre)的支持下进行的,从ftp:///pub/packages/chimp/release/可以免费下载该软件,CHIMP的开发从1991年到1994年,主要开发人员有Alasdair Bruce, James (Hamish) Mills,和Gordon Smith。
LAM (Local Area Multicomputer)也是免费的MPI实现,由Ohio State University美国俄亥俄州国立大学开发,它目前的最新版本是LAM/MPI 6.3.2,可以从/lam/download/ 下载。它主要用于异构的计算机网络计算系统。
5.1.4 MPI编程的基本概念
一个MPI并行程序由一组运行在相同或不同计算机/计算结点上的进程或线程构成。这些进程或线程可以运行在不同处理机上,也可以运行在相同的处理机上。为统一起见,MPI 程序中一个独立参与通信的个体称为一个进程(process)。一个MPI进程通常对应于一个普通进程或线程,但是在共享存储/消息传递混合模式程序中,一个MPI 进程可能代表一组UNIX线程。