MPI(Massage Passing Interface),它不是一种语言,而是一种库描述,是消息传递函数库的标准规范。MPI标准定义了一组具有可移植性的编程接口,在Fortran和C/C++中可以直接对相应的函数进行调用。
MPI有很多种实现。MPICH是最重要的MPI实现之一,它与其衍生产品构成了世界上使用最广泛的MPI实现,在超级计算机中也得到了广泛的应用。
MPI最基本的消息传递操作包括:发送消息send、接受消息receive、进程同步barrier、归约reduction等。本文对发送消息和接受消息作简要的介绍,如要了解更多MPI的相关知识,请参考其他相关资料。
一、MPI基本概念与相关的函数解释
通信器(communicator)
所谓通信器,可以理解为一类进程的集合,也可以称之为一个进程组。一个进程组中的进程可以相互通信。所有MPI通信都必须在某个通信器内进行。MPI系统提供缺省的通信器MPI_COMM_WORLD,所有启动的MPI进程通过调用函数MPI_Init()包含在该通信器内。各个进程可以通过函数MPI_Comm_size()获取通信器所包含的的MPI进程个数。一个通信器内的所有进程都拥有一个该通信器内中唯一的序号(rank)用作自身的标识( 序号的取值范围是[0,通信器进程数-1] )
int MPI_Comm_size(MPI_Comm comm, int* size)
//获取通信器的进程数,comm为通信器名称(也叫通信域),获取得到的进程个数结果被放在size中
进程序号(rank)
rank用来在一个通信器中标识一个进程,同一个进程在不同的通信器中可以有不同的序号,进程的序号是在通信器被创建时赋予的。
int MPI_Comm_rank(MPI_Comm comm, int* rank)
//获取进程在通信器中的标号,comm为通信器名称,获取得到的进程id被放在rank中
消息(message)
不同进程之间通过消息传递数据,因此MPI可以应用于分布存储系统。消息发送与接收函数的参数可以分为数据(data)和信封(envelope)两个部分。包装由进程序号、消息标号和通信器三部分组成;
int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
//消息发送函数,参数可以分为数据、信封
//数据:<地址(buffer的地址),数据个数(count),数据类型(datatype)>
//信封:<目的(dest),标识(tag),通信域(comm)>
//count指定数据类型的个数、datatype为数据类型、dest取值范围是0~(进程总数-1);tag 取值范围是0~MPI_TAG_UB,用来区分消息
int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source,int tag, MPI_Comm comm, MPI_Status *status)
//接收buffer必须至少可以容纳count个由datatype参数指明类型的数据. 如果接收buf太小, 将导致溢出。
//消息匹配机制:
//1.参数匹配 dest,tag,comm 分别与 source,tag,comm相匹配;
//2.若 Source 为 MPI_ANY_SOURCE:接收任意处理器来的数据。
//3.若Tag为MPI_ANY_TAG:则匹配任意tag值的消息
//在阻塞式消息传送中不允许Source==Dest,否则会导致死锁。
//消息传送被限制在同一个通信域中。
//在send函数中必须指定唯一的接收者
int MPI_Get_count(MPI_Status status, MPI_Datatype datatype, int*count)
//查询接收到的消息长度,该函数在count中返回数据类型的个数,即消息的长度(count属于MPI_Status结构的一个域,但不能被用户直接访问)
需要注意:
发送进程需指定一个有效的目标接收进程

本文介绍了MPI(消息传递接口),它是消息传递函数库的标准规范,在Fortran和C/C++中可调用。文中阐述了MPI基本概念、函数,详细说明了在Ubuntu下的gcc/g++和mpich环境配置,还介绍了MPI程序的编译、运行,以及相关数据类型和几个简单示例程序。

1475

被折叠的 条评论
为什么被折叠?



