MPI与OpenMPI和MPICH等的关系

MPI(Message Passing Interface),由其字面意思也可些许看出,是一个信息传递接口。可以理解为是一种独立于语言的信息传递标准。而OpenMPI和MPICH等是对这种标准的具体实现。也就是说,OpenMPI和MPICH这类库是具体用代码实现浏MPI标准。因此我们需要安装OpenMPI或者MPICH去实现我们所学的MPI的信息传递标准。

为了考虑到教程的完整性,所以单独用一篇文章来介绍一下MPI库的安装方法。安装方法千篇一律,网上随手一查就能查到一堆,我本人也写不出什么花样来。若你已经配置好了MPI环境,可以忽略本文,直接跳到下一章去学习。考虑到大部分人在实现并行编程都是在CPU集群上完成,而这些服务器几乎都是使用的Linux系统。因此下文采用Linux来作为讲解,为了使本文看起来稍微有点干货,我尽量在安装步骤中扩展一些我认为Linux初学者有必要知道的东西。相信初学者在用集群安装时会出现各种各样的问题,报一些对于初学者来说难以解决的问题。这对于初学者来说很打击积极性,如果学习的热情被安装时的报错信息消耗殆尽是很可惜的。各位在用集群安装时,因为没有root权限,可能会出现各种各样比如编译器过老,管理员安装的编译器路径地址不知道等问题,这些可能初学者难以解决。用虚拟机学习MPI的学习者可能就会好一些,因为有root权限,所需要的环境都可以自己装。初学者如果遇到安装时的报错解决不了的话,也可以私信或者评论区留言。

MPICH和OpenMPI等是采用MPI标准的通信协议。本文将选择MPICH的安装作为示范,一步一步讲解如何配置MPI的环境。 OpenMPI的按照方法也同理。

一、MPI的下载与安装

在开始安装之前,先检查一下是否已经安装好了相应的编译器。

which gcc 
which gfortran 

当显示了gcc和gfortran的路径,即可进行下一步的安装,若没有相应的编译器,请先安装编译器。如果没有安装gfortran可以使用命令apt-get install gfortran安装。在linux中,which是用来查询环境变量的地址。而这里所指的环境变量,通俗一点讲就是在当前shell中,这些如gcc这一命令是指向哪个文件。比如你安装了两个版本的gcc编译器,你就需要去设置环境变量,告诉系统当你调用gcc的时候你到底想调用哪个版本的gcc,把你想调用的那个gcc的路径和gcc绑定起来。所以,当执行上述命令,得到了编译器地址,就可以进行下一步了。

当检查完编译器之后,去https://www.mpich.org/downloads/ 选择合适的版本下载,对于没有图形界面的服务器,也可使用wget命令下载。 tar命令是解压文件的命令。MPI库通常采用的是源码安装,因此,需要使用cd命令进入到解压后的文件夹中,使用./configure进行安装前的设置与检查,由于我们只需要更改一下安装的路径,因此在--prefix这一参数中,设置你想要安装的路径即可。

在这里./configure出现了no ch4 netmod selected报错,借用下别人的图

根据提示加上 --with-device=ch4:ofi 即可,就是命令变成./configure --with-device=ch4:ofi --prefix=/usr/local/mpich-3.4.2

执行这一行之后,就会开始检查编译环境是否满足,此时报错多半是因为编译器安装的问题或者编译器版本不匹配的问题,一般通过安装最新的编译器能解决。这一步成功完成之后,即可使用make命令去执行编译。该路径下makefile文件已经写好了这些源代码的编译规则,因此输入make即可开始按照makefile的规则对源码进行编译。如果你做的工作和底层语言如Fortran、C或C++之类的,还是有必要学习一下makefile的写法,有助于之后的多文件编译工作。顺便一提,使用Linux学习底层语言是更有好处的,因为Windows初学编程语言通常是使用集成开发环境,在对代码进行编译时通常是一键操作,导致中间的几个过程会被下意识的忽略掉,这将导致一开始适应不了Linux环境下编译文件的命令。当make完成之后,就可以使用make install命令进行安装了。

wget https://www.mpich.org/static/downloads/3.4.2/mpich-3.4.2.tar.gz
tar -zxvf mpich-3.3.2.tar.gz #解压下载的压缩包 
cd mpich-3.3.2 #进入解压后的文件夹内 
./configure --with-device=ch4:ofi  --prefix=/usr/local/mpich-3.4.2
# --prefix这一参数是设置安装的路径,根据需要设置合适的路径即可,但需要记住安装的位置 
make 
make install 

在这里别人因为没有安装Fortran compiler报了其他错误,我这里没有出现这个错误,又去要可以移步Ubuntu 20.04下安装和配置MPI - 知乎 (zhihu.com)

添加环境变量

安装完成后,可以去之前--prefix设置的路径去看一下安装结果。安装好了之后,还需要告诉系统mpi库的路径地址,这样当你调用mpi的命令时,系统才知道你在干什么。在用户的根目录下,有一个.bashrc的文本文件(默认使用的是bash,如果是zsh等自行查阅资料,我在这里避免信息过多导致初学者疑惑)。这个文件可以理解为,每次打开终端时都会加载的启动项。

vim ~/.bashrc

通过vim打开当前用户下所对应的.bashrc文件,在其中加入一行(建议添加在最下面一行)

export PATH="/usr/local/mpich-3.4.2/bin:$PATH"  

保存退出之后 ,使用source这一命令执行一下就把新加的命令执行了。前面说过,.bashrc文件是每次开启终端后的类似加载启动项文件。也就是说,如果你不想手动source来加载的话,也可以通过新打开一个终端让它开启时自动加载。

source ~/.bashrc 
which mpicc 
which mpif90 

命令测试

进入examples文件夹下,里面有hellow.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;
}

一个简单的并行程序,通过命令

mpicc hellow.c -o hellow
mpirun -np 3 ./hellow

没有报错且有正常输出就说一正常。

tips:建议每次使用前which一下,看一下使用的是哪一个版本

  • which mpicc 查看位置信息
  • mpichversion 查看版本信息,出现版本号说明安装成功