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”选框表明是否要重新开一个黑框来运行程序。 设置如下:
运行结果如下: