MPI简介

MPI(Message Passing Interface),消息传递接口。消息传递是进程通信的一种方法,在利用消息传递进行进程间通信时,各个进程具有自己独立的堆栈,进程之间的通信通过显示调用函数完成。MPI是利用消息传递来完成多进程通信的一种标准。其实现有很多,如MPICH、CHIMP、LAM MPI等。本文以MPICH为例,进行介绍。

一. 安装与环境配置

MPICH的安装及配置见上一篇文章。本文运行环境为VS2012 + MPICH2 - 1.4.1。

二. 接口说明

本文以Hello World为例,对MPI相关接口进行简单说明。

代码如下所示:

#include "mpi.h"          //包含MPI的头文件
#include <iostream>  

using namespace std;

int main(int argc,  char* argv[])  
{  
    int rank;             //进程号,标识每一个进程
    int size;             //进程数目,总共有多少进程
    int namelen;          //处理机名称长度
    char processor_name[MPI_MAX_PROCESSOR_NAME];         //每个进程对应的处理机名称
    MPI_Init(&argc,&argv);                               //初始化MPI执行环境
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);                //标识各个MPI进程
    MPI_Comm_size(MPI_COMM_WORLD, &size);                //标识总共有多少进程
    MPI_Get_processor_name(processor_name, &namelen);    //得到当前进程的处理机名称

    printf("Hello,World from Process %d of %d on %s\n", rank, size, processor_name);    //在当前进程下打印

    MPI_Finalize();       //结束MPI执行环境  

    return 0;  
}  

在上述代码中,共用到了5个MPI接口,分别是MPI_Init()、MPI_Comm_rank()、MPI_Comm_size()、MPI_Get_processor_name()、MPI_Finalize()。

     MPI_Init(int *argc,char ***argv)和MPI_Finalize()

MPI_Init()表示并行部分的开始。用于初始化MPI运行环境,建立多个MPI进程之间的联系,为后续通信做准备,两个参数均来自于main函数。MPI_Finalize()表示并行部分的结束。用于结束MPI执行环境。两个函数之间的代码由多个进程并行执行。所有的MPI其它函数的调用都应该在这两个函数之间。

     MPI_Comm_rank(MPI_Comm comm,int *rank)

用来标识当前进程,给出进程号。其有两个参数,MPI_Comm类型的通信域句柄,标识MPI进程组,例子中使用MPI_COMM_WORLD,指所有进程组。rank用于返回当前进程的进程ID。

     MPI_Comm_Size(MPI_Comm comm,int *size)

由于返回进程组进程数目。有两个参数,MPI_Comm类型的通信域句柄,标识MPI进程组,例子中使用MPI_COMM_WORLD,指所有进程组,与上一个函数相同。size用于返回进程组进程数目。

     MPI_Get_processor_name(char *name,int *resultlen)

name为返回的机器名字符串,resultlen为返回的机器名长度

此外,还有两个较为常用的函数:

int MPI_Send(void *buf, int count, MPI_Datatype datatype,int dest, int tag, MPI_Comm comm)

用于进程之间消息的发送。其中,buf为发送缓冲区的起始地址,count为将发送的数据个数(以后面的数据类型进行计数),datatype为发送数据的数据类型,dest为目的进程标识号,tag为消息标识,comm为通信域。其是将发送缓冲区buf中的count个datatype数据类型的数据发送到标识号为dest的目的进程,本次发送的消息标识是tag。

int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm, MPI_Status *status)

用于进程之间消息的接收。buf为接收缓冲区的起始地址,count为最多可接收的数据个数,datatype为接收数据的数据类型,source为接收数据的来源进程标识号,tag为消息标识,应与相应发送操作的标识相匹配,comm为本进程和发送进程所在的通信域,status为返回状态。

三.MPI程序运行

本示例在VS2012环境下编写。
首先,打开wmpiexec.exe(在安装位置bin目录下),如下所示:

这里写图片描述

在Application框里选择要运行的exe,并设置进程数目。“run in an separate window”选框表明是否要重新开一个黑框来运行程序。
设置如下:

这里写图片描述

运行结果如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值