MPI程序在网格环境下移植的研究

时间:2022-10-08 04:31:27

MPI程序在网格环境下移植的研究

摘要:将现有MPI并行程序移植到网格环境下有着非常现实的意义,本文介绍了网格计算的概念和MPI并行计算模型,阐述了将现有的MPI并行程序移植到Globus网格环境下的重要性,并针对这类移植的一种折中方案――MPICH-G2进行了研究、实验,总结了这种方案的特点和相关技术。

关键字:网格计算;并行计算;MPI;Globus

中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)04-11014-03

1 概述

网格计算

网格计算(grid computing)用来表述一种适用于高端科学和工程的分布式计算体系结构,是巨型机与互联网技术基础上推出的一项新变革,是完成超级计算任务的一种新模式,又称为虚拟计算环境,或全球计算(global computing)统一平台。网格就是把整个国际互联网集成为一台巨大的超级计算机,实现全球范围的计算资源、存储资源、数据资源、信息资源、知识资源、专家资源、设备资源的全面共享。

从1997年起,开放源代码的Globus工具集第二版(GT2)成为了网格计算的事实标准。GT2着重于可用性和互操作能力,它定义和实现了一些协议、API和服务。Globus已经被广泛认可,并且在几年内,经历了网格计算发展的各个阶段,其中包括GT3对开放网格服务体系结构(Open Grid Services Architecture, OGSA)规范的支持,以及最新的GT4对(WEB服务资源框架)WSRF的支持。

MPI及其特点

MPI是一种消息传递编程模型,目的是实现进程间的通信。MPI不是一门语言,而是一个运行库,可以由Fortran77/Fortran90/C/C++语言调用,在语法上,他完全以库的形式呈现,因此很好地融入了宿主语言中。MPI已经在很多科研领域被广泛地使用。作为一种消息传递式的并行编程环境,MPI并行程序要求将任务分块,同时启动多个进程并发执行,各进程之间通过调用MPI的库函数实现消息传递。

由于其消息传递并行编程模型的特点,MPI程序的各个参与计算的进程可以被容易的分布在不同的计算节点上,这使得MPI程序具有很强的可扩展性。为了支持异构环境编程,MPI定义了一些数据类型,使得进程之间可以跨平台交互。这些数据类型与语种中的数据类型对应,但是又中立于语言。

MPI不同于PVM,他的各个进程运行相同的源代码,一般地,根据自己不同的进程号,进入到程序中的不同分支进行运行,既可以使用对等模式来编程,也可以使用主从模式来编程。对等模式中程序的各个部分使用相同的代码来处理不同的数据,主从模式中则是由一个主进程来控制其它进程的运行,体现了依赖的关系。

MPI-1提供了128个调用接口,MPI-2提供了287个调用接口,但是最基本的MPI调用只有6个。用以下的6个函数,可以实现基本的并行编程:

(1)MPI_Init():初始化MPI程序

(2)MPI_Finalize():结束MPI程序,做清理工作

(3)MPI_COMM_Size():确定参与计算的进程数

(4)MPI_COMM_Rank():确定当前进程的进程号

(5)MPI_Send():发送消息(阻塞式)

(6)MPI_Recv():接受消息(阻塞式)

2 将MPI并行程序移植到网格环境下的意义

网格计算带给我们一种新的高性能计算的解决途径。在当前网格计算领域仍然处在发展阶段,仍然是一个未成熟的技术时,如何快速把现有的应用移植到网格平台下,享受网格计算和Globus工具集所提供的网格服务,成为一个重要的课题。

一种非常理想化的解决方案是使用支持网格的编程语言重新构造现有应用。但是现在网格环境下的编程语言还不成熟,基于java的和机遇c语言的方案差别较大。例如,在GT2时代所编写的机遇c语言的网格应用在GT4时代就显得不好适应,因为GT4主要是面向Web Service的。这种方法的另一个重要缺点是开销太大。把一个正在使用的程序重新编写和调试需要很多的人力物力。

将现有的MPI程序移植到Globus网格环境就是一个比较现实的好方案。这是一个折衷的方案,因为MPI的编程模型并不是和网格体系结构一一对应的,不能很好的利用所有的网格服务。但是,MPI应用程序已经非常普及,大量存在于各行各业的应用系统中。MPI编程模型成功地解决了将问题分解为相互协作的子问题,这样非常有利于网格调度程序进行调度运行。因此,讲现有的MPI并行程序移植到网格环境下,不仅是可行的,而且是能够快速地将网格计算普及开来,使用最小的代价构建网格计算环境。

3 MPICH-G2解决方案

MPICH-G2是MPI-1标准的完全实现,并加入了MPI-2标准中的客户机-服务器管理功能。MPICH是一种被广泛使用的MPI实现。更具体地说,MPICH-G2被构造成MPICH的网格化进程管理和通信模块。这些模块采用Globus Toolkit机制,克服了在异构多站点环境中安全、高效和透明执行程序所必须面对的困难。

通过使用Globus Toolkit提供的服务,MPICH-G2可以在异构的平台上运行MPI程序。数据在不同的体系结构机器上的通讯,由MPICH-G2来自动完成数据格式的转换。这些特性在传统的MPICH环境下是不被支持的。

而且,只要用户的MPI程序符合MPI1.1标准,那么只要拥有源程序,就可以不需要修改程序,直接在网格环境下重新编译就可以进行部署。易用性和成本也是很低的。

MPICH-G2是基于MPICH开发的,相对于基于局域网的MPICH,MPICH-G2实现了MPI 2.0标准中的Client/Server连接方式,在服务器端提供了MPI_Open_port, MPI_Close_port, 和MPI_Comm_accept函数,在客户端提供了MPI_Comm_connect函数。并且对MPI的集合(collective)操作进行了功能优化,使得MPICH-G2的集合操作能够针对运行时的网格计算环境拓扑结构进行识别和优化,提高级和操作的性能。目前的MPICH-G2中优化过的集合操作函数有:MPI-Barrier、MPI_Bcast、MPI_Gather、MPI_Scatter、MPI_Reduce。将来还会对其他九个集合操作函数进行优化。

由于基于网格计算环境的并行计算程序会跨越不同的物理通信域进行数据交换,MPICH-G2针对这些情况,假设:

广域网的TCP通信新能 < 局域网的TCP通信性能(跨网段) < 跨机器的TCP性能(在一个网段内) < 专门的MPI实现的性能(如基于高性能Myrinet网络的MPI实现)

并可以采用RSL语言描述出MPI进程的不同分布,使得MPI基和操作函数可以基于RSL语言描述的分布进行优化集合通信。

3.1 使用MPICH-G2的前提条件:

(1)用户需要在每个节点上有一个账号

(2)Globus Toolkit需要在每个节点上安装好

(3)对于控制台节点(即用户在上面执行mpirun程序的节点),用户要设置环境变量:$GLOBUS_LOCATION/etc/globus-user-env.sh

(4)在每个参加计算的节点上,需要配置好Pre-WS GRAM的daemon程序globus gatekeeper

(5)用户必须要有一个网格内的身份,并且在每台机器的gridmap文件中把它映射到相应的本地账号上

(6)由于以上规则,可以发现,用户需要了解参与计算的所有节点,还要对其有一定的控制能力(有账号,写gridmap文件等),因此,网格资源发现功能在这种情况下没有什么用处

3.2 MPICH-G2的使用方法:

(1)使用MPICH-G2提供的编译器在你想要运行的每台计算机上编译你的应用程序。

(2)使用MPICH-G2的mpirun程序来运行编译好的二进制文件。用户需要使用网格环境中的一台计算机作为控制台(console)计算机来控制任务的运行情况。用户可以在控制台计算机上提交任务、终止任务(terminate)。

(3)在globus2设备下的每一次运行mpirun命令,它都会向这个Globus网格提交一个Globus资源描述语言脚本(Globus Resource Specification Language Script),简称RSL脚本。每个RSL脚本由一个或者多个RSL子任务组成,一般地在一次计算中一个子任务对应着一个物理计算机。你可以提供你自己的RSL脚本给mpirun程序让它执行,也可以让mpirun程序为你创造出一个RSL脚本来执行,它所创建的RSL脚本会基于你所传递给mpirun程序的命令行参数,以及你的machines文件的内容(machines文件指定了有那些计算机作为网格资源可以参与计算)。

(4)一般地,可以使用mpirun直接运行程序(让它自动生成RSL脚本,然后提交运行);也可以使用自己写的RSL脚本;另外一个很好的办法是使用mpirun程序生成要运行任务的RSL脚本(自动生成RSL脚本作为标准输出,但是不运行程序),然后在生成的RSL脚本中进行必要的修改,然后再次提交给mpirun程序来运行。

(5)无论是自己提供RSL脚本,还是使用mpirun直接运行程序,有一点很重要,那就是在不同的子任务之间(也就是在mpi程序中所见到的每个进程之间)所有的通讯都是通过TCP/IP来完成的。

(6)如果一个程序运行了很长时间,我们需要终结这个程序,不再需要它的运行结果,我们可以按Ctrl-c键。注意,我们能终结一个整个的MPI任务,而不能终结整个MPI任务中多个进程中的某一些进程(子任务)。在控制台计算机上,当运行了mpirun程序时,控制台会被block掉,并不会直接返回shell。这样,提供了一个机会让用户按Ctrl-c键来终止mpirun程序,也既是终止整个MPI任务。由MPICH-G2的文档中我们可以看到正确的终止任务的方法――我们应当小心,只按一下Ctrl-c键,接着会有一小会儿的等待,我们需要耐心,让mpirun程序为我们完成任务终止工作(在各个节点上终止相关的进程、子任务)。如果我们按了多次Ctrl-c键,清除任务会有影响,可能用户虽然推出了mpirun程序返回了控制台,但是远程的相关进程仍然没有被杀掉,由此会带来资源的浪费和系统的不稳定。一般来说,要干净地终结在所有机器上的所有进程需要花几分钟时间。

在相同体系结构和操作系统的网格环境下,如果共享一个网络文件系统,那么只需要使用MPICH-G2提供的编译器编译一遍所需要的MPI应用程序就可以部署使用了。

如果用户可以提供在相同体系结构和相同操作系统下,使用普通的MPICH编译器编译生成的二进制文件,如果把它部署在网格的MPICH-G2环境下来运行,会有意想不到的结果。它仍然会开N个用户指定的进程,但是这N个进程之间互不可见,他们都以为整个任务只有自己一个进程在运行一样。因此,要把一个MPI应用程序部署到Globus Toolkit网格环境下来管理、运行,必须要提供相应的源代码。

使用自己的RSL脚本来使用mpirun

在某些情况下,可能会需要一些精确的控制,来控制MPI并行计算任务的运行。这种时候,可以自己写RSL脚本来提交给mpirun程序,然后让mpirun程序再把这个RSL脚本提交给Pre-WS GRAM组件。

例如,当可执行文件在各个参与运算的网格节点的文件系统中处于不同位置时,就需要修改RSL脚本;又如,Globus的网格资源分配和管理GRAM组件,具有文件传输的功能(staging),这个功能,实际上是指,可以在控制台节点中,编译一次MPICH-G2程序,然后在运行mpirun的时候把这个程序自动分发到参与计算的节点上,还可以制定输入和输出的重定向。这个功能在普通的RSL脚本中是被支持的,但是由于mpirun在提交任务给Pre-GRAM之前,对任务作了很多的包装,因此,我们并没有实验出可执行文件的传输功能(staging),但是试出了输出重定向的功能。总之,要精确控制任务的提交,就需要自己改写RSL脚本。

在以上这些情况下,你必须要使用RSL来写一个RSL脚本,为每台参与计算的网格节点制定可执行文件的位置。

对MPICH-G2运行方式的评价

虽然现代语言像Java提供了编译一次,各处运行这样的移植性。但是MPICH-G2只提供了类似于C语言的移植性,即使用标准MPI的C语言源程序可以不加修改,但在MPICH-G2环境下必须重新编译过运行。

实验表明,在传统MPICH下编译的二进制文件和在MPICH-G2网格环境下编译的二进制文件是不同的。因此,要移植MPI程序,一定要有源代码,光有可执行文件是不可行的。

从以上的使用方法我们可以得出以下的结论:在提交任务之间,我们必须对我们所需要的计算资源有一个明确地了解。因为,我们需要在machines文件中明确地指出我们所需要的计算资源,这些计算资源必须要开起Pre-Gram服务,而且还必须要安装MPICH-G2。另一方面,我们在所需要的计算资源上面还要有相应的本地账号,是我们在网格上的实体身份可以映射到计算资源的本地账号上,通过gridmap文件。因此,通过网格资源发现功能来发现网格计算资源在这个环境下是意义不大的,因为就算我们可以通过网格资源发现功能来发现闲置的安装了MPICH-G2的计算资源,由于我们没有在此资源上进行操作的权限,因此也是没有用的。从以上的描述中,我们可以看到,一个MPICH-G2的并行计算任务,一经提交,就决定了他在那些计算资源上运行,拓扑结构如何。在运行过程中,是不允许改变的,只能终止任务,从新提交。

MPICH-G2的体系结构是在传统MPI集群体系结构的MPICH和操作系统之间加入了网格环境这一层,MPICH-G2代替MPICH为MPI应用程序提供支持。MPICH-G2不再直接与操作系统交互,而是通过调用网格服务来实现,必然会带来相应的开销。而且网格的资源管理是动态的,GT提供服务也会有开销。

4 结论

近年来,基于MPI消息传递模型设计的高性能并行计算应用已经逐渐普及。随着问题规模的不断扩大,用户需求的不断增长,当传统的基于主机的和基于集群的并行计算环境不能满足需求的时候,我们需要求助于网格,利用网格提供的各种服务(网格资源管理、资源搜索和监控等)。将现有的MPI应用移植到网格环境下是一个非常具有现实意义的方案,和重新改造原有应用比起来,减少了极大的人力、物力。笔者在一个科研项目中,对这种方案进行了研究和尝试,效果很好。

参考文献:

[1]Ian Foster,Carl Kesselman,网格计算(第二版)[M].电子工业出版社,2004.

[2][DB/OL]..

[3][DB/OL].www3.niu.edu/mpi.

[4]Joshy Joseph, Craig Fellenstein, Grid Computing,Prentice Hall PTR,2003,12.

[5]曾国荪,陈闳中,计算网格的抽象定义[J].同济大学学报,2003,9.

本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

上一篇:基于AJAX搭建高效的B/S减灾综合系统 下一篇:基于贝叶斯估计法的传感器目标定位研究