MPI入门

来源:互联网 发布:1024网址 知乎 编辑:程序博客网 时间:2024/05/02 02:30
敢时髦也写点Blog

MPI 入门(MPICH2 windows版本)

1.什么是MPI

MPI是一个在平行计算中传递消息的库的标准,由实现人员和使用人员来遵守。目前的实现版本有MPICH2 Argonne National Laboratory实现,他还有好几个派生子项目。

2.安装MPICH2

       使用VC7windows版本的MPICH2

MPICH2 Home Page下载windows版本,是一个msi标准的windows程序安装包。但是它需要dotNet frameworks 1.1,所以要先下载安装dotNet frameworks1.1。假设MPICH2安装在%MPICH2ROOT%目录,下面会有include, lib, bin, examples, jumpshot。将libinclude加入到VC的对应的目录中。examples下是一个例子程序cpi,有c, c++,fortun的源代码。我们将使用这个例子测试。

MPICH2会创建一个服务MPICH2 Process Manager, Argonne National Lab,提供服务的镜像是%MPICH2ROOT%/bin/smpd。这个程序是MPICH2的进程管理器。MPICH2还需要一个帐号来运行。假设创建本地帐号mpiaccount,注意所有参加集群的机器的运行帐号最好一致。运行wmpiregister程序向MPICH2注册这个帐号。可以将%MPICH2ROOT%/bin加入系统的PATH中,方便后面的使用。下面进入%MPICH2ROOT%/examples下执行“mpiexec –n 2 cpi”,即在本地以两个CPU运行cpi程序。运行的过程中你会发现创建了两个cpi进程。表示已经正常工作了。

3.多台机器一起并行

       在要加入集群的机器上安装MPICH2,并创建同样的帐号。在所有的机器上建立一个工作目录,这个目录的结构应该一致(比如都是E:/MPIWORK/)。将要执行的程序拷贝到工作目录下。在一台机器上执行“mpiexec –hosts x C1 C2…  cpi”,其中x是主机的总数,C1C2都是主机的名字。

4Hello world

       让我们开始这个著名的程序。

       首先MPI不是一个自动工具,它是一个Message-Passing Interface的简写,即消息传递接口。想要编写并行程序需要使用MPI库。

       创建一个Hello控制台工程,保证%MPICH2ROOT%/include,和%MPICH2ROOT%/lib加入到VC对应的目录。在工程的编译选项加入/D "MPICH_IGNORE_CXX_SEEK",因为MPI2有一个bug,它定义了和标准C库中一样的宏,所以必须定义这个宏,否则会有编译错误。下在连接选项中加入cxxd.libmpi.lib。下面是Hello world

 

#include <cstdio>

#include "mpi.h"

 

using namespace std;

int main(int argc,char **argv)

{

     int rank ,size;

     MPI::Init(argc,argv);

     size=MPI::COMM_WORLD.Get_size();

     rank=MPI::COMM_WORLD.Get_rank();

 

     printf("Hello world! , I am %d,in %d/n computer", rank, size);

     MPI::Finalize();

}

build之后,将它拷贝到工作目录下,确保每一个集群内的机器都工作目录下都有同样的版本。执行“mpiexec –hosts x C1 C2…  Hello”,会看到参与的机器分别打印出自己的id

5. 传递消息

       MPI并不能自动将你的程序变成一个并行的程序,就像你不使用多线程就不能利用两个CPU的好处一样。你需要适当的分解任务,并且需要在任务之间互相通信协作。

       最常用的是MPI_Send( start, count, datatype, dest, tag, comm ) MPI_Recv(start, count, datatype, source, tag, comm, status)