MPI的实现包括MPICH、LAM、IBM MPL等多个版本,最常用和稳定的是MPICH,曙光天潮系列的MPI以MPICH为基础进行了定制和优化。 MPICH含三层结构,最上层是MPI的API,基本是点到点通信,和在点到点通信基础上构造的集群通信(Collective Communication);中间层是ADI层(Abstract Device Interface),其中device可以简单地理解为某一种底层通信库,ADI就是对各种不同的底层通信库的不同接口的统一标准;底层是具体的底层通信库,例如工作站机群上的p4通信库、曙光1000上的NX库、曙光3000上的BCL通信库等。 MPICH的1.0.12版本以下都采用第一代ADI接口的实现方法,利用底层device提供的通信原语和有关服务函数实现所有的ADI接口,可以直接实现,也可以依靠一定的模板间接实现。自1.0.13版本开始,MPICH采用第二代ADI接口。 我们将MPICH移植到曙光3000高效通信库BCL(Basic Communication Library)上(简称MPI_BCL)。MPI_BCL的接口标准与MPICH版本1.1完全一致,满足MPI1.1标准。同时,也支持ch_p4的通信库,即利用TCP/IP通信机制。从网络硬件角度说,MPI_BCL针对系统网络,MPI_ch_p4针对高速以太网。 1.MPI的程序设计 MPI1.1标准基于静态加载,即所有进程在加载完以后就全部确定,直至整个程序结束才终止,在程序运行期间没有进程的创建和结束。一个MPI程序的所有进程形成一个缺省的组,这个组被MPI预先规定的Communicator MPI_COMM_WORLD所确定。 MPI环境的初始化和结束流程如下:在调用MPI例程之前,各个进程都应该执行MPI_INIT,接着调用MPI_COMM_SIZE获取缺省组(group)的大小,调用MPI_COMM_RANK获取调用进程在缺省组中的逻辑编号(从0开始)。然后,进程可以根据需要,向其它节点发送消息或接收其它节点的消息,经常调用的函数是MPI_SEND和MPI_RECV。最后,当不需要调用任何MPI例程后,调用MPI_FINALIZE消除MPI环境,进程此时可以结束,也可以继续执行与MPI无关的语句。 上面提到的六个函数:MPI_INIT,MPI_COMM_SIZE,MPI_COMM_RANK,MPI_SEND,MPI_RECV,MPI_FINALIZE 实际上构成了编写一个完整的MPI程序所需例程的最小集。 2.MPI的几个重要特征 下面分别介绍MPI的几个重要特征:Communicator(通信空间)、Group(进程组)、Context_id(上下文标识)、Data Types(数据类型)。 Communicator通过其特征属性Context_id来区分,同一个进程不同的Communicator有不同的Context_id。因此Context_id是另一个区分消息的标志。 MPI引入消息的Data Type属性的目的有两个:一是支持异构系统计算;二是允许消息来自不连续的或类型不一致的存储区,例如,可以传送数组的一列,或传送一个结构值,而该结构的每个元素的类型不同。Data Types定义了消息中不连续的数据项及其可能不同的数据类型。Data Type由应用程序在执行时通过基本的数据类型创建。 3.消息 一个消息相当于一封信,消息内容相当于信本身,消息的接收者相当于信封上的内容。因此通常将前者称为消息的buffer, 后者称为消息的envelop。
buffer: message address, count, datatype; 在MPI以前的大多数通信系统中,消息buffer通常仅由buffer的地址和长度决定(例如曙光1000上的NX通信系统),那么在MPI的消息格式中为什么要引入Data Type呢?这有两个主要原因: 支持异构计算:不同系统有不同的数据表示。解决这一问题的方法是预先定义一些基本数据类型,MPI实现过程中对这些类型进行转换,例如转换为XDR格式,接收时进行反转。 派生的数据类型(Derived Data Types):允许消息来自于不连续的和类型不一致的存储区域。 4.MPI应用程序的编译 Include文件 C语言应用程序应有 Fortran语言应用程序应有 MPI库文件 C语言 Fortran语言 mpif77和mpicc MPI提供了两个工具(mpif77和mpicc)来简化MPI应用程序的编译。用户可以直接地使用命令行方式mpicc或mpif77来编译C或Fortran程序,编译方式与cc和f77完全一致。如: 5.MPI应用程序的运行 应用程序编译好后,使用mpirun命令运行MPI应用程序。mpirun命令完整的格式如下: -sz <size| hXw> -np <nprocs> -pl poolname 在运行选项后,是用户的程序名。该可执行文件必须在所指定的或缺省的pool中的所有节点上能找到,并且与启动节点上的路径一致。用户程序名后的一切字符串都视为其参数(不包括被shell解释的重定向等,对shell解释的一些特殊字符,如需作为参数,应作相应的转换)。因此运行选项与用户程序名有先后的顺序,先运行选项,后用户程序名和参数。 |
|