在之前的文中(Linux下mpi环境配置与执行步骤(Ubuntu为例)(http://www.linuxdiyf.com/linux/15851.html)),有讨论过如何使用MPI在两个不同的机器上执行程序,在那篇文章中使用了超级用户权限。不幸的是,有些情况下,我们不能拥有操作系统的超级用户权限,导致我们不能修改除用户目录以外的目录,因此写这篇博文讨论如何使用普通用户来实现mpi程序的编译和双机器执行。如果知道了如果双机器执行,多机器道理是相通的。
此文针对没有多少linux经验的读者,只要你会打开终端,这个问题可以被很好的解决。
前提
假设有两台机器,两台机器的主机名称分别为A、B,并且知道两台机器的IP(如果你不知道,请咨询管理员),假设A机器的IP为192.168.1.5,机器B的ip为192.168.1.6;
假设在两台机器上有同一个用户名,为讲述方便,暂时假设这个用户名为demo;
假设两台机器上安装了完全相同的mpi版本。
不满足假设条件,请绕行。
步骤
完成无需超级用户mpi程序的编译和执行,分以下几步:
1、设置两台机器上PATH,使得在两台机器上分别可以执行mpicc --version命令。
2、设置两台机器相互之间可以免密码登陆。
3、执行自己的程序
1、设置两台机器上的PATH
假设你现在在A机器上,使用的是demo账户。
打开终端(Terminal),执行如下命令:
mpicc --version
如果上面的命令得到类似如下结果,直接可以去第2步:
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
如果得到类似如下结果,则继续。
mpicc: command not found
打开终端,执行如下命令
echo "export PATH=`locate mpicc | grep -v '^/home/' | grep -E '/mpicc$' | sed 's/\/mpicc$//'`:$PATH" >> ~/.bashrc
关闭终端,打开一个新的终端,再执行mpicc --version看看结果是否正确,如果还是不正确,这里就暂时不写此种情况下的解决方案了(穷尽所有情况太麻烦了)。
执行如下命令来登陆B机器(前提中假设了B机器的IP为192.168.1.6),在提示输入密码的时候,输入用户的密码,因为我们假设用的是demo用户,你此时要输入的是demo的密码。注意密码并不显示,输入完成后,直接敲击回车即可。
ssh demo@192.168.1.6
如果成功登陆,执行如下命令:
echo "export PATH=`locate mpicc | grep -v '^/home/' | grep -E '/mpicc$' | sed 's/\/mpicc$//'`:$PATH" >> ~/.bashrc
然后执行exit命令退出机器B。
2、设置两台机器之间相互无密码登陆。
仍然假设现在用的是机器A(IP为192.168.1.5),打开终端,执行如下命令
ssh-keygen -t rsa
上面的命令在执行的时候可能要等待你的输入,不要输入任何内容,直接敲击回车即可。
执行如下命令:
ssh demo@192.168.1.6 mkdir -p .ssh
执行上述命令后,会等待你输入demo在机器B(假设的IP为192.168.1.6)上的密码,输入密码后,敲击回车。
执行如下命令:
cat .ssh/id_rsa.pub | ssh demo@192.168.1.6 'cat >> .ssh/authorized_keys'
执行如下命令,以登陆B机器:
ssh demo@192.168.1.6
继续执行如下命令:
ssh-keygen -t rsa
遇到让输入yes或者no的地方是如yes或者y。遇到其他情况的等待输入,一律敲击回车。
cat .ssh/id_rsa.pub | ssh demo@192.168.1.5 'cat >> .ssh/authorized_keys'
最后执行如下命令,以推出机器B
exit
完成上面的命令后,就可以实现demo用户在两个机器之间无密码相互登陆了。
3、执行自己的程序
仍然假设你在A机器上,ip的相关假设继续保持。
将程序拷贝到A机器上,对于没有linux经验的读者,请特别注意你拷贝的程序在哪个目录下,如果你不能在终端下找到自己的程序,那么这一切你都白做了。
假设你的程序拷贝到了A机器的/home/demo/目录下,那么你打开终端之后,执行 cd ~/ 即可进入这个目录。
在终端中进入源代码目录后,如果你的程序有Makefile,直接执行make命令即可(一般人写的makefile,这样执行会产生可执行文件的,如果不是一般人写的,请咨询写makefile的人)。
由于我们使用的两个机器是独立的,他们之间没有共享磁盘,你若要使用mpi在两个机器上执行,你必须将在A机器上生成的可执行程序拷贝到B机器上。如果你不了解mpi的执行方式,请保证在两个机器上的可执行程序存放在同一个目录下。
为方便,你可以把程序放到用户根目录(~/ 就是用户根目录),然后再拷贝到B机器上。
拷贝程序的命令如下(假设你的程序叫main.exe)
scp ~/main.exe demo@192.168.1.6:~/
下面你要新建一个文本文件,这个文本文件第一行写A机器的IP,第二行写B机器的IP。文件名随意,最好使用英文。
我门假设的A、B两个机器的IP分别是192.168.1.5和 192.168.1.6,所以我们的文件中可以这样写
192.168.1.5
192.168.1.6
假设我门命名这个文件为hosts,并且保存在~/目录下,那么我门就可以打开终端,启动我们的程序了。
cd ~/
mpiexec -f ./hosts -n 2 ./main.exe
结束语
如果你是linux新手(不知道怎么使用终端的都是新手),一定要严格执行每一个命令,按照说明一步步执行。注意命令中的下划线,短线,英文点 .,大小写字母,/,~等。这篇文章暂时写完了,剩下的就是祝你好运了。
在Red Hat 5(AS 5)上配置多节点MPI互联:http://www.linuxdiyf.com/linux/8728.html
Ubuntu下搭建MPI并行计算环境:http://www.linuxdiyf.com/linux/1805.html