目录
3.3CORAL Early Access and Sierra Clusters
1.摘要
消息传递接口标准(MPI)是基于MPI论坛共识的消息传递库标准,该论坛有40多个参与组织,包括供应商、研究人员、软件库开发人员和用户。消息传递接口的目标是建立一个可移植、高效和灵活的消息传递标准,该标准将广泛用于编写消息传递程序。因此,MPI是第一个标准化、独立于供应商的消息传递库。使用MPI开发消息传递软件的优势与可移植性、效率和灵活性的设计目标紧密匹配。MPI不是IEEE或ISO标准,但实际上已成为在HPC平台上编写消息传递程序的“行业标准”。
本教程的目标是教那些不熟悉MPI的人如何根据MPI标准开发和运行并行程序。本文介绍的主要主题侧重于对新MPI程序员最有用的主题。本教程首先介绍MPI入门的介绍、背景和基本信息。接下来详细介绍对新MPI程序员最有用的MPI例程,包括MPI环境管理、点对点通信和集体通信例程。提供了大量的C和Fortran示例,以及一个实验室练习。
教程材料还包括更高级的主题,如派生数据类型、组和通信器管理例程以及虚拟拓扑。然而,这些并不是在讲座中实际呈现的,而是为那些感兴趣的人提供“进一步阅读”。
级别/先决条件:本教程非常适合那些不熟悉MPI并行编程的人。对C或Fortran并行编程有基本了解。对于那些一般不熟悉并行编程的人来说,EC3500:并行计算简介中包含的材料会很有帮助。
2.MPI是什么
2.1接口规范
接口规范
M P I=消息传递接口
MPI是面向消息传递库的开发人员和用户的规范。就其本身而言,它不是一个库,而是一个这样一个库应该是什么的规范。
MPI主要解决消息传递并行编程模型:数据通过每个进程上的协作操作从一个进程的地址空间移动到另一个进程的地址空间。
简单地说,消息传递接口的目标是为编写消息传递程序提供广泛使用的标准。该接口试图:
- 实际的
- 便携式的
- 有效率的
- 灵活的
MPI标准经过了多次修订,最新版本是MPI-3.x
已为C和Fortran90语言绑定定义了接口规范:
- MPI-1中的MPI-1 C++绑定被删除
- MPI-3还支持Fortran 2003和2008功能
实际的MPI库实现在支持MPI标准的版本和功能方面有所不同。开发人员/用户需要意识到这一点。
2.2编程模型
最初,MPI是为分布式内存体系结构设计的,当时(20世纪80年代-90年代初)分布式内存体系结构正变得越来越流行。
随着体系结构趋势的改变,共享内存SMP通过网络进行组合,从而创建混合分布式内存/共享内存系统。
MPI实现者调整了他们的库以无缝地处理这两种类型的底层内存体系结构。他们还调整/开发了处理不同互连和协议的方法。
如今,MPI几乎可以在任何硬件平台上运行:
- 分布式存储器
- 共享内存
- 混合的
然而,不管机器的底层物理架构如何,编程模型显然仍然是一个分布式内存模型。
所有并行性都是显式的:程序员负责正确识别并行性并使用MPI构造实现并行算法。
2.3使用MPI的原因
标准化—MPI是唯一可以被视为标准的消息传递库。几乎所有HPC平台都支持它。实际上,它已经取代了以前所有的消息传递库。
可移植性—当您将应用程序移植到支持(并符合)MPI标准的不同平台时,几乎不需要修改源代码。
性能机会-供应商实施应能够利用本机硬件功能优化性能。任何实现都可以自由开发优化算法。
功能性-MPI-3中定义了430多个例程,其中包括MPI-2和MPI-1中的大多数例程。
注意:大多数MPI程序可以使用十几个或更少的例程编写
可用性—有多种实现,包括供应商和公共域。
2.4文档
有关MPI标准所有版本的文档,请访问:http://www.mpi-forum.org/docs/
3.LLNL MPI实现和编译器
3.1多个实现
尽管MPI编程接口已经标准化,但实际的库实现将有所不同。
例如,许多人只考虑以下几点:
- 支持哪一版本的MPI标准?
- 是否支持特定MPI版本中的所有功能?
- 是否添加了任何新功能?
- 支持哪些网络接口?
- MPI应用程序是如何编译的?
- MPI作业是如何启动的?
- 运行时环境变量控件?
LC系统上的MPI库实现各不相同,构建它们的编译器也不相同。下表总结了这些措施:
以下各节将简要讨论每个MPI库,包括指向其他详细信息的链接。
3.2选择MPI库和编译器
LC为每个集群提供默认MPI库。
LC还为每个集群提供默认编译器。
通常,每个集群上都有多个版本的MPI库和编译器。
模块用于选择特定的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
D: Default Module
Use "module spider" to find all possible modules.
Use "module keyword key1 key2 ..." to search for all possible modules matching any of
the "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
3.2.1MVAPICH
一般信息
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.out
Linux集群概述教程的运行作业部分详细讨论了srun命令。
文档
MVAPICH主页:MVAPICH.cse.ohio-state.edu/
MVAPICH2用户指南:http://mvapich.cse.ohio-state.edu/userguide/
3.2.2Open MPI
一般资料
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.out
mpiexec -np 48 a.out
srun -n 48 a.out
文档
打开MPI主页:http://www.open-mpi.org/
3.2.3Intel MPI
可在LC的Linux群集上使用。
基于MPICH3。支持MPI-3功能。
线程安全
编译和运行英特尔MPI程序:请参阅以下位置的LC文档:https://lc.llnl.gov/confluence/pages/viewpage.action?pageId=137725526
3.3CORAL Early Access and Sierra Clusters
- IBM Spectrum MPI库是这些集群上唯一受支持的实现。
- 基于开放MPI。包括MPI-3功能。
- 线程安全
- NVIDIA GPU支持
- 编译和运行IBM Spectrum MPI程序:请参阅https://hpc.llnl.gov/training/tutorials/using-lcs-sierra-system
3.3.1MPI Build Scripts
LC开发的MPI编译器包装脚本用于在所有LC系统上编译MPI程序。
自动执行一些错误检查,包括适当的MPI#include文件,链接到必要的MPI库,并将选项传递给底层编译器。
- 注意:如前所述,您可能需要为所需的MPI实现加载一个模块。否则将导致获取默认实现。
下表列出了LC Linux集群的主MPI编译器包装脚本。有关CORAL EA/Sierra系统,请参阅上面提供的链接。
有关更多信息:
- 请参阅手册页(如果存在)
- 使用-help选项发出脚本名称
- 直接查看脚本
3.3.2线程支持级别
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= 3