全文包含:MPICH2+NPB+ssh免密登录+NFS
文章目录
一、 安装 MPICH2
1.包安装(推荐)
sudo vim /etc/hosts
sudo apt-get update
sudo apt-get install gfortran
sudo apt-get install openmpi-bin openmpi-common libopenmpi-dev
验证是否安装正确
which mpicc
which mpiexec
mpicc --version
创建一个名为mpi_hello的示例测试程序
cd ~
mkdir mpi_program
cd mpi_program
vim mpi_hello.c
创建C语言文件mpi_hello.c,并将以下代码粘贴到文件中:程序在每个MPI
进程中打印“Hello from rank x of y”信息,其中x是进程的排名,y是进程的
总数
#include <mpi/mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
MPI_Init(NULL, NULL);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
printf("Hello from rank %d of %d\n", world_rank,
world_size);
MPI_Finalize();
}
保存并退出文件编辑器,然后编译示例程序
mpicc -o mpi_hello mpi_hello.c
mpirun -np 4 ./mpi_hello
2.源码安装(跳过)
参考教程
MPICH2官网下载,我安装的版本是4.1.2。
按下面命令执行:
tar -xzf mpich-4.1.2.tar.gz
cd mpich-4.1.2/
#文件夹下面是configure.ac,需要autoconf
sudo apt-get update
sudo apt-get install autoconf automake make
autoconf
automake --add-missing
#安装fortran
sudo apt-get install gfortran
#--prefix=/usr/local/mpich3.3.1指定PATH,后续在NPB中要添加这个路径
sudo ./configure --prefix=/usr/local/mpich4.1.2 --disable-fortran
sudo make
sudo make install
#更新环境变量
echo 'export PATH=/usr/local/mpich3.3.1/bin:$PATH' >> ~/.bashrc
#重新加载配置文件
source ~/.bashrc # 重新加载配置文件
#检查是否安装成功
mpiexec --version
#或 which mpicc
二、NPB安装
参考教程1 参考教程2
去官网下载NPB,我下的是3.3.1
wget https://www.nas.nasa.gov/assets/npb/NPB3.3.1.tar.gz
tar -zxvf NPB3.3.1.tar.gz
cd ~/tools/NPB3.3.1/NPB3.3-MPI/config
cp make.def.template make.def
sudo vim make.def
#然后配置NPB,修改make.def的下列信息,其他信息不用修改
32行:MPIF77 = mpif77
39行:FMPI_LIB =
78行:MPICC = mpicc
87行:CMPI_LIB =
以IS为例,编译指令为 make IS(指定哪个程序)、CLASS=B(指定问题
规模)、NPROCS=8(指定运行的处理器个数),注意Node1和Node2上均
需要编译,并保证目录一致
S级:较小,用于快速测试
W级:工作站大小(90年代的工作站;现在可能太小了)
A,B,C级:标准测试问题; 从一个类到下一个类,大小增加约4倍
D,E,F级:大型测试问题; 与之前的每个类相比,大小增加了约16
倍
cd ~/NPB3.3.1/NPB3.3-MPI/
make IS CLASS=A NPROCS=8
单机运行测试
cd bin/
mpirun ~/NPB3.3.1/NPB3.3-MPI/bin/is.A.8
多机运行测试,只需在Node1上执行命令
mpirun --hostfile ~/mpi_program/mpi_config_file
~/NPB3.3.1/NPB3.3-MPI/bin/is.A.
运行
#make <benchmark-name> NPROCS=<number> CLASS=<class> [SUBTYPE=<type>] [VERSION=VEC]
//C类,D类和E类不适用于DT。
//类别E不适用于IS。“VERSION=VEC”选项用于选择BT和LU的向量化版本。
//以IS为例,编译指令为 make IS(指定哪个程序)CLASS=B(指定问题规模)
//NPROCS=8(指定运行的处理器个数)
#问题规模为B,处理器个数为8
cd ~/tools/NPB3.3.1/NPB3.3-MPI
#如果需要重新编译先make clean
make IS CLASS=A NPROCS=8
cd ~/tools/NPB3.3.1/NPB3.3-MPI/bin
#显示详细信息或者直接输入 ./is.A.2 会有简略信息
mpirun -np 2 ./is.A.2
多机运行
运行测试程序
#单点运行
mpirun -np 4 ~/mpich-3.2/examples/cpi
#多点并行
mpiexec -n 8 -hosts 172.16.122.148,localhost ~/tools/mpich-4.1.2/examples/cpi
sudo mpiexec -n 2 -hosts 172.16.122.148,localhost ~/tools/NPB3.3.1/NPB3.3-MPI/bin/is.A.2
或者写成server文件
mpiexec -n 4 -f ~/mpich/servers ~/mpich-3.2/examples/cpi
为什么下面这个不行
mpiexec -n 8 -hosts node12,localhost ~/tools/mpich-4.1.2/examples/cpi
问题:怎么从下图判断出是多机运行还是单机?
三、MPI与NPB整合(这一步可跳过)
1. mpiP安装
mpiP是一个用于MPI应用程序的轻量级、伸缩性良好的MPI profiling库。由于mpiP只收集关于MPI函数的统计信息,因此与跟踪工具相比,它生成的开销和数据要少得多。mpiP捕获的所有信息都是任务本地的。它只在报告生成期间(通常在实验结束时)使用通信来将所有任务的结果合并到一个输出文件中。
https://github.com/LLNL/mpiP/releases/tag/3.5
可以从https://github.com/LLNL/mpiP/releases/tag/3.5下载mpiP的当前版本。本文使用的mpiP版本是3.5。
mpiP配置安装命令如下
cd mpiP-3.5
sudo ./configure --prefix=/usr/local/mpiP-3.5
sudo make
cd ~/tools/NPB3.3.1/NPB3.3-MPI/config
sudo vim make.def
#报错:/usr/bin/ld: 找不到 -liberty
#collect2: error: ld returned 1 exit status,然后我就把下面的-liberty删了,后续有影响再加吧
39行:FMPI_LIB = -L~/tools/mpiP-3.5 -lmpiP -lbfd -liberty -lm -lunwind
87行:CMPI_LIB = -L~/tools/mpiP-3.5 -lmpiP -lbfd -liberty -lm -lunwind
-lmpiP是用来链接mpiP-3.5中的libmpiP.so:,但这里一直报错
./is.A.2: error while loading shared libraries: libmpiP.so: cannot open shared object file: No such file or directory
./is.A.2: error while loading shared libraries: libmpiP.so: cannot open shared object file: No such file or directory
我只能把-lmpiP删除或者写成(就是不用mpiP)
39行:FMPI_LIB =
87行:CMPI_LIB =
https://blog.csdn.net/weixin_43614211/article/details/124073219
四、配置SSH免密通信
mpi需要ssh,参考链接
本文以node1和node2相互免密通信为例。
1. 配置hosts列表
参考链接
主机列表的作用是让集群中的每台服务器彼此之间都知道对方的主机名和IP地址。在分布式集群中,各服务器之间会频繁通信,做数据的同步和负载均衡。
sudo vim /etc/hosts
#将下面内容添加到主机列表/etc/hosts 文件中
#这样ssh时不用输入ssh username@ip,输入ssh username@node12或者ssh node12即可
172.16.122.146 node1
172.16.122.148 node2
2. 安装ssh
sudo apt-get install openssh-server
#安装完成后看看ssh是否active
sudo systemctl status ssh
#如果需要删除ssh环境,可执行
sudo systemctl stop ssh
sudo apt-get --purge remove openssh-server
sudo rm -rf /etc/ssh/
3. 配置免密通信
//所有主机都执行
#启用公钥认证机制
1.sudo vi /etc/ssh/sshd_config
#去掉这一行的注释
2. PubkeyAuthentication yes
#生成秘钥对
3.ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa#一直回车,生成密钥对id_rsa、id_rsa.pub放在 ~/.ssh目录
//在node01中执行
ssh-copy-id node01
ssh-copy-id node02
//在node02中执行
ssh-copy-id node01
ssh-copy-id node02
#测试
ssh node1
ssh node2
五、NFS
NFS(Network File System,网络文件系统):在计算机系统之间共享文件和目录。
它是一种允许远程计算机像访问本地文件一样访问和操作远程文件的协议,从而促进了多台计算机之间的文件共享和协作。
NFS server
sudo apt-get install nfs-kernel-server
# 指定位置创建文件夹作为挂载点
mkdir cloud
sudo vim /etc/exports
#在/etc/exports中添加以下内容
/home/mpiuser/cloud *(rw,sync,no_root_squash,no_subtree_check)
sudo vim /home/mpiuser/cloud *(rw,sync,no_root_squash,no_subtree_check)
sudo exportfs -a
sudo service nfs-kernel-server restart
#查看系统是否成功挂载nfs目录
showmount -e
#关闭防护墙,否则client端挂载时会报错
systemctl stop firewalld
NFS client
sudo apt-get install nfs-common
mkdir cloud
#如果要使用 `mount` 命令挂载 NFS服务器,需要使用 `mount -t nfs` 参数来指定文件系统类型为 NFS。
#mount -t nfs <nfs服务器地址>:<远程共享目录路径> <本地挂载点>
sudo mount -t nfs node11:/home/antl/cloud ~/cloud
df -h
#在文件系统表中创建一个条目,开机自动挂载,避免系统重启时都手动挂载共享目录
sudo vim /etc/fstab
#在文件中添加以下内容
#MPI CLUSTER SETUP
node11:/home/mpiuser/cloud /home/antl/cloud nfs
测试
在NFS服务器端(node1)的共享目录建立一个文件gedit test.c并保存,几秒钟后检查其他节点中是否在共享目录中产生了该文件,若产生则配置成功。
六、分布式集群运行,包含运行前检查工作,如果全部安装完成,需要运行的话可以从这里开始看
1. 检查node1中的nfs-server是否active
sudo systemctl status nfs-server.service
不知道那个exited是啥意思,别的地方都是running
2. 检查node2中的nfs-common是否active
eg:nfs-common.service dead
sudo systemctl status nfs-common.service
sudo systemctl unmask nfs-common.service
sudo rm /lib/systemd/system/nfs-common.service
sudo systemctl daemon-reload
sudo systemctl start nfs-common
sudo systemctl status nfs-common.service
3. 查看挂载
#在node2中运行
df -h
如果出现下图是对的:
否则手动挂载一下:
sudo mount -t nfs node11:/home/antl/cloud ~/cloud
#如果报错:**mount.nfs: Connection timed out**
#执行:
#关闭server端的防护墙
sudo systemctl stop firewalld
4. 将要运行的代码放在共享文件夹中(本文为~/cloud),make后run
#编译
mpicc -o cpi cpi.c
#运行
#mpirun -np 5 --host node11:2,node12:2 ./cpi
mpirun -np 5 -hosts node11,node12 ./cpi
正确:mpirun --host 192.168.10.128:5,192.168.10.132:4 ./cpi
感觉是。etc/hosts配置时 node11,node12出了问题
#或者在多机配置文件mpi_config_file 中指明机群ip与每个机器中的进程。mpi_config_file仅需要在mpirun的主机上,无需在所有主机的目录下装配。
mpirun -n 4 -f ~/mpi_config_file ./cpi
mpirun和mpiexxec有什么区别
$ cat ~/mpi_config_file
172.16.122.146:2
172.16.122.148:2
为什么cat mpi_config_file
node11
node12
不能运行
mpirun前面切记不能加sudo,否则会报错,如图所示:
#删除原来的网关
sudo route del default gw 192.168.10.1
#跃点低优先级高
sudo route add default gw 192.168.10.250 metric 0
#删除原来的网关
sudo route del default gw 192.168.20.1
#跃点低优先级高
sudo route add default gw 192.168.20.250 metric 0
报错
sudo mpirun -np 5 -hosts node11,node12 ./cpi
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Host key verification failed.
[mpiexec@antl] ui_cmd_cb (mpiexec/pmiserv_pmci.c:51): Launch proxy failed.
[mpiexec@antl] HYDT_dmxu_poll_wait_for_event (lib/tools/demux/demux_poll.c:76): callback returned error status
[mpiexec@antl] HYD_pmci_wait_for_completion (mpiexec/pmiserv_pmci.c:181): error waiting for event
[mpiexec@antl] main (mpiexec/mpiexec.c:252): process manager error waiting for completion
解决方案:sudo apt-get install ssh-askpass