【光交换平台搭建】一、分布式环境搭建——MPI多机配置及NPB使用安装

全文包含: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值