消息传递接口标准(MPI)是基于MPI论坛共识的消息传递库标准,该论坛有40多个参与组织,包括供应商、研究人员、软件库开发人员和用户。消息传递接口的目标是建立一个可移植、高效和灵活的消息传递标准,该标准将广泛用于编写消息传递程序。因此,MPI是第一个 标准化 、独立于供应商的消息传递库。使用MPI开发消息传递软件的优势与可移植性、效率和灵活性的设计目标紧密匹配。MPI不是IEEE或ISO标准,但实际上已成为在HPC平台上编写消息传递程序的“行业标准”。
本教程的目标是教那些不熟悉MPI的人如何根据MPI标准开发和运行并行程序。本文介绍的主要主题侧重于对新MPI程序员最有用的主题。本教程首先介绍MPI入门的介绍、背景和基本 信息 。接下来详细介绍对新MPI程序员最有用的MPI例程,包括MPI环境管理、点对点通信和集体通信例程。提供了大量的C和Fortran示例,以及一个实验室练习。
教程材料还包括更高级的主题,如派生数据类型、组和通信器管理例程以及虚拟拓扑。然而,这些并不是在讲座中实际呈现的,而是为那些感兴趣的人提供“进一步阅读”。
级别/先决条件:本教程非常适合那些不熟悉MPI并行编程的人。对C或Fortran并行编程有基本了解。对于那些一般不熟悉并行编程的人来说,EC3500:并行计算简介中包含的材料会很有帮助。
接口规范
M P I=消息传递接口
MPI是面向消息传递库的开发人员和用户的规范。就其本身而言,它不是一个库,而是一个这样一个库应该是什么的规范。
MPI主要解决消息传递并行编程模型:数据通过每个进程上的协作操作从一个进程的地址空间移动到另一个进程的地址空间。
简单地说,消息传递接口的目标是为编写消息传递程序提供广泛使用的标准。该接口试图:
MPI标准经过了多次修订,最新版本是MPI-3.x
已为C和Fortran90语言绑定定义了接口规范:
实际的MPI库实现在支持MPI标准的版本和功能方面有所不同。开发人员/用户需要意识到这一点。
最初,MPI是为 分布式 内存体系结构设计的,当时(20世纪80年代-90年代初)分布式内存体系结构正变得越来越流行。

随着体系结构趋势的改变,共享内存SMP通过网络进行组合,从而创建混合分布式内存/共享内存系统。
MPI实现者调整了他们的库以无缝地处理这两种类型的底层内存体系结构。他们还调整/开发了处理不同互连和协议的方法。

如今,MPI几乎可以在任何硬件平台上运行:
然而,不管机器的底层物理架构如何,编程模型显然仍然是一个分布式内存模型。
所有并行性都是显式的:程序员负责正确识别并行性并使用MPI构造实现并行算法。
标准化—MPI是唯一可以被视为标准的消息传递库。几乎所有HPC平台都支持它。实际上,它已经取代了以前所有的消息传递库。
可移植性—当您将应用程序移植到支持(并符合)MPI标准的不同平台时,几乎不需要修改源代码。
性能机会-供应商实施应能够利用本机硬件功能优化性能。任何实现都可以自由开发优化算法。
功能性-MPI-3中定义了430多个例程,其中包括MPI-2和MPI-1中的大多数例程。
注意:大多数MPI程序可以使用十几个或更少的例程编写
可用性—有多种实现,包括供应商和公共域。
有关MPI标准所有版本的文档,请访问:http://www.mpi-forum.org/docs/
尽管MPI编程接口已经标准化,但实际的库实现将有所不同。
例如,许多人只考虑以下几点:
LC系统上的MPI库实现各不相同,构建它们的编译器也不相同。下表总结了这些措施:

以下各节将简要讨论每个MPI库,包括指向其他详细信息的 链接 。
LC为每个集群提供默认MPI库。
LC还为每个集群提供默认编译器。
通常,每个集群上都有多个版本的MPI库和编译器。
模块用于选择特定的MPI库或编译器:更多信息请参见此处。
例如,使用模块:
### List currently loaded modules% module list Currently Loaded Modules: 1) intel/18.0.1 2) mvapich2/2.2 3) texlive/2016 4) StdEnv ### Show all available modules% module avail ------------------------ /usr/tce/modulefiles/MPI/mvapich2/2.2 ------------------------- openss/2.3 ------------------ /usr/tce/modulefiles/MPI/intel/18.0.1/mvapich2/2.2 ------------------ MUST/1.5 fftw/3.3.7 mpip/3.4.1 boost/1.66.0 hdf5-parallel/1.8.18 pnetcdf/1.9.0 ---------------------- /usr/tce/modulefiles/Compiler/intel/18.0.1 ---------------------- hdf5-serial/1.8.18 impi/2018.0 (D) netcdf-fortran/4.4.4 hpctoolkit/10102016 mvapich2/2.2 (L,D) openmpi/2.0.0 (D) impi/5.1.3 mvapich2/2.3 openmpi/2.1.0 impi/2017.0 ncl_ncarg/6.3.0 openmpi/3.0.1 impi/2017.1 netcdf/4.4.1.1 ------------------------------ /usr/tce/modulefiles/Core ------------------------------- StdEnv (L) inspector/2018.0 (D) pgi/16.3 advisor/2016.4 intel/14.0.3 pgi/16.7 advisor/2017.1 intel/15.0.6 pgi/16.9 advisor/2017.2 intel/16.0.2 pgi/17.10 advisor/2018.0 intel/16.0.3 pgi/18.1 (D) advisor/2018.1 (D) intel/16.0.4 python/2.7.11 allineaforge/6.0.5 intel/17.0.0 python/2.7.13 allineaforge/6.1.1 intel/17.0.2 python/2.7.14 (D) allineaforge/7.0.3 (D) intel/18.0-beta python/3.5.1 atom/1.13.1 intel/18.0.0 python/3.6.0 cbflib/0.9.2 intel/18.0.1 (L,D) python/3.6.4 clang/3.9.0 intel/18.0.2 rasmol/2.7.5.2 clang/3.9.1 intel/19.0-beta spindle/0.10 clang/4.0.0 (D) iorun sqlcipher/3.7.9 cmake/3.5.2 (D) itac/2017.1 stat/2.2.0 cmake/3.8.2 itac/2018.0 (D) stat/3.0.0 (D) cmake/3.9.2 launchmon/1.0.2 sublime_text/3.1.1 cqrlib/1.0.5 ld-auto-rpath svn/1.6.23 cvector/1.0.3 license-llnl-ocf svn/1.7.14 (D) dyninst/9.1.0 make/4.2.1 tclap/1.2.0 dyninst/9.3.1 (D) mathematica/10.3.1 tecplot/2016.1 emacs/24.3-redhat matlab/8.1 texlive/2016 (L) emacs/25.3 (D) memcheckview/3.11.0 totalview/2016.01.06 ensight/10.1.6 memcheckview/3.12.0 totalview/2016.04.08 fgfs/1.1 memcheckview/3.13.0 (D) totalview/2016.06.21 gcc/4.8-redhat mesa3d/17.0.5 totalview/2016.07.22 gcc/4.9.3 (D) mkl/11.3.3 totalview/2017X.01.07 gcc/6.1.0 mkl/2017.1 totalview/2017.1.21 gcc/7.1.0 mkl/2018.0 (D) totalview/2017.3.8 (D) gdal/1.9.0 mpa/1.1 valgrind/3.11.0 git/1.8.3.1 mpifileutils/0.6 valgrind/3.12.0 git/2.8.3 (D) mpifileutils/0.7 (D) valgrind/3.13.0 (D) git-lfs/1.4.1 mrnet/5.0.1 vampir/9.1.0 glxgears/1.2 neartree/5.1.1 vampir/9.2 (D) gmt/5.1.2 nvidia/375 vmd/1.9.3 gnuplot/5.0.0 opt vtune/2016.3 grace/5.1.25 papi/5.4.3 vtune/2017.1 graphlib/2.0.0 paraview/5.0 vtune/2018.0 (D) graphlib/3.0.0 (D) paraview/5.4-server xalt idl/8.5 paraview/5.4 (D) xforms/1.0.91 inspector/2016.3 patchelf/0.8 xsu inspector/2017.0 perfreports/7.0.3 -------------------------------- /usr/apps/modulefiles --------------------------------- Spheral/exp Spheral/old pact/current pact/new Spheral/new (D) pact/current_s pact/new_s (D) ------------------------ /usr/share/lmod/lmod/modulefiles/Core ------------------------- lmod/6.5.1 settarg/6.5.1 Where: L: Module is loaded https://www.gofarlic.com Default Module Use "module spider" to find all possible modules.Use "module keyword key1 key2 ..." to search for all possible modules matching any ofthe "keys". ### Load a different MPI module% module load openmpi/3.0.1 Lmod is automatically replacing "mvapich2/2.2" with "openmpi/3.0.1" ### Load a different compiler module% module load pgi/18.1 Lmod is automatically replacing "intel/18.0.1" with "pgi/18.1" Due to MODULEPATH changes the following have been reloaded: 1) openmpi/3.0.1 ### Confirm newly loaded modules% module list Currently Loaded Modules: 1) texlive/2016 2) StdEnv 3) pgi/18.1 4) openmpi/3.0.1一般信息
MVAPICH MPI由俄亥俄州立大学基于网络的计算实验室开发和支持。
可在LC的所有Linux群集上使用。
MVAPICH2
默认MPI实现
多个版本可用
MPI-2和MPI-3的实现基于来自阿贡国家实验室的MPICH MPI库。版本1.9和更高版本根据开发人员的文档实现MPI-3。
线程安全
要查看可用的版本和/或选择备用版本,请使用模块命令。例如:
module avail mvapich (list available modules)module load mvapich2/2.3 (use the module of interest)编译
请参阅下面的MPI构建 脚本 表。
运行
MPI可执行文件是使用SLURM srun命令和适当的选项启动的。例如,要跨pdebug池中的两个不同节点启动8进程MPI作业拆分,请执行以下操作:
srun -N2 -n8 -ppdebug a.outLinux集群概述教程的运行作业部分详细讨论了srun命令。
文档
MVAPICH主页:MVAPICH.cse.ohio-state.edu/
MVAPICH2用户指南:http://mvapich.cse.ohio-state.edu/userguide/
一般资料
OpenMPI是一种线程安全的开源MPI实现,由学术、研究和行业合作伙伴联合开发和支持。
可在所有LC Linux群集上使用。但是,您需要首先加载所需的模块。例如:
module avail (list available modules)module load openmpi/3.0.1 (use the module of interest)这确保了LC的MPI包装器脚本指向所需的OpenMPI版本。
编译
请参阅下面的MPI构建脚本表。
运行
请确保加载与构建可执行文件相同的OpenMPI模块。如果正在运行批处理作业,则需要在批处理脚本中加载模块。
可以使用以下命令启动开放式MPI作业。例如,要运行48进程MPI作业,请执行以下操作:
mpirun -np 48 a.outmpiexec -np 48 a.outsrun -n 48 a.out文档
打开MPI主页:http://www.open-mpi.org/
可在LC的Linux群集上使用。
基于MPICH3。支持MPI-3功能。
线程安全
编译和运行英特尔MPI程序:请参阅以下位置的LC文档:https://lc.llnl.gov/confluence/pages/viewpage.action?pageId=137725526
LC开发的MPI编译器包装脚本用于在所有LC系统上编译MPI程序。
自动执行一些错误检查,包括适当的MPI#include文件,链接到必要的MPI库,并将选项传递给底层编译器。
下表列出了LC Linux集群的主MPI编译器包装脚本。有关CORAL EA/Sierra系统,请参阅上面提供的链接。

有关更多信息:
MPI库的线程支持级别各不相同:
MPI_THREAD_SINGLE - Level 0:只执行一个线程。
MPI_THREAD_FUNNELED - Level 1:进程可以是多线程的,但只有主线程会进行MPI调用-所有MPI调用都漏斗状地到达主线程。
MPI_THREAD_SERIALIZED - Level 2:进程可以是多线程的,多个线程可以进行MPI调用,但一次只能调用一个。也就是说,由于所有MPI调用都是序列化的,所以不会同时从两个不同的线程进行调用。
MPI_THREAD_MULTIPLE - Level 3:多个线程可以无限制地调用MPI。
有关详细信息,请参阅MPI_Init_thread()手册页。
下面是一个确定线程级支持的简单C语言示例。
#include "mpi.h"#include <stdio.h> int main( int argc, char *argv[] ){ int provided, claimed; /*** Select one of the following MPI_Init_thread( 0, 0, MPI_THREAD_SINGLE, &provided ); MPI_Init_thread( 0, 0, MPI_THREAD_FUNNELED, &provided ); MPI_Init_thread( 0, 0, MPI_THREAD_SERIALIZED, &provided ); MPI_Init_thread( 0, 0, MPI_THREAD_MULTIPLE, &provided );***/ MPI_Init_thread(0, 0, MPI_THREAD_MULTIPLE, &provided ); MPI_Query_thread( &claimed ); printf( "Query thread level= %d Init_thread level= %d\n", claimed, provided ); MPI_Finalize();}# Sample output:Query thread level= 3 Init_thread level= 3Message Passing Interface (MPI) | LLNL HPC Tutorials
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删