一、环境介绍
VMWare:16.1.2 build-17966106
Ubuntu:ubuntu-22.04.4-desktop-amd64
MPICH:4.0
二、MPI安装
2.1虚拟机安装
此处请参考网上资料。值得注意的是,需要将每台主机的用户名设置统一,否则会产生不必要的麻烦。推荐安装一台完成后,直接克隆剩余节点机器。笔者本次使用master作为主节点(程序执行),node1、node2作为子节点(辅助)。
2.2别名配置
分别查看每台节点本地ip
ifconfig
分别更改别名
sudo vim /etc/hosts

2.3 SSH安装
分别是安装、启动、开机自启
sudo apt install ssh
sudo systemctl start ssh
sudo systemctl enable ssh

2.4 SSH免密配置
生成私钥和公钥(连按三次回车)
ssh-keygen -t rsa

将公钥发送给指定节点主机
方法一:
ssh-copy-id username@host
方法二:
在每台节点机器上执行,也就是将本地的公钥文件id_rsa传输给node1,并存储在/.ssh/以node2_id_rsa命名。
若有多台机器,请给其他机器都发送一次。
scp ~/.ssh/id_rsa.pub username@node1:~/.ssh/node2_id_rsa.pub
例如:
master主机给node1发送:
scp ~/.ssh/id_rsa.pub byl@node1:~/.ssh/master_id_rsa.pub
master主机给node2发送:
scp ~/.ssh/id_rsa.pub byl@node2:~/.ssh/master_id_rsa.pub
发送完成后,在node1、node2执行
cat ~/.ssh/nmasteer_id_rsa.pub >> ~/.ssh/authorized_keys
这样,node1、node2就可以免密连接master主机。同理,node1、node2操作一样。

此时,理论上在naster命令行执行
ssh node1
能够免密连接

注:此处建议每台机器都相互连接一次,避免不必要的麻烦。
2.5 MPI安装
sudo apt-get update
sudo apt-get upgrate
sudo apt install mpich
2.6 MPI安装验证
which mpirun
mpirun --version
三、测试
样例程序hello.cpp
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
printf("Hello world from processor %s, rank %d out of %d processors\n", processor_name, world_rank, world_size);
MPI_Finalize();
}
样例配置文件conf:master运行34线程,node1、node2运行33个
master:34
node1:33
node2:33
将文件放在desktop上,编译
mpic++ hello.cpp -o hello
单机测试,运行十个线程
mpirun -n 10 ./hello

集群测试:
利用xshell和xftp传输文件到各个节点,注意文件路径一致。

master主机执行:100线程,使用conf配置文件,运行hello程序
mpirun -n 100 -f conf ./hello
完毕。
常见问题:
1、为什么ssh node1连接失败
答:请注意/etc/hosts文件是否更改成功,ip地址是否对应正确,目标主机ssh是否开启
2、为什么单机能运行,但是集群无法运行
答:请给节点文件权限,chmod 777 hello
3、HYDU_sock_connect (utils/sock/sock.c:141): unable to connect from "byl-virtual-machine" to "byl-virtual-machine" (Connection refused)
答:修改主机名为对应的节点名称即可。将/etc/hostname和/etc/hosts修改。

