器 | 科研计算小能手MPI

775 阅读4分钟

这是我参与更文挑战的第23天,活动详情查看: 更文挑战

一、什么是MPI

MPI is a communication protocol for programming parallel computers. Both point-to-point and collective communication are supported. MPI "is a message-passing application programmer interface, together with protocol and semantic specifications for how its features must behave in any implementation."

根据维基百科介绍,MPI是一个行业间标准的进程通信协议,它是消息传递接口定义,以支持点对点和集体间通信,目前主要用于高性能计算。

1.版本简要

MPI第一个版本MPI-1于1994年问世,在其后的一年内,便有具体的实现产生。后续又陆续的发布了MPI-2,它是MPI-1的超集,目前最新的一版为MPI-3。几个版本具体差异,请参照维基百科en.wikipedia.org/wiki/Messag…

2.通信模型

上面有讲到MPI协议支持点对点和集体间通信,这里的通信一般来说都是进程间通信。一个进程独占一个CPU的核进行运算,是最能让进程发挥最大的计算能力。为什么会这样呢,简单介绍一下计算机的CPU构成。

众所周知,计算机进行运算的硬件设备为中央处理器CPU,影响它计算能力核心有两点,第一个是质量,质量的意思是CPU的运行频率,即计算的快慢,现代计算机一般都是以GHz为指标衡量计算频率,指标越大计算能力越强;第二是数量,数量的意思是CPU核心数,核心数越多,能提供计算的点越多。所以说如果多个进程都在CPU一个核内进行运行,理论上会平分计算力,甚至会造成资源调度引发的资源浪费。

在讲解两种通信模型之前不得不说到MPI的重要概念通讯器(communicator),通讯器定义了一组能够互相发消息的进程。在这组进程中,每个进程会被分配一个序号,称作(rank),进程间显性地通过指定秩来进行通信。

2.1 点对点模型

点对点通信模型里面,一个进程可以通过指定另一个进程的秩以及一个独一无二的消息标签tag)来发送消息给另一个进程,接受者可以选择接受指定标签(tag)的消息或者接受所有的消息,然后根据消息的先后顺序,处理接受到的消息。常用的接口有MPI_SEND,MPI_RECV等。

image-20201203112540941.png

2.2 集体通信模型

大多数情况下,一个进程可能需要跟其它几个进程进行通信。比如主进程想发一个广播给所有的进程。这个时候如果考虑点对点的信息传递会很重复大量的工作,同时可能会导致网络利用率及其低下。MPI提供了集体之间通信的协议满足了这个需求。常用的接口有MPI_bcastMPI_reduce

3.MPI编译器

MPI编译器有很多可用,例如OpenMPI,MPICH,MVAPICH等。考虑到个人非商业使用,需文档详细,OpenMPI是一个极佳的选择,它是一个免费的、开源的MPI实现,兼容MPI-1和MPI-2标准。OpenMPI由开源社区开发维护,支持大多数类型的HPC平台,并具有很高的性能。官网为www.open-mpi.org/

3.1安装方法

基于Linux操作系统(在此使用Centos 7 发行版)的操作的安装使用命令行可完成操作。

#安装open-mpi
$ sudo yum install openmpi-devel
#加载mpi模块
$ module load mpi
#查看mpi的版本
$ mpifort --version
GNU Fortran (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
Copyright (C) 2015 Free Software Foundation, Inc.

如果运行mpifort -- version 能正常显示版本信息,即代表安装成功。

但大多数因为Centos 7 并没有环境支持使用module命令,可能会导致 module load mpi运行时找不到module命令。安装environment-modules即可解决这个问题。安装命令如下:

yum -y install environment-modules
source /usr/share/Module/init/bash
module avail
3.2 基本功能

open-mpi提供了大量的编译器,支持C/C++,Fortran等语言。

image-20201203091643939.png

可以通过上图看到open-mpifortran语言大多数版本都覆盖了,有mpif77mpif90mpifort等。编译fortran程序可使用参照如下命令

 #编译
 mpif90 -o hello hello.f90

上面的指令已经成功编译,现在便要运行程序。在此要用到mpirun命令。

在单机环境下

#-np 指定运行集成个数
mpirun -np 5 a.out 

在集群环境下

#运行语法
# -np 指定进程个数 -hostfile指定集群的主机host地址
mpirun -np N -hostfile <filename> <program>

如果程序本身无错误,至此便可运行成功。