现在有2台机器,希望可以尝试一下在多台机器上跑MPI的感觉,所以跑之前就得配置,先参考网址:
https://www.cnblogs.com/awy-blog/p/3402949.html:
1. 配置自动ssh登录
这里主要是要各个机器之间能无密码访问,主要用到的就是SSH,因此需要一些设置。
首先,我们需要导出各个节点的公钥和私钥:
$ ssh-keygen -t rsa
在运行过程中,会提示你输入这个输入那个,不用管那么多,直接回车就完了。等运行结束后,进入.ssh目录,你会看到公钥和私钥文件;
$ cd ~/.ssh $ ls id_rsa id_rsa.pub
其中id_rsa就是私钥,id_rsa.pub就是公钥,现在我们需要把各个节点上的公钥都集中发送到一个节点上,来制作授权文件(authorized_keys).
注意:在两台机器必须安装ssh(sudo apt-get install ssh openssh-server)而且必须设置root密码(sudo passwd root),才能远程登录
$ scp ~/.ssh/id_rsa.pub node1:~/.ssh/1.pub
在将 node2 的公钥文件拷贝到 node1 后,在node1-ubuntu进行如下处理,制作好文件 authorized_keys :
$ cp ~/.ssh/id_rsa.pub authorized_keys $ cat ~/.ssh/1.pub >> authorized_keys
在node1 上制作好的authorized_keys拷贝到node2上:(node1使用scp)
$ scp ~/.ssh/authorized_keys node2:~/.ssh/
要想让这两台机器无密码登录,所以我们需要更改一下必要的文件的权限(所有节点都要更改):其实只要保证authorized_keys的文件权限为600或者644
$ chmod 755 ~ $ chmod 755 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/id_rsa $ chmod 644 ~/.ssh/id_rsa.pub
至此,SSH配置就完成了。下面检验一下:
在一个主机上面SSH另一个主机 ( 不需要账号和密码 ) :
$ ssh node1
现在2台机器已经可以自由的SSH登陆了!
2. MPI运行环境配置
执行了configure命令之后,
./configure --prefix=/home/<USERNAME>/openmpi 2>&1 | tee install1.log
提示:
Open MPI configuration: ----------------------- Version: 3.0.1 Build MPI C bindings: yes Build MPI C++ bindings (deprecated): no Build MPI Fortran bindings: no MPI Build Java bindings (experimental): no Build Open SHMEM support: yes Debug build: no Platform file: (none) Miscellaneous ----------------------- CUDA support: no Transports ----------------------- Cray uGNI (Gemini/Aries): no Intel Omnipath (PSM2): no Intel SCIF: no Intel TrueScale (PSM): no Mellanox MXM: no Open UCX: no OpenFabrics Libfabric: no OpenFabrics Verbs: no Portals4: no Shared memory/copy in+copy out: yes Shared memory/Linux CMA: yes Shared memory/Linux KNEM: no Shared memory/XPMEM: no TCP: yes Resource Managers ----------------------- Cray Alps: no Grid Engine: no LSF: no Moab: no Slurm: yes ssh/rsh: yes Torque: no
这里可以看到我们支持的通信协议和资源管理器支持只ssh
编译和安装的命令:
make all 2>&1 | tee make.log make install 2>&1 | tee install2.log
出来一堆乱七八糟的,没眼看,然后找到安装目录下的 bin, 里面有很多编译器和可执行程序:
使用 mpicc 编译出可执行程序, 再使用 mpirun 去运行,就可以看到对应的输出。
正常运行后,这步骤就完成了!
3. 并行运行:
用vim编辑一个文件命名为hosts:如果你想在一个节点上运行多个进程,那么hostfile 可以使用 "slots" 属性。如果没有指定"slots",那么将假设其数目为1.
node1 node2
或者
node1-ubuntu slots=4 node2-ubuntu slots=2
让两个节点并行运行例子程序,如下所示:
$ mpiexec -hostfile hosts -np 8 ./Test
如果运行正常,就会在运行该命令的机器上有一些显示,如果host列表中的机器的 相同路径下 没有这个文件的话,会报错:
$ ~/OpenMpi/bin/mpiexec -hostfile hosts -np 2 ~/TestA -------------------------------------------------------------------------- mpiexec was unable to launch the specified application as it could not access or execute an executable: Executable: /home/xxxxx/TestA Node: localhost while attempting to start process rank 0. --------------------------------------------------------------------------
就是:
1. 多台主机下 相同路径 下的 可执行程序命名相同
2. 开启进程数不要太多,以免超出上限,可参考 OpenMPI运行问题:enough slots available in the system
接下来,我发现,2台机器上的每个进程,但是 printf 输出的信息都只在一台机器上,这是为什么呢?——按照每台机器分别运行一个进程的话,应该打印在自身的控制台上才对呀?
后来通过测试,发现标准输出确实是只打印在运行命令的那台机器的控制台上。
而且只要可执行程序名称相同就可以,源代码是可以不一样的。(当然,最好还是一样啦,我这里弄成不一样是为了测试确实在2台机器上跑了)
机器一执行程序A: 输出固定数字 11
机器二执行程序B(生成源代码仅仅只有一个 printf 语句是不同的): 输出固定数字 22
给机器一划分一个进程,机器二也是一个进程,果然每次会输出11,22 或者 22,11 ——说明确实在2台机器上分别跑了。
也就是说,我们这个 MPI 集群其实已经搭建好了,接下来更深入的机理我后续会尽力去理清楚。