绪论:MPI并行运算的实现原理是将多台虚拟机通过nfs共享文件联系在一起,通过在共享目录里创建编译mpi程序,来实现在所有虚拟机内都有mpi的可执行文件。(本人配置环境是在ubuntu系统下进行的)
1.创建ssh信任连接,实现免密钥互相连接
1.在每个虚拟机节点上都生成自己的ssh公钥,使用ssh-keygen命令实现。
2.检查公钥是否生成成功,使用ls ~/.ssh命令,查看到有id_rsa和id_rsa.pub就说明生成成功
3.复制公钥,在每个虚拟机节点中都复制其他所有节点的公钥,使用ssh-copy-id user@ip命令,user就是登录虚拟机的用户名,ip就是其他需要被复制公钥的节点的ip。注意:在复制公钥之前要确保被复制的节点的公钥是生成成功的。(如果提前配置了hosts文件,可以将ip替换成@加主机名)
4.配置hosts文件,将每个节点的hosts文件都添加其他节点的信息(ip和主机名),hosts文件的绝对路径为/etc/hosts。
5.结果验证:对每个节点执行:(这里我只验证一个节点作为实例)
ssh node01命令(node01为要登陆的节点的主机名,必须配置好hosts文件,不然只能使用目标节点的ip)
2.安装MPICH 3.4
下载链接:https://www.mpich.org/static/downloads/3.4/mpich-3.4.tar.gz
1.解压缩文件包
1.1获取mpich压缩包,wget https://www.mpich.org/static/downloads/3.4/mpich-3.4.tar.gz
1.2通过tar工具解压压缩包,使用sudo tar -zxvf mpich-3.4.tar.gz命令
2.创建安装目录mpich,使用sudo mkdir /home/jsj17039/mpich命令(后面为创建的文件的位置,即绝对路经)
3.进入mpich的解压目录,cd mpich-3.4
4.设置安装目录
4.1.配置gcc环境,下载gcc,sudo apt-get install gcc。(如果下载失败就更新数据源,使用sudo apt-get update命令)
4.2.设置mpich的安装目录
sudo ./configure --prefix=/home/jsj17039/mpich --with-device=ch4:ofi --disable-fortran --disable-cxx 2>&1 | tee c.txt
在configure --prefix=后面的目录就是之前创建的mpich安装目录的绝对路径,配置成功出现completed单词。
5.make编译
5.1.在make编译之前没下载make就先通过sudo apt-get install make来下载make
5.1.进行make编译,sudo make(此处大概要等十几分钟),如果编译失败就再次设置一次mpich的安装目录。
6.安装,sudo make install
7.退回到root目录,cd ~
8.通过编译 .bashrc文件修改环境变量, sudo vim .bashrc进入.bashrc文件中
添加内容为:(最好在最后添加)
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
PATH="$PATH:/home/jsj17039/mpich"(自己的mpich安装目录的绝对路径)
#Source global definitions
if [ -f /etc/bashrc ]; then
./etc/bashrc
fi
9.测试环境变量设置是否配置成功
sudo source ~/.bashrc
sudo which mpicc
sudo which mpiexec
sudo which mpirun
10.修改/etc/mpd.conf文件,内容为secretword=myword
sudo vim /etc/mpd.conf
修改文件的读写权限sudo chmod 600 /etc/mpd.conf
11.创建主机名称集合文件/root/mpd.hosts
sudo vim /root/mpd.hosts
文件内容为:
node01
node02
node03
node04
3.配置nfs(nfs系统可以实现文件之间的共享)
1.选择一个节点作为主节点,在主节点和其他节点都下载安装NFS程序
sudo apt-get install nfs-kernel-server
2.配置nfs和fslock随系统启动而启动
sudo systemctl enable nfs-server
sudo systemctl enable rpcbind
3.重启nfs服务,sudo systemctl restart nfs-server
sudo systemctl restart rpcbind
4.创建共享文件home,并修改其文件权限,注意要区别这个文件和系统本身的home文件的区别
sudo mkdir home(创建文件)
sudo chmod 777 home(修改文件权限为所有人都有读写修改和执行的权限)
5.编辑文件/etc/exports,在其中加入:
/home/jsj17039/home 172.17.32.229/24(rw,async,no_root_squash,no_subtree_check)
/home/jsj17039/mpich 172.17.32.229/24(rw,async,no_root_squash,no_subtree_check)
注意:jsj17039为我的用户名,请修改为自己登录linux的用户的用户名,home文件为刚才创建的共享文件home。mipch就是安装的mpich-3.4的安装目录
修改完成之后执行sudo exportfs -r 命令使文件配置生效。
6.检查当前的挂载文件是否设置成功
sudo shoemount -e(服务机的ip)
便完成了共享文件的输出。
7.配置其他几个节点,首先登录到其他客户机的节点,在/etc/fstab文件中加入:
node01:/home/jsj17039/home /home/jsj17039/home nfs defaults 0 0
node01: /home/jsj17039/mpich /home/jsj17039/mpich nfs defaults 0 0
注意:node01为主节点即服务机的主机名(可以使用主节点的IP代替),后面的目录为主节点的共享目录(之前配置好的主节点共享目录)
8.运行挂载命令实现挂载,sudo mount -a,完成之后可以通过在每个子节点上用 df 命令来验证挂载是否成功,返回结果如下:
出现你在主节点配置的共享文件挂载点就说明挂载成功。
4.环境测试
/*hello.c*/
#include <stdio.h>
#include "mpi.h"
int main( int argc, char *argv[] )
{
int rank;
int size;
MPI_Init( 0, 0 );
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
printf( "Hello world from process %d of %d\n", rank, size );
MPI_Finalize();
return 0;
}
1.进入共享文件夹home中创建一个 .c 文件,将代码粘贴进去。
cd /home/jsj17039/home(进入共享文件夹)
sudo touch hello.c(创建文件)
2.将创建好的文件进行编译
sudo mipcc /home/jsj17039/home/hello.c -o /home/jsj17039/home/hello
生成可执行文件hello
使用sudo mpirun -n 4 -f mpd.hosts /home/jsj17039/home/hello运行(-n 后面的是开启几个进程, -f是显示运行的节点,mpd.hoost文件就是之前创建的主机名集合文件)
成功运行之后环境就配置完成了。
(注:能力有限,有错误可以指出。)