导入
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