MPI并行编程——多进程程序设计

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

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结构的一个域,但不能被用户直接访问)

需要注意:

  1. 发送进程需指定一个有效的目标接收进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值