MPI教程1-3

目录

 1.摘要

2.MPI是什么

2.1接口规范

2.2编程模型

2.3使用MPI的原因

2.4文档

3.LLNL MPI实现和编译器

3.1多个实现

3.2选择MPI库和编译器

3.2.1MVAPICH

3.2.2Open MPI

3.2.3Intel MPI

3.3CORAL Early Access and Sierra Clusters

3.3.1MPI Build Scripts

3.3.2线程支持级别

参考文献


 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

参考文献

Message Passing Interface (MPI) | LLNL HPC Tutorials

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haimianjie2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值