高性能计算

多机mpi并行配置

2009年12月7日 阅读(1,333)

转载请注明作者:phylips@bmy 出处: http://duanple.blog.163.com/blog/static/70971767200911735313192/

一.mpich安装步骤
#./configure –prefix=/usr/local/mpich-gcc –rsh=/usr/bin/ssh
#make
#make install
其中prefix后面的是安装的目录,安装完成后就可以看到。

(卸载mpi是进入到/usr/local/mpich-gcc/sbin/mpiuninstall.)

如果没有出错,那么说明安装成功,进入/etc,编辑profile文件,添加如下内容:
export MPI_ROOT=/usr/local/mpich-gcc
export PATH=$MPI_ROOT/bin:$PATH
export MANPATH=$MPI_ROOT/man:$MANPATH

保存退出,执行source profile使她生效。

二.多机环境配置
为了简单起见,这里所有的计算机节点都建了一个相同的用户及密码

1.安装ssh sshd 保证相互之间可以互联
在每台机子下进行如下操作:
cd ~ ?//进入home目录
 ssh-keygen -b 1024 -t dsa 这一步是ssh这一方生成了一对密钥,公钥必须放到sshd的那一方,ssh的这一方才能正常访问sshd那一方。
cd .ssh
cp id_dsa.pub pub_key
cp pub_key  /home/duanple
将pub_key 也就是*.pub的文件内容拷贝到服务端也就是sshd的那一方的$HOME/.ssh目录下的authorized_keys文件(它保存了一系列的公钥,新公钥只需要加在该文件的末尾新一行即可)内

chmod 644 authorized_keys

2.打开/etc/hosts文件,加入计算机信息,前面是IP,后面是主机名字,如同这样:222.195.150.203 node2,保存退出。

3.权限设置
设定/etc/hosts.equiv
创建/etc/mpd.conf (root用户)普通用户需要创建 $HOME/.mpd.conf,之后 设置secretword=

修改hostname或者ip,一些涉及到的需要同时更新的文件:
/etc/hostname
/etc/hosts
/etc/hosts.equiv 负责放权的文件

说明:为了能够在多个不同的机器上运行MPI程序,首先需要其它机器对启动MPI程序的机器放权,即允许启动MPI程序的机器访问其它机器。权限的设置主要有两种方法,一种是在其它所有机器的/etc/hosts.equiv文件中加入启动MPI程序的机器名。例如要在node1这台机器上启动MPI进程,而计算过程中要用到node2和node3两台计算机,则需要在node2和node3机器的/etc/hosts.equiv文件中加入如下一行: node1

这样就使得node2和node3都允许node1通过rlogin、rsh等命令进行访问。为了使一台机器能够同时运行多个 node1 如果/etc/hosts.equiv文件不存在,则需要先创建该文件。

设置权限的另外一种方法是通过.rhosts文件来实现。具体的做法是对MPI程序运行过程中要用到的所有计算机,在运行该程序账户的Home目录下创建一个.rhosts文件,并在该文件中标明允许哪些机器的哪些账户进行访问。

例如,在node1、node2和node3机器上都有gary这一账号,若要允许node1机器上的gary账号能够分别对nod node1 gary 为了简便起见,最好在每个机器上都建立相同的账户名,使得MPI程序能够在相同的账户下运行。以上的配置都是基于R系列命令的(包括rlogin、rsh、rexec等),这种配置对于一般应用来说已经足够了。但如果并行计算环境要求有相当高的安全性,则应该考虑用SSH来代替 R系列命令,具体的做法请参考MPICH的相关文档。

4.当通过多个机子运行mpi程序时,碰到问题如何解决?
采用mpicheck命令进行各项测试,找到问题的症结。

运行mpdcheck命令(详细使用参见mpich的doc:/home/duanple/mpich2/doc/installguide)
在一台机子上运行如下命令:
mpdcheck -l 可以检查单机的设置
mpdcheck -f hosts 继续检查
mpdcheck -f hosts -ssh -l可以进行更全面的检查,如果有输出说明有问题,无输出说明无问题。根据问题进行修正。
再在另一台机子上运行这些命令。

另外可以使用mpdcheck 来检查服务端与客户端是否连通:
Do this on m1 and read the output for host and port:
    $ mpdcheck -s  //实际上所指定m1为服务器端进行监听
Do this on m2:
    $ mpdcheck -c host port //实际上m2作为客户端 连接host 的port端口

启动mpd建立一个并行环境。(注意这个步骤所并行执行的基础,不能简单的开启mpd,而是需要把这些节点的mpd组成一个ring,具体开启mpd的步骤如下)
Try running a pair of mpd’s on the two machines. First, on both
machines:
      $ mpdallexit
just to make sure you have no old mpd’s running.
Run mpd on m1 and use the -e option to cause mpd to echo the port
it is using:
      $ mpd -e & //开启第一个mpd进程
Then, run mpd on m2 and cause it to enter the ring at m1:
      $ mpd -h m1 -p the_echoed_port_at_m1 & //开启后续进程,-h后的m1代表头节点的hostname,-p后跟m1的端口号。
      $ mpdtrace -l
The mpdtrace should show both mpds in the ring. If so, you should
be able to run a parallel job:
      $ mpiexec -n 2 hostname
and see both hostnames printed.
也可以这样启动:mpdboot -n 2 -f mpd.hosts

另外mpdtrace -l可以用来查看当前启动的mpd进程。

5.运行测试程序
mpiexec -machinefile hosts -np 2  ./p.out
运行时发现出现如下错误:
failed to access the server here is the output: Traceback (most recent call last): File "/usr/mpich2-install/bin/mpdcheck.py", line 103, in ? sock.connect((argv[argidx+1],int(argv[argidx+2]))) # note double parens File "<string>", line 1, in connect socket.error: (113, ‘No route to host’)
经检查发现所因为有一个节点的防火墙开启了于是导致无法连接,将它的防火墙关闭就可以正常连接了。

#include <stdio.h>
#include <mpi.h>
//#include <VT.h>
int main(int argc,char **argv)
{
    int id,numproc;
    char process_name[MPI_MAX_PROCESSOR_NAME];
    int namelen;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&numproc);
    MPI_Comm_rank(MPI_COMM_WORLD,&id);
    MPI_Get_processor_name(process_name,&namelen);
    fprintf(stdout,"%d of %d in processor:%s\n",id,numproc,process_name);
        fflush(stdout);
    MPI_Finalize();
    return 0;
}

You Might Also Like