基于IB网卡(Infiniband)OpenMPI集群搭建(上)


最近做的一个项目,需要基于基于IB网卡(Infiniband)OpenMPI集群搭建,自己折腾三四天才搞定,这篇文章主要是做个总结。

一、准备工作

实验设备:两台塔式服务器
操作系统:Ubuntu16.04 STL
IP配置
10.0.0.1 public-System-Product-Name
10.0.0.2 seismic-2
相关软件:IB网卡驱动(驱动安装方式详见这篇文章) OpenMPI

二、在每个节点安装OpenMPI

这里为了方便,我们采用apt-get的方式安装(前提是所有节点必须同一个版本的系统,同一个软件源),这样才不会安装不同版本的Openmpi,为后续实验带来麻烦,当然读者也可以去官网下载好软件包,在各个节点使用同一个软件包解压然后make编译进行安装,具体可以参考我的这篇文章,里面涉及如何安装和解决安装过程中可能的问题。
1、在每个节点上都打开终端运行下面的指令

sudo apt-get install openmpi-bin openmpi-doc libopenmpi-dev #每个节点都运行

2、测试是否成功安装

mpicc -v #测试mpicc

如果弹出如下图所示则代表安装成功!
在这里插入图片描述

三、实现各节点SSH免密登录

3.1 网络环境配置

分别配置两台机器的hosts文件,在此之前先通过ifconfig命令查看两台机器的IP地址,我的IP地址为:
seismic-2:10.0.0.2
public-System-Product-Name:10.0.0.1
然后修改hosts文件:

sudo gedit /etc/hosts

将下面两行写入hosts文件中

10.0.0.1 public-System-Product-Name
10.0.0.2 seismic-2

此时,两个节点间应该可以互相ping通

3.2 SSH免密登录

第一步:在本地机器上使用ssh-keygen产生公钥私钥对

ssh-keygen

第二步:用ssh-copy-id将公钥复制到远程机器中

ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host

第三步:登录到远程机器不用输入密码

ssh remote-host

注意:
(1)每个节点都要操作这些步骤
(2)不仅要能免密登录其它节点,而且还要免密登录自己

四、建立和挂载NFS共享目录

1、在所有节点中建立相同路径下的相同目录:

sudo mkdir /home/mpi_share

2、在所有节点安装NFS

sudo apt-get install nfs-kernel-server

3、在所有节点配置NFS服务器

sudo gedit /etc/exports

打开文件后,在文件的最后附件上所有同步的客户端的ip和权限,如下:

/home/mpi_share 10.0.0.1 (rw,sync,no_root_squash,no_subtree_check)
/home/mpi_share 10.0.0.2 (rw,sync,no_root_squash,no_subtree_check)

其中/home/mpi_share是共享目录,ip地址是所有的客户端(其它节点)的地址,包括本机的,后面括号中的是权限,具体含义可上网查阅(rw即读写权限)。
4、在其中一个节点启动NFS服务器

sudo /etc/init.d/nfs-kernel-server restart

5、在其余节点挂载NFS服务器

sudo mount -t nfs 10.0.0.2:/home/mpi_share /home/mpi_share
  • 如果想开机自动挂载:把上述指令sudo mount -t nfs 10.0.0.2:/home/mpi_share /home/mpi_share 写到 /etc/rc.local 文件中)。
  • 如果想要卸载共享文件夹:使用sudo umount -lf /home/mpi_share 卸载。
  • 注意是/home/mpi_share不是/home/mpi_share/ 没有最后的斜杠。

6、测试NFS
在NFS服务器端的共享目录建立一个文件sudo gedit test.c并保存,几秒钟后检查其他节点中是否在共享目录中产生了该文件,若产生则配置成功。

五、集群环境执行MPI程序

我们在共享文件夹里添加一个MPI代码(cpi.c)代码和配置文件hostfile如下:
1. 编写mpi代码(cpi.c)

sudo gedit /home/mpi_share/cpi.c

<<cpi.c>>

#include "mpi.h"
#include <stdio.h>
#include <math.h>

double f(double);

double f(double a)
{
    return (4.0 / (1.0 + a * a));
}

int main(int argc, char *argv[])
{
    int n, myid, numprocs, i;
    double PI25DT = 3.141592653589793238462643;
    double mypi, pi, h, sum, x;
    double startwtime = 0.0, endwtime;
    int namelen;
    char processor_name[MPI_MAX_PROCESSOR_NAME];

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    MPI_Get_processor_name(processor_name, &namelen);

    fprintf(stdout, "Process %d of %d is on %s\n", myid, numprocs, processor_name);
    fflush(stdout);

    n = 1000000000;  /* default # of rectangles */
    if (myid == 0)
        startwtime = MPI_Wtime();

    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

    h = 1.0 / (double) n;
    sum = 0.0;
    /* A slightly better approach starts from large i and works back */
    for (i = myid + 1; i <= n; i += numprocs) {
        x = h * ((double) i - 0.5);
        sum += f(x);
    }
    mypi = h * sum;

    MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

    if (myid == 0) {
        endwtime = MPI_Wtime();
        printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT));
        printf("wall clock time = %f\n", endwtime - startwtime);
        fflush(stdout);
    }

    MPI_Finalize();
    return 0;
}

2. 编写hostfile配置文件

sudo gedit /home/mpi_share/hostfile 

<< hostfile >>

public-System-Product-Name slots=4
seismic-2 slots=4

3. 编译并运行MPI程序

cd /home/mpi_share/        #进入共享目录
mpicc cpi.c -o cpi            #编译cpi.c代码为cpi
mpirun -n 8 -hostfile hostfile ./cpi          #执行cpi

运行结果如下,我们发现两个节点都各启动了四个进程
cpi运行图

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲸落寰宇

小编会不断努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值