Logo
Section 1 / 5

MPI - 消息传递接口

了解 MPI 消息传递接口的历史、编程模型、优势与基本使用方法

导入

MPI - 消息传递接口

了解 MPI 消息传递接口的历史、编程模型、优势与基本使用方法

消息传递接口(MPI)是一种标准化且可移植的消息传递系统,定义了在 C、C++ 和 Fortran 中编写可移植消息传递程序时广泛使用的库函数的核心语法和语义。

历史

在20世纪90年代之前,为不同计算架构编写并行应用程序是一项困难且繁琐的任务。当时虽然存在许多有助于构建并行应用的库,但并没有一种被广泛接受的标准方法。一小群研究人员在奥地利发起讨论,并举办了关于“分布式内存环境中的消息传递标准”的研讨会。与会者探讨了标准消息传递接口所需的基本特性,并成立了工作组继续推进标准化进程,于1992年11月提出了初步草案提案——MPI1。在首次实现后,MPI得到广泛应用,并持续成为编写消息传递应用程序的事实标准。

MPI发展时间线:

  • 1994:MPI-1(规范,非严格意义上的库)
  • 1996:MPI-2(引入部分扩展功能)
  • 2012:MPI-3(进一步扩展功能,移除 C++ 绑定)

编程模型

  • 分布式编程模型,也属于数据并行模型
  • 硬件平台:分布式、共享内存及混合型
  • 并行性是显式的。程序员需自行实现所有并行结构。

运行并行程序的任务数量是静态的。在运行时无法动态创建新任务。不过,MPI-2对此问题进行了改进。

MPI 的优势

  • 可移植性:当将应用程序迁移到支持(且符合)MPI标准的不同平台时,无需修改源代码。

  • 标准化:MPI是唯一可被视为标准的消息传递库。它几乎被所有高性能计算(HPC)平台支持。实际上,它已取代了所有早期的消息传递库。

  • 功能丰富:仅 MPI-1 就定义了超过115个函数。

  • 可用性:存在多种实现版本,包括厂商提供和开源免费版本(见下文)。

如何获取 MPI?

你的机构 HPC 集群通常已安装某种形式的 MPI,可能包括但不限于:

  • Open MPI
  • Intel MPI
  • MPICH2
  • SGI 的 MPT
  • 等等

在运行包含 MPI 的代码前,需要加载相应的模块(例如:module load openmpi)。若加载成功,可输入 mpiexec --version,应看到类似如下输出:

1$ mpiexec --version 2mpiexec (OpenRTE) 1.8.8 3 4Report bugs to http://www.open-mpi.org/community/help/

MPI 头文件:

  • C/C++:#include <mpi.h>
  • Fortran:include 'mpif.h'

编译器封装工具:

  • Intel:(icc -lmpi)和(ifort -lmpi)
  • GNU:mpicc、mpif77、mpif90、mpicxx

并行编程 - OpenMP

MPI 程序结构