MPI(Message Passing Interface)是消息传递并行程序设计的标准之一,当前通用的是MPI1.1规范。正在制定的MPI2.0规范除支持消息传递外,还支持MPI的I/O规范和进程管理规范。MPI正成为并行程序设计事实上的工业标准。
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(数据类型)。
MPI提供Communicator来指定通信操作的上下文,提供了通信操作的执行空间。在某个通信空间(或上下文)中发送的消息必须在相同的空间中接收,不同空间中的消息互不干扰。定义一个Communicator,也就指定了一组共享该空间的进程,这些进程组成了该Communicator的Group。
Communicator通过其特征属性Context_id来区分,同一个进程不同的Communicator有不同的Context_id。因此Context_id是另一个区分消息的标志。
MPI引入消息的Data Type属性的目的有两个:一是支持异构系统计算;二是允许消息来自不连续的或类型不一致的存储区,例如,可以传送数组的一列,或传送一个结构值,而该结构的每个元素的类型不同。Data Types定义了消息中不连续的数据项及其可能不同的数据类型。Data Type由应用程序在执行时通过基本的数据类型创建。
3.消息
一个消息相当于一封信,消息内容相当于信本身,消息的接收者相当于信封上的内容。因此通常将前者称为消息的buffer, 后者称为消息的envelop。
buffer: message address, count, datatype;
envelop: process id, message tag,communicator
在MPI以前的大多数通信系统中,消息buffer通常仅由buffer的地址和长度决定(例如曙光1000上的NX通信系统),那么在MPI的消息格式中为什么要引入Data Type呢?这有两个主要原因:
支持异构计算:不同系统有不同的数据表示。解决这一问题的方法是预先定义一些基本数据类型,MPI实现过程中对这些类型进行转换,例如转换为XDR格式,接收时进行反转。
派生的数据类型(Derived Data Types):允许消息来自于不连续的和类型不一致的存储区域。
4.MPI应用程序的编译
Include文件
C语言应用程序应有
#include "mpi.h"
若使用cc编译,命令行应有:
-I/cluster/mpi/net/include (net版)
-I/cluster/bcl/include -I/cluster/rms/include -I/cluster/sdr/include -I/cluster/mpi/mesh/include (mesh版)
Fortran语言应用程序应有
include 'mpif.h'
若使用f77编译, 命令行应有:
-I/cluster/mpi/net/include (net版)
-I/cluster/bcl/include -I/cluster/rms/include -I/cluster/sdr/include -I/cluster/mpi/mesh/include (mesh版)
MPI库文件
C语言
C语言程序编译时需作下述链接:
-L/cluster/mpi/net/lib -lmpi -lbsd (net版)
-L/cluster/mpi/mesh/lib -L/cluster/bcl/lib -L/cluster/rms/lib -L/cluster/sdr/lib -lmpi -lbcl -lrms -lsdr (mesh版)
数学函数库还应链接: -lm
Fortran语言
Fortran编译时应作下述链接:
-L/cluster/mpi/net/lib -lmpi -lbsd (net版)
-L/cluster/mpi/mesh/lib -L/cluster/bcl/lib -L/cluster/rms/lib -L/cluster/sdr/lib -lmpi -lbcl -lrms -lsdr (mesh版)
mpif77和mpicc
MPI提供了两个工具(mpif77和mpicc)来简化MPI应用程序的编译。用户可以直接地使用命令行方式mpicc或mpif77来编译C或Fortran程序,编译方式与cc和f77完全一致。如:
mpif77 -c foo.f
mpicc -c foo.c
mpif77 -o foo foo.o
mpicc -o foo foo.o
有时链接时需一些特殊库, 应在链接时注明。使用mpicc和mpif77省略了有关MPI的路径设置。
5.MPI应用程序的运行
应用程序编译好后,使用mpirun命令运行MPI应用程序。mpirun命令完整的格式如下:
mpirun [-h|-?|-help] [-sz size|-sz hXw] [-np nprocs] [-pl poolname] <progname [argument]>
各个选项的值由用户从命令行中显示地指定,选项的含义如下:
-h
-?
-help:显示帮助信息。
-sz <size| hXw>
指定物理节点的数目。有两种指定形式,一是直接指定size值,另一种是指定物理节点的矩形域的长和宽。size值和h*w的值如果超过所在pool的节点数,sz项的值取pool的节点数,h*w值取整个pool。两者的缺省值分别为所在pool的节点数和整个pool。
-np <nprocs>
用户期望运行的进程数。进程数与实际申请的物理节点数没有任何联系,因为允许一个节点上运行同一个应用的多个进程。如果未指定,取实际sz项的值。
-pl poolname
应用程序执行的pool。应用程序的每次执行能且只能在一个pool中执行。缺省值为系统为用户设置的缺省的pool名(每个用户在创建时已自行指定或系统分配了一个缺省的pool)。
在运行选项后,是用户的程序名。该可执行文件必须在所指定的或缺省的pool中的所有节点上能找到,并且与启动节点上的路径一致。用户程序名后的一切字符串都视为其参数(不包括被shell解释的重定向等,对shell解释的一些特殊字符,如需作为参数,应作相应的转换)。因此运行选项与用户程序名有先后的顺序,先运行选项,后用户程序名和参数。
分享到:
相关推荐
【MPI并行设计程序实验报告】\n\nMPI(Message Passing Interface)是一种广泛应用于并行计算领域的编程模型和标准,其主要目标是提供一个跨平台、高效、灵活的消息传递机制,使得并行程序可以在分布式内存系统中...
**一、MPI简介** MPI是一个接口规范,而不是具体的实现。它定义了一系列函数,这些函数可以在不同的并行计算机系统上实现,以实现进程间的通信。MPI的主要目标是提高可移植性,让开发者无需关心底层硬件细节就能编写...
#### 一、MPI简介与基本概念 MPI(Message Passing Interface,消息传递接口)是一种广泛使用的并行编程模型标准,它为高性能计算领域提供了跨多种平台的消息传递通信功能。MPI支持多种语言,如C、C++、Fortran等,...
1. **MPI简介**:MPI是一种标准接口,允许程序员编写可以在多处理器系统上运行的并行程序。它提供了一组丰富的通信原语,如点对点的发送和接收,以及集合通信操作如广播、扫描、Reduce等。 2. **MPI进程**:在MPI...
#### 一、MPI简介 MPI(Message Passing Interface)即消息传递接口,是为并行编程设计的一种标准库接口,旨在提供一种广泛使用的标准用于编写消息传递程序。该标准由MPI论坛制定,该论坛由来自超过40个组织的成员...
#### 二、MPI简介 MPI是一种用于编写并行程序的标准协议,它定义了一组用于进程间通信的函数,这些函数允许数据在不同的处理器之间传递。MPI支持多种语言,包括C、C++和Fortran等,具有良好的跨平台性。通过MPI,...
- **MPI简介**: - **定义**:MPI(Message Passing Interface)是一种用于编写并行程序的标准接口,适用于多种编程语言。 - **目的**:提供一种通用且高效的方式来进行进程间的通信。 - **历史与发展**:MPI由...
#### 并行计算与MPI简介 在现代高性能计算(HPC)领域,并行计算技术变得越来越重要。它能够显著提高计算密集型任务的处理速度,尤其是在多核处理器架构下。消息传递接口(MPI)是一种广泛采用的标准并行计算框架,...
#### MPI简介 消息传递接口(Message Passing Interface, MPI)是一种用于编写并行计算程序的标准协议,它支持多种编程语言,包括C、C++和Fortran等。MPI允许开发者在多台计算机或单个多核心处理器上编写分布式内存...
#### 一、MPI简介与应用场景 **MPI**(Message Passing Interface)是一种广泛应用于高性能计算领域的标准接口规范,它定义了进程间通信的规则和接口,允许开发者编写并行程序来解决复杂问题。MPI适用于分布式内存...
#### MPI简介 MPI(Message Passing Interface)是一种用于编程并行计算机的语言独立通信协议,定义了一套进程之间传递消息的标准。它适用于各种不同的传输媒介,不仅支持单一电脑内进程之间的消息传递,还能够在...
- **MPI简介** - MPI (Message Passing Interface) 是一种标准化的并行编程接口,广泛应用于分布式内存架构的并行编程。 - MPI的主要目标是提供一个高效、通用且便携的方式来进行并行编程。 - **MPI的历史与发展**...
#### MPI简介与应用 **MPI**(Message Passing Interface, 消息传递接口)是一种标准化并广泛支持的通信协议,用于编写高性能并行计算程序。MPI支持多种并行编程模型,如分布式的内存模型等,在高性能计算领域有着...
#### MPI简介与定义 **消息传递编程接口**(Message Passing Interface,简称MPI)是一种广泛应用于高性能计算领域的并行计算标准。它为编写分布式内存多处理器并行程序提供了一种统一的方法。MPI的开发始于1992年...
#### MPI简介与标准规范 - **MPI**(Message Passing Interface)是一种标准规格的消息传递库,旨在提供一组用于进程间通信的函数库。该标准由**MPI论坛**开发并维护,确保了跨平台的兼容性与一致性。 #### MPI编程...
#### 一、MPI简介与基本概念 - **MPI (Message Passing Interface)**:一种标准化并广泛使用的消息传递编程接口,用于编写高性能计算(HPC)应用,特别是在分布式内存架构上。 - **分布式内存系统**:在分布式内存...
**2.1 MPI简介** MPI是一种标准化的消息传递编程接口,用于编写高性能并行程序。它定义了一套API,允许用户编写可以运行在分布式内存架构上的并行程序。MPI支持多种语言,包括C、C++和Fortran等。使用MPI编写的程序...
#### MPI简介及并行计算背景 MPI(Message Passing Interface)是一种广泛应用于高性能计算领域的并行编程模型,它允许开发者编写能够跨多个处理器或计算机节点运行的并行代码。通过定义一组标准的函数、变量类型和...