敢时髦也写点Blog
MPI 入门(MPICH2 windows版本)
1. 什么是MPI
MPI是一个在平行计算中传递消息的库的标准,由实现人员和使用人员来遵守。目前的实现版本有MPICH2, Argonne National Laboratory实现,他还有好几个派生子项目。
2.安装MPICH2
使用VC7和windows版本的MPICH2。
MPICH2 Home Page下载windows版本,是一个msi标准的windows程序安装包。但是它需要dotNet frameworks 1.1,所以要先下载安装dotNet frameworks1.1。假设MPICH2安装在%MPICH2ROOT%目录,下面会有include, lib, bin, examples, jumpshot。将lib和include加入到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 C 1 C 2… cpi”,其中x是主机的总数,C1,C2都是主机的名字。
4.Hello world
让我们开始这个著名的程序。
首先MPI不是一个自动工具,它是一个Message-Passing Interface的简写,即消息传递接口。想要编写并行程序需要使用MPI库。
创建一个Hello控制台工程,保证%MPICH2ROOT%/include,和%MPICH2ROOT%/lib加入到VC对应的目录。在工程的编译选项加入/D "MPICH_IGNORE_CXX_SEEK",因为MPI2有一个bug,它定义了和标准C库中一样的宏,所以必须定义这个宏,否则会有编译错误。下在连接选项中加入cxxd.lib和mpi.lib。下面是Hello world。
#include<cstdio>
#include"mpi.h"
usingnamespace
intint argc,char
{
int
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 C 1 C 2… Hello”,会看到参与的机器分别打印出自己的id。
5. 传递消息
MPI并不能自动将你的程序变成一个并行的程序,就像你不使用多线程就不能利用两个CPU的好处一样。你需要适当的分解任务,并且需要在任务之间互相通信协作。
最常用的是MPI_Send( start, count, datatype, dest, tag, comm ) 和MPI_Recv(start, count, datatype, source, tag, comm, status)