2008年3月5日星期三

Hello MPI

并行计算这门课有一个实验平台,用MPI搭建的。课程还没有讲到,我已经迫不及待地想尝试一下了。虽然我既不会C也不会MPI,但是找本书来弄个Hello
World还是可以的――

首先,登录到实验平台的Linux操作系统上。例如
ssh wangyuantao@166.111.XXX.XXX
按照提示输入密码

然后到自己的目录中创建一个hi.c文件,内容如下:

#include "mpi.h"
#include <stdio.h>
void main(argc, argv)
int argc;
char *argv[];
{
int myid, numprocs;
int namelen;
char p_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Get_processor_name(p_name,&namelen);
fprintf(stderr, "Hello MPI, Process %d of %d on %s\n", myid,
numprocs, p_name);

MPI_Finalize();
}

用途是打印进程号、组大小和节点名称。这个hello小程序没有进程间交互。

这个平台上有两个计算节点,node1和node2。在运行MPI时需要指定节点配置文件hosts,这个文件只有两行:
node1-ib
node2-ib
由于这个网络用infiniBand连接,所以多了-ib这个后缀。

这时就可以登录到计算节点上去编译了。
ssh node1
然后找到对应目录(这个实验平台中,计算节点的home路径被mount到了166.111.XXX.XX的home路径)
编译:
mpicc hi.c -o hi
得到可执行文件hi

最后启动运行就可以了
mpirun -machinefile hosts -np 6 hi
其中-machinefile指定了计算节点列表,任务被按照默认的方式负载均衡到各个计算节点。
-np指定了开启几个进程,也就是并行的度。

运行结果都在命令行上打印出来了
Hello MPI, Process 0 of 6 on node1-ib.test
Hello MPI, Process 2 of 6 on node1-ib.test
Hello MPI, Process 4 of 6 on node1-ib.test
Hello MPI, Process 1 of 6 on node2-ib.test
Hello MPI, Process 3 of 6 on node2-ib.test
Hello MPI, Process 5 of 6 on node2-ib.test


P.S.
如果在本机上编辑源代码,然后上传到服务器上,可以用scp命令
scp hi.c wangyuantao@166.111.XXX.XXX:2007211XXX/helloworld/
然后按照提示提供密码,文件就传上去了。

如果不相信程序真的是在两个计算节点执行的,可以打印时间戳,一般计算节点的物理时钟很难精确同步的,也没必要,逻辑时钟正确就行了。
time_t rawtime;
struct tm *timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
fprintf(stdout, "Hello MPI, Process %d of %d on %s @ %s\n",
myid, numprocs, p_name, asctime(timeinfo));
输出结果:
Hello MPI, Process 0 of 3 on node1-ib.test @ Wed Mar 5 16:33:02 2008
Hello MPI, Process 1 of 3 on node2-ib.test @ Wed Mar 5 16:34:38 2008
Hello MPI, Process 2 of 3 on node1-ib.test @ Wed Mar 5 16:33:02 2008

发现node2的时钟比node1的时钟快了一分多钟,呵呵~

没有评论: