·接口设计应是线程安全的。 MPI提供了一种与语言和平台无关,可以被广泛使用的编写消息传递程序的标准,用它 来编写消息传递程序,不仅实用、可移植、高效和灵活,而且和当前已有的实现没有太大的 变化。 4.3MPI的产生 许多组织对MPI标准付出了努力,它们主要来自美国和欧洲大约有六十几个人,分属 四十几个不同的单位。这包括了并行计算机的多数主要生产商,还有来自大学、政府实验室 和工厂的研究人员 有关的工作及其组织包括Venus(BM、NX2(ntcl、Express(Parasof)、Vertex (nCUBE)、P4(AN)、PARMACS(ANL),还包括(MSU)、Chimp((Ediburg University)、PVM(ORNL,UTK,Emory U)、Chameleon(ANL)、PICL(ANL)年。 MPI的标准化开始于一九九二年四月二十九日至三十日在威吉尼亚的威康姆斯堡召开的 分布存储环境中消息传递标准的讨论会,由Dongarra.Hempel,Hcy和Walker建议的初始草案于 一九九二年十一月推出,并在一九九三年二月完成了修订版,这就是MP10。为了促进MP1 的发展,一个称为MP论坛的非官方组织应运而生 ,该论坛对MP的发展起了重要的作用 九九五年六月推出了MPI的新版本MPII.山,对原来的MPI作了进一步的修改、完善无 扩充。但是当初推出MPI标准时,为了能够使它尽快实现并迅速被接受,许多其它方面的重 要但实现起来比较复杂的功能都没有定义,比如并行IVO,当MPI被广为接受之后,扩充并 提高MPI功能的要求就越来越迫切了。 干是在一九九年的十月,在对原来的MP作了重大扩充的基础上,又推出了MP的打 充部分MPI-2,而把原来的MP 各种 本称为M MPI-2的扩充很多 但主要是三个方面 并行O,远程存储访问和动态进程管理。本书的这一部分主要讲述MPI1的内容,对于 MP1-2,将在最后做专门介绍。 4.4MPI的语言绑定 由于MPI是一个库而不是一门语言,因此对MPI的使用必须和特定的语言结合起来进 行,FORTRAN是科学与工程计算的领域语言,而C又是目前使用最广泛的系统和应用程序 开发的语言之一,因此对FORTRAN和C的支持是必须的. 因此在MPI-中,明确提出了MPI和FORTRAN刀与C语言的定,并且给出了通用接口 和针对FORTRAN7与C的专用接口说明,MPI-I的成功说明MPI选择的语言绑定策略是正确 和可行的。 Fortran90是FORTRAN的扩充,它在表达数组运算方面有独特的优势,还增加了模块等 现代语言的方使开发与使用的各种特征,它目前面临的一个问题是Fo90编译琴远不如 FORTRAN7编译器那样随处可见,但提供F 0编译器的厂商正在逐步增多。C+作为 面向对象的高级语言,随着编译器效率 和处理器速度的提高,它可以取得接近于C的代码 率,面向对象的编程思想已经被为接受,因此在MPI-2中,除了和原来的FORTRAN7和 C语言实现绑定之外,进一步与Fortran90和C+结合起来提供了四种不同的接口,为编程 者提供了更多选择的余地。但是MPI-2目前还没有完整的实现版本
14 l 接口设计应是线程安全的 MPI提供了一种与语言和平台无关 可以被广泛使用的编写消息传递程序的标准 用它 来编写消息传递程序 不仅实用 可移植 高效和灵活 而且和当前已有的实现没有太大的 变化 4.3 MPI的产生 许多组织对MPI标准付出了努力 它们主要来自美国和欧洲 大约有六十几个人 分属 四十几个不同的单位 这包括了并行计算机的多数主要生产商 还有来自大学 政府实验室 和工厂的研究人员 有关的工作及其组织包括 Venus (IBM) NX/2 (Intel) Express (Parasoft) Vertex (nCUBE) P4 (ANL) PARMACS (ANL) 还包括Zipcode (MSU) Chimp (Edinburgh University) PVM (ORNL, UTK, Emory U.) Chameleon (ANL) PICL (ANL)等 MPI的标准化开始于一九九二年四月二十九日至三十日在威吉尼亚的威廉姆斯堡召开的 分布存储环境中消息传递标准的讨论会 由Dongarra,Hempel,Hey和Walker建议的初始草案于 一九九二年十一月推出 并在一九九三年二月完成了修订版 这就是MPI 1.0 为了促进MPI 的发展 一个称为MPI论坛的非官方组织应运而生 该论坛对MPI的发展起了重要的作用 一九九五年六月推出了MPI的新版本MPI1.1 对原来的MPI作了进一步的修改 完善和 扩充 但是当初推出MPI标准时 为了能够使它尽快实现并迅速被接受 许多其它方面的重 要但实现起来比较复杂的功能都没有定义 比如并行I/O 当MPI被广为接受之后 扩充并 提高MPI功能的要求就越来越迫切了 于是在一九九七年的七月 在对原来的MPI作了重大扩充的基础上 又推出了MPI的扩 充部分MPI-2 而把原来的MPI各种版本称为MPI-1 MPI-2的扩充很多 但主要是三个方面 并行I/O 远程存储访问和动态进程管理 本书的这一部分主要讲述MPI-1的内容 对于 MPI-2 将在最后做专门介绍 4.4 MPI的语言绑定 由于MPI是一个库而不是一门语言 因此对MPI的使用必须和特定的语言结合起来进 行 FORTRAN是科学与工程计算的领域语言 而C又是目前使用最广泛的系统和应用程序 开发的语言之一 因此对FORTRAN和C的支持是必须的 因此在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目前还没有完整的实现版本
4.5目前主要的MPI实现 MPICH是一种最重要的MDI实现,它可以免费从httm:/ww-unix mes anl gov/mpi/mpich 取得。更为重要的是,MPICH是一个与MP-I规范同步发展的版本,每当MPI推出新的 就会有相应的MPICH的实现版本,目前MPICHE的最新版本是MPICH-12.1,它支持部分的 MPI-2的特征。Argonnel国家试验室和MSU对MPICH作出了重要的贡献。 CHMP是Edinburgh开发的另一个免费MPI实现,是在EPCC(Edinburgh Parallel Computing Centre)的支持下进行的,从iml/mn.epcc ed ac uk/pub/packages/chimn/release可以免费下载 该软件,CHMP的开发从1991年到1994年,主要开发人员有Alasdair Bruce,.James(Hamish) Ms,和Gordon Smith。 LAM(Local Area Multicomputer))也是免费的MPI实现,由hio State University开发,它 目前的最新版本是LAM/MPI6.3,2,可以从http://www.mpind edu/lam/download业下载。它主 要用于异构的计算机网络计算系统。 表格2列出了一些主要的MPI免费实现。 表格2MPI的一些实现 实现名称 研制单飞 网址 Argonne eand MSU http://www-uni .mcs .anl.gov/mpi/mpich Lam Ohio State University士 fp://fip 4.6小结 本章的目的是给读者一个关于MI的概貌,MP的一个最重要的特点就是免费和源代型 开放,MP可以被迅速接受和它为自己定下的高效率、方便移植和功能强大三个主要目标密 不可分。它采用广为使用的语言FORTRAN和C进行绑定,也是它成功的一个重要因素,兰 然,MP川的成功,还因为它总结和吸收了前期大量消息传递系统的经验,一个成功的标准是 需要大量的实践和艰苦的努力的,MPI就是这种实践和努力的结果
15 4.5 目前主要的MPI实现 MPICH是一种最重要的MPI实现 它可以免费从http://www-unix.mcs.anl.gov/mpi/mpich 取得 更为重要的是 MPICH是一个与MPI-1规范同步发展的版本 每当MPI推出新的版本 就会有相应的MPICH的实现版本 目前MPICH的最新版本是MPICH-1.2.1 它支持部分的 MPI-2的特征 Argonne国家试验室和MSU对MPICH作出了重要的贡献 CHIMP是Edinburgh开发的另一个免费MPI实现 是在EPCC Edinburgh Parallel Computing Centre 的支持下进行的 从ftp://ftp.epcc.ed.ac.uk/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 可以从http://www.mpi.nd.edu/lam/download/ 下载 它主 要用于异构的计算机网络计算系统 表格 2列出了一些主要的MPI免费实现 表格 2 MPI的一些实现 实现名称 研制单位 网址 Mpich Argonne and MSU http://www-unix.mcs.anl.gov/mpi/mpich Chimp Edinburgh ftp://ftp.epcc.ed.ac.uk/pub/packages/chimp/ Lam Ohio State University http://www.mpi.nd.edu/lam/ 4.6 小结 本章的目的是给读者一个关于MPI的概貌 MPI的一个最重要的特点就是免费和源代码 开放 MPI可以被迅速接受和它为自己定下的高效率 方便移植和功能强大三个主要目标密 不可分 它采用广为使用的语言FORTRAN和C进行绑定 也是它成功的一个重要因素 当 然 MPI的成功 还因为它总结和吸收了前期大量消息传递系统的经验 一个成功的标准是 需要大量的实践和艰苦的努力的 MPI就是这种实践和努力的结果
第5章第一个MPI程序 本章以一个简单具体的例子“Hello World”为切入点,给出了MPI程序的一个基本框架 使读者对MP并行程序有一个基本的感性认识。这里首先给出的例子十分简单,目的是使读 者消除对编写并行程序的疑虑,任何有FORTRAN或C编程经验的读者 是可以按照本书介 绍的次序,一步步从简单到复杂,逐步掌握MPI并行程序设计的各种方法和技巧的。 5.1MPI实现的“Hello World!” C语言的程序设计者对“Hello World”这一例子也许还记忆犹新,因为这一例子非常简 单,又具有一定的代表性,因此在介绍MP并行程序设计时,本书首先向读者介绍这一例子。 5.1.1用FORTRAN77+MPI实现 如程序1所示的第一个FORTRAN7+MP行程序。下面分几个部分对它的结构进行介 绍。 第一部分,首先要有MPI相对于FORTRAN实现的头文件npifh,对于MPI相对于C语言 的实现,其头文件是不同的。即用FORTRANi语言编写的MPI并行程序,必须有MPI的 FORTRAN头文件mpif he。现在已经有些实现支持Fortran9O+MPL,在MP-2中明确提出了对 Fortran90和C+的支持。如果是F an90程序,则需要将“include mpifh'”改为“use mpi”, 即MP被定义为一个Forr9O调用的模块(程序4)。 第二部分,定义程序中所需要的与MPI有关的变量。MPI_MAX_PROCESSOR_NAME是 MPI预定义的宏,即某一MPI的具体实现中允许机器名字的最大长度,机器名放在变量 processor_name中;整型变量myid和numprocs分别用来记录某一个并行执行的进程的标识和 所右参加计算的讲程的个数: amelen是实际得到的机器名字的长度;rc和ier分别用来得到 MP过程调用结束后的返回结果和可能的出错信息 第三部分,MPI程序的开始和结束必须是MPI_INIT和MPI_FINALIZE,分别完成MPI程 序的初始化和结束工作。 第四部分,MPI程序的程序体,包括各种MPI过程调用语句和FORTRAN语句。 MPI_COMM_RANK得到当前正在运行的进程的标识号,放在myid中;MPI_COMM_SIZE得 到所有参加运算的进程的个数,放在 umprocs中;MPL_GET_PROCESSOR NAME得到运行 本进程的机器的名称 结果放在 个字符 而该字符串的长度品 在namelen中;wite语句是普通的FORTRAN语句,它将本进程的标识号,并行执行的进程 的个数,运行当前进程的机器的名字打印出来,和一般的FORTRAN程序不同的是这些程序 体中的执行语句是并行执行的,每一个进程都要执行。不妨指定本程序启动时共产生4个进 程同时运行,而运行本程序的机器的机器名为“5”,4个进程都在p5上运行,其标识分别 为0,1,2,3,执行结果如图8所示 虽然这 PI程序本身只有 一条打印语句 但是由 于它启动了四个进程同时执行,每个进程都执行打印操作,故而最终的执行结果有四条打印 语句。本程序的执行流程可以用图10表示
16 第5章 第一个MPI程序 本章以一个简单具体的例子 Hello World 为切入点 给出了MPI程序的一个基本框架 使读者对MPI并行程序有一个基本的感性认识 这里首先给出的例子十分简单 目的是使读 者消除对编写并行程序的疑虑 任何有FORTRAN或C编程经验的读者 是可以按照本书介 绍的次序 一步步从简单到复杂 逐步掌握MPI并行程序设计的各种方法和技巧的 5.1 MPI实现的 Hello World! C语言的程序设计者对 Hello World 这一例子也许还记忆犹新 因为这一例子非常简 单 又具有一定的代表性 因此在介绍MPI并行程序设计时 本书首先向读者介绍这一例子 5.1.1 用FORTRAN77+MPI实现 如程序 1所示的第一个FORTRAN77+MPI并行程序 下面分几个部分对它的结构进行介 绍 第一部分 首先要有MPI相对于FORTRAN实现的头文件mpif.h 对于MPI相对于C语言 的实现 其头文件是不同的 即用FORTRAN语言编写的MPI并行程序 必须有MPI的 FORTRAN头文件mpif.h 现在已经有些实现支持Fortran90+MPI 在MPI-2中明确提出了对 Fortran90和C++的支持 如果是Fortran90程序 则需要将 include mpif.h 改为 use mpi 即MPI被定义为一个Fortran90调用的模块 程序 4 第二部分 定义程序中所需要的与MPI有关的变量 MPI_MAX_PROCESSOR_NAME是 MPI预定义的宏 即某一MPI的具体实现中允许机器名字的最大长度 机器名放在变量 processor_name中 整型变量myid和numprocs分别用来记录某一个并行执行的进程的标识和 所有参加计算的进程的个数 namelen是实际得到的机器名字的长度 rc和ierr分别用来得到 MPI过程调用结束后的返回结果和可能的出错信息 第三部分 MPI程序的开始和结束必须是MPI_INIT和MPI_FINALIZE 分别完成MPI程 序的初始化和结束工作 第四部分 MPI程序的程序体 包括各种MPI过程调用语句和FORTRAN 语句 MPI_COMM_RANK得到当前正在运行的进程的标识号 放在myid中 MPI_COMM_SIZE得 到所有参加运算的进程的个数 放在numprocs中 MPI_GET_PROCESSOR_NAME得到运行 本进程的机器的名称 结果放在processor_name中 它是一个字符串 而该字符串的长度放 在namelen中 write语句是普通的FORTRAN语句 它将本进程的标识号 并行执行的进程 的个数 运行当前进程的机器的名字打印出来 和一般的FORTRAN程序不同的是这些程序 体中的执行语句是并行执行的 每一个进程都要执行 不妨指定本程序启动时共产生4个进 程同时运行 而运行本程序的机器的机器名为 tp5 4个进程都在tp5上运行 其标识分别 为0 1 2 3 执行结果如图 8 所示 虽然这一MPI程序本身只有一条打印语句 但是由 于它启动了四个进程同时执行 每个进程都执行打印操作 故而最终的执行结果有四条打印 语句 本程序的执行流程可以用图 10表示
p eall MPI_INIT(ier)) call MPI COMM RANK(MPI COMM WORLD,myid,ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr call MPI GET_PROCESSOR NAME(proceor nae,namelen,ierr) write(,10)myid,numprocs,processor_namc 10 FORMAT('Hello World!Process'12 of'I1.'on',20A) call MPI_FINALIZE(re) end 程序1第-个FORTRAN77+MP程序 Hello World!Process 1 of 4 on tp5 Hello World!Proc cess 0 of4 on tp5 Hello World!Process 2 of 4 on tp5 Hello World!Process 3 of 4 on tp5 图8第一个FORTRAN77+MP程序在1台机器上的执行结果 如果该程序在4台不同的机器pl,p3,p4,p5上执行,则其最终的执行结果将如图9 所示,即4个进程所运行的机器是不同的。由于4个进程同时执行,在本程序中没有限定打印 语句的顺序,因此不管哪个进程的打印语句在前,哪个在后,都没有关系,只要有4条正确 的输出语句即可。 Hello World!Process 0 of 4 on tp5 Hello World!Process 1 of 4 on tpl Hello World!Process 2 of on tp3 Hello World!Process3of4 ontp 图9第-个FORTRAN77+MP程序在4台机器上的执行结果
17 程序 1 第一个FORTRAN77+MPI程序 图 8 第一个FORTRAN77+MPI程序在1台机器上的执行结果 如果该程序在4台不同的机器tp1 tp3 tp4 tp5上执行 则其最终的执行结果将如图 9 所示 即4个进程所运行的机器是不同的 由于4个进程同时执行 在本程序中没有限定打印 语句的顺序 因此不管哪个进程的打印语句在前 哪个在后 都没有关系 只要有4条正确 的输出语句即可 图 9 第一个FORTRAN77+MPI程序在4台机器上的执行结果 program main include 'mpif.h' character * (MPI_MAX_PROCESSOR_NAME) processor_name integer myid, numprocs, namelen, rc,ierr call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) call MPI_GET_PROCESSOR_NAME(processor_name, namelen, ierr) write(*,10) myid,numprocs,processor_name 10 FORMAT('Hello World! Process ',I2,' of ',I1,' on ', 20A) call MPI_FINALIZE(rc) end Hello World! Process 1 of 4 on tp5 Hello World! Process 0 of 4 on tp5 Hello World! Process 2 of 4 on tp5 Hello World! Process 3 of 4 on tp5 Hello World! Process 0 of 4 on tp5 Hello World! Process 1 of 4 on tp1 Hello World! Process 2 of 4 on tp3 Hello World! Process 3 of 4 on tp4
C启动“Hello World”开始执行 进0 进 进程2 程3 MPLINIT MPLINIT MPLINIT MPLINIT MPL_COMM_RANK MPL_COMM_RANK MPI_COMM_RANK MPI_COMM_RAN myid=0 myid=l myid-2 MPL_GET_M OR NAM den=3 write 330f4 MPLFINALIZE MPL_FINALIZE MPLFINALIZE MPL_FINALIZE “Hello World'”程序结束 图10第一个FORTRAN77+MP程序的执行流程 5.1.2用C+MPI实现 如程序3所示的第一个C+MPI并行程序。它的程序结构和FORTRAN77+MPI的完全相 同,但对于不同的调用,在形式和语法上有所不同。下面分几个部分对它的结构进行介绍。 第一部分,首先要有MPI相对于C实现的头文件mpi.h,而不是npifh,这和FORTRAN77 是不同的 第二部分,定义程序中所需要的与MPI有关的变量。MPLMAX_PROCESSOR_NAME是 MPI预定义的宏,即某一MPI的具体实现中允许机器名字的最大长度,机器名放在变量
18 启动 Hello World 开始执行 进程0 进程1 进程2 进程3 MPI_INIT MPI_INIT MPI_INIT MPI_INIT MPI_COMM_RANK MPI_COMM_RANK MPI_COMM_RANK MPI_COMM_RAN myid=0 myid=1 myid=2 myid=3 MPI_GET_PROCESSOR_NAME MPI_GET_PROCESSOR_NAME MPI_GET_PROCESSOR_NAME MPI_GET_PROCESSOR_NAME processor_name= tp5 processor_name= tp5 processor_name= tp5 processor_name= tp5 namelen=3 namelen=3 namelen=3 namelen=3 write write write write Hello World! Process 0 of 4 on tp5 Hello World! Process 1 of 4 on tp5 Hello World! Process 2 of 4 on tp5 Hello World! Process 3 of 4 on tp5 MPI_FINALIZE MPI_FINALIZE MPI_FINALIZE MPI_FINALIZE Hello World 程序结束 图 10 第一个FORTRAN77+MPI程序的执行流程 5.1.2 用C+MPI实现 如程序 3所示的第一个C+MPI并行程序 它的程序结构和FORTRAN77+MPI的完全相 同 但对于不同的调用 在形式和语法上有所不同 下面分几个部分对它的结构进行介绍 第一部分 首先要有MPI相对于C实现的头文件mpi.h 而不是mpif.h 这和FORTRAN77 是不同的 第二部分 定义程序中所需要的与MPI有关的变量 MPI_MAX_PROCESSOR_NAME是 MPI预定义的宏 即某一MPI的具体实现中允许机器名字的最大长度 机器名放在变量