MPI并行程序编译及运行

简介

本系统的通信网络由100Gbps或200Gbps InfiniBand高速计算网络及1Gbps千兆以太网两套网络组成。InfiniBand网络相比千兆以太网具有高带宽、低延迟的特点,通信性能比千兆以太网要高很多,建议使用。

本系统安装有多种MPI实现,主要有:HPC-X(InifiniBand网络官方推荐)、Intel MPI和Open MPI,并可与不同编译器相互配合使用,安装目录分别在 /opt/hpcx/opt/intel/opt/openmpi ,且具有不同版本的组合。

用户可以运行 module apropos MPImodule avail 查看可用MPI环境,可用类似命令设置所需的MPI环境: module load hpcx/hpcx-intel-2019.update5 ,使用此命令有时需要手动加载对应的编译器等版本,比如报:

error while loading shared libraries: libimf.so: cannot open shared
object file: No such file or directory

则需要加载对应的Intel编译器,比如 module load intel/2019.update5

MPI并行程序的编译

NVIDIA HPC-X工具集

NVIDIA HPC-X工具集 是综合的软件包,含有MPI及SHMEM/PGAS通讯库。HPC-X还包含这些库之上的用于提升性能和扩展性的多种加速包,包括加速点对点通信的UCX(Unified Communication X)、加速MPI/PGAS中集合操作的FCA(Fabric Collectives Accelerations)。这些全特性的、经完备测试的及打包好的工具集使得MPI和SHMEM/PGAS程序获得高性能、扩展性和效率,且保证了在Mellanox互连系统中这些通信库经过了全优化。

HPC-X工具集利用了基于NVIDAI InfiniBand硬件的加速引擎,可以最大化基于MPI和SHMEM/PGAS的应用性能。这些应用引擎是InfiniBand网卡(CORE-Direct引擎,硬件标记匹配(Tag Matching)等)和交换机(如SHARP加速引擎)解决方案的一部分。 NVIDAI可扩展的分层聚合和归约协议(Scalable Hierarchical Aggregation and Reduction Protocol, SHARP)技术通过将集合操作从CPU端卸载到交换机网络端,通过去除在端到端之间发送多次数据的的需要,大幅提升了MPI操作性能。这种创新性科技显著降低了MPI操作时间,释放了重要的CPU资源使其用于计算而不是通信,且降低了到达聚合节点时通过网络的数据量。

HPC-X主要特性如下:

  • 完整的MPI、PGAS/SHMEM包,且含有NVIDIA UCX和FCA加速引擎
  • 兼容MPI 3.2标准
  • 兼容OpenSHMEM 1.4标准
  • 从MPI进程将集合通信从CPU卸载到NVIDIA网络硬件上
  • 利用底层硬件体系结构最大化提升应用程序性能
  • 针对NVIDIA解决方案进行了全优化
  • 提升应用的可扩展性和资源效率
  • 支持RC、DC和UD等多种传输
  • 节点内共享内存通信
  • 带消息条带的多轨支持
  • 支持GPU-direct的CUDA

HPC-X环境:

  • HPC-X CUDA支持:
    • HPC-X默认是对于单线程模式优化的,这支持GPU和无GPU模式。
    • HPC-X是基于CUDA 10.1编译的,由于CUDA 10.1不支持比GCC v8新的,因此对于基于v8之后的GCC编译的,不支持CUDA。
  • HPC-X多线程支持 - hpcx-mt:
    • 该选项启用所有多线程支持。

HPC-X MPI是Open MPI的一种高性能实现,利用Mellanox加速能力且无缝结合了业界领先的商业和开源应用软件包进行了优化。很多用法可参考,该部分主要介绍其不同的参数设置等。

Mellanox Fabric集合通信加速(Fabric Collective Accelerator, FCA)

集合通信执行全体工薪操作占用系统中所有进程/节点,因此必须执行越快越高效越好。很多应用里面都含有大量的集合通讯,普通的MPI实现那会占用大量的CPU资源及产生系统噪声。NVIDIA将很多类似通信从CPU卸载到NVIDAI硬件网卡适配器(HCA)和交换机上及降低噪声,这种技术称之为CORE-Direct(Collectives Offload Resource Engine)。

FCA 4.4当前支持阻塞和非阻塞的集合通信:Allgather、Allgatherv、Allreduce、AlltoAll、AlltoAllv、Barrier和Bcast。

采用FCA v4.x (hcoll)运行MPI

HPC-X默认启用FCA v4.3。

  • 采用默认FCA配置参数运行:

    mpirun -mca coll_hcoll_enable 1 -x HCOLL_MAIN_IB=mlx5_0:1 <...>

  • 采用FCA运行:

    oshrun -mca scoll_mpi_enable 1 -mca scoll basic,mpi -mca coll_hcoll_enable 1 <...>

Open MPI中启用FCA

在Open MPI中启用FCA v4.4,通过下述方法显式设定模块化组件架构模块化组件架构MCA(Modular Component Architecture)参数:

mpirun -np 32 -mca coll_hcoll_enable 1 -x coll_hcoll_np=0 -x HCOLL_MAIN_IB=<device_name>:<port_num> ./a.out

调整FCA v4.4配置

显示当前信息:

/opt/mellanox/hcoll/bin/hcoll_info --all

FCA v4.4的参数是简单的环境变量,可以通过以下方式之一设置:

  • 通过 mpirun 命令设置:

    mpirun ... -x HCOLL_ML_BUFFER_SIZE=65536

  • 从SHELL设置:

    export HCOLL_ML_BUFFER_SIZE=65536

    mpirun ...

选择端口及设备

-x HCOLL_MAIN_IB=<device_name>:<port_num>

启用卸载MPI非阻塞集合

-x HCOLL_ENABLE_NBC=1

支持以下非阻塞MPI集合:

  • MPI_Ibarrier
  • MPI_Ibcast
  • MPI_Iallgather
  • MPI_Iallreduce (4b, 8b, SUM, MIN, PROD, AND, OR, LAND, LOR)

注意:启用非阻塞MPI集合将在阻塞MPI集合中禁止多播聚合。

启用Mellanox SHARP软件加速集合

HPC-X支持Mellanox SHARP软件加速集合,这些集合默认是启用的。

  • 启用Mellanox SHARP加速:

    -x HCOLL_ENABLE_SHARP=1

  • 禁止Mellanox SHARP加速:

    -x HCOLL_ENABLE_SHARP=0

  • 更改Mellanox SHARP消息阈值(默认为256):

    -x HCOLL_BCOL_P2P_ALLREDUCE_SHARP_MAX=<threshold>

HCOLL v4.4中的GPU缓存支持

如果CUDA运行时(runtime)是有效的,则HCOLL自动启用GPU支持。以下集合操作支持GPU缓存:

  • MPI_Allreduce
  • MPI_Bcast
  • MPI_Allgather

如果libhcoll的其它聚合操作API被启用GPU缓存调用,则会检查缓存类型后返回错误HCOLL_ERROR。

控制参数为 HCOLL_GPU_ENABLE ,其值可为0、1和-1:

含义

0

禁止GPU支持。不会检查用户缓存指针。此情形下,如用户提供在GPU上分配缓存,则这种行为是未定义的。

1

启用GPU支持。将检查缓存指针,且启用HCOLL GPU聚合,这是CUDA运行时有效时的默认行为。

-1

部分GPU支持。将检查缓存指针,且HCOLL回退到GPU缓存情形下的运行时。

局限性

对于MPI_Allreduce的GPU缓存支持,不是所有(OP, DTYPE)的组合都支持:

  • 支持的操作
    • SUM
    • PROD
    • MIN
    • MAX
  • 支持的类型
    • INT8、INT16、INT32、INt64
    • UINT8、UINT16、UINT32、UINT64
    • FLOAT16、FLOAT32、FLOAT64

环境变量 HCOLL_ALLREDUCE_ZCOPY_TUNE=<static/dynamic> (默认为dynamic)用于设置HCOLL的大数据全归约操作算法的自动化运行优化级别。如为static,则对运行时不优化;如是dynamic,则允许HCOLL基于性能的运行时抽样自动调节算法的基数和zero-copy [1] 阈值。

注:由于dynamic模式可能会导致浮点数归约结果有变化,因此不应该用于要求是数值可再现的情形下,导致该问题的原因在于非固定的归约顺序。

统一通信-X架构(Unified Communication - X Framework, UCX)

UCX是一种新的加速库,并且被集成到OpenMPI(作为pml层)和OpenSHMEM(作为spml层)中作为HPC-X的一部分。这是种开源的通信库,被设计为HPC应用能获得最高的性能。UCX含有广泛范围的优化,能实现在通信方面接近低级别软件开销,接近原生级别的性能。

UCX支持接收端标记匹配、单边通信语义、有效内存注册和各种增强,能有效提高HPC应用的缩放性和性能。

UCX支持:

  • InfiniBand传输:
    • 不可信数据报(Unreliable Datagram, UD)
    • 可信连接(Reliable Connected, RC)
    • 动态连接(Dynamically Connected, DC)
    • 加速verbs(Accelerated verbs)
  • Shared Memory communication with support for KNEM, CMA and XPMEM
  • RoCE
  • TCP
  • CUDA

更多信息,请参见: https://github.com/openucx/ucxhttp://www.openucx.org/

OpenMPI中使用UCX

UCX在Open MPI是默认的pml,在OpenSHMEM中是默认的spml,一般安装好设置号后无需用户自己设置就可使用,用户也可利用下面方式显式指定:

  • 在Open MPI中显式指定采用UCX:

    mpirun --mca pml ucx --mca osc ucx ...

  • 在OpenSHMEM显示指定采用UCX:

    oshrun --mca spml ucx ...

调整UCX

检查UCX的版本:

$HPCX_UCX_DIR/bin/ucx_info -v

UCX的参数可通过下述方法之一设置:

  • 通过mpirun设置:

    mpirun -x UCX_RC_VERBS_RX_MAX_BUFS=128000 <...>

  • 通过SHELL设置:

    export UCX_RC_VERBS_RX_MAX_BUFS=128000 mpirun <...>

  • 从命令行选择采用的传输:

    mpirun -mca pml ucx -x UCX_TLS=sm,rc_x ...

    上述命令设置了采用pml ucx和设定其用于使用、共享内存和加速传输verbs。

  • 为了提高缩放性能,可以加大DC传输时使用的网卡的DC发起者(DCI)的QPs数

    mpirun -mca pml ucx -x UCX_TLS=sm,dc_x -x UCX_DC_MLX5_NUM_DCI=16

    对于大规模系统,当DC传输不可用或者被禁用时,UCX将回退到UD传输。

    在256个连接建立后,RC传输将被禁用,该值可以利用 UCX_RC_MAX_NUM_EPS* 环境变量加大。

  • 设置UCX使用zero-copy时的阈值

    mpirun -mca pml ucx -x UCX_ZCOPY_THRESH=16384

    默认UCX会自己计算优化的该阈值,需要时可利用上面环境变量覆盖掉。

  • 利用 UCX_DC_MLX5_TX_POLICY =<policy> 环境变量设定端点如何选择DC。策略<policy>可以为:
    • dcs:端点或者采用已指定的DCI或DCI是LIFO顺序分配的,且在不在有操作需要时释放。
    • dcs_quota:类似dcs。另外,该DCI将在发送超过一定配额时,且有端点在等待DCI时被释放。该DCI一旦完成其所有需要的操作后就被释放。该策略确保了在端点间没有饥荒。
    • rand:每个端点被赋予一个随机选择的DCI。多个端点有可能共享相同的DCI。
  • 利用UCX CUDA内存钩子也许在静态编译CUDA应用时不会生效,作为一个工作区,可利用下面选项扩展配置:

    -x UCX_MEMTYPE_CACHE=0 -x HCOLL_GPU_CUDA_MEMTYPE_CACHE_ENABLE=0 -x HCOLL_GPU_ENABLE=1

  • GPUDirectRDMA性能问题可以通过分离协议禁止:

    -x UCX_RNDV_SCHEME=get_zcopy

  • 共享内存新传输协议命名为:TBD

    可用的共享内存传输名是:posix、sysv和xpmem

    sm和mm将被包含咋以上三种方法中。

    设备 device 名对于共享内存传输是 memory (在 UCX_SHM_DEVICES 中使用)

UCX特性
硬件标识符匹配(Tag Matching)

从ConnectX-5起,在UCX中之前由软件负责的标识符匹配工作可以卸载到HCA。对于MPI应用发送消息时附带的数值标志符的加速对收到消息的处理,可以提高CPU利用率和降低等待消息的延迟。在标识符匹配中,由软件控制的匹配入口表称为匹配表。每个匹配入口含有一个标志符及对应一个应用缓存的指针。匹配表被用于根据消息标志引导到达的消息到特定的缓存。该传输匹配表和寻找匹配入口的动作被称为标识符匹配,该动作由HCA而不再由CPU实现。在当收到的消息被不按照到达顺序而是基于与发送者相关的数值标记使用时,非常有用。

硬件标识符匹配使得省下的CPU可供其它应用使用。当前硬件标识符匹配对于加速的RC和DC传输(RC_X和DC_X)是支持的,且可以在UCX中利用下面环境参数启用:

  • 对RC_X传输: UCX_RC_MLX5_TM_ENABLE =y
  • 对DC_X传输: UCX_DC_MLX5_TM_ENABLE =y

默认,只有消息大于一定阈值时才卸载到传输。该阈值由 UCXTM_THRESH 环境变量控制,默认是1024比特。

对于硬件标识符匹配,特定阈值时,UCX也许用回弹缓冲区(bounce buffer)卸载内部预注册缓存代替用户缓存。该阈值由 UCX_TM_MAX_BB_SIZE 环境变变量控制,该值等于或小于分片大小,且必须大于 UCX_TM_THRESH 才能生效(默认为1024比特,即默认优化是被禁止的)。

CUDA GPU

HPC-X中的CUDA环境支持,使得HPC-X在针对点对点和集合函数的UCX和HCOLL通信库中使用各自NVIDIA GPU显存。

系统已安装了NVIDIA peer memory,支持 GPUDirect RDMA

片上内存(MEMIC)

片上内存允许从UCX层发送消息时使用设备上的内存,该特性默认启用。它仅支持UCX中的rc_x和dc_x传输。

控制这些特性的环境变量为:

  • UCX_RC_MLX5_DM_SIZE
  • UCX_RC_MLX5_DM_COUNT
  • UCX_DC_MLX5_DM_SIZE
  • UCX_DC_MLX5_DM_COUNT

针对这些参数的更多信息,可以运行 ucx_info 工具查看: $HPCX_UCX_DIR/bin/ucx_info -f

生成Open MPI/OpenSHMEM的UCX统计信息

为生成统计信息,需设定统计目的及触发器,它们可被选择性过滤或/和格式化。

  • 统计目的可以利用 UCX_STATS_DEST 环境变量设置,其值可以为下列之一:

    空字符串

    不会生成统计信息

    file:<filename>

    存到一个文件中,具有以下替换:%h: host, %p:pid, %c:cpu, %t: time, %e:exe,如文件名有%h,则自动替换为节点名

    stderr

    显示标准错误信息

    stdout

    显示标准输出

    udp:<host>[:<port>]

    通过UDP协议发送到host:port

    比如:

    export UCX_STATS_DEST="file:ucx_%h_%e_%p.stats"

    export UCX_STATS_DEST="stdout"

  • 触发器通过 UCX_STATS_TRIGGER 环境变量设置,其值可以为下述之一:

    exit

    在程序退出前存储统计信息

    timer:<interval>

    每隔一定时间存储统计信息

    signal:<signo>

    当进程收到信号时存储统计信息

    比如:

    export UCX_STATS_TRIGGER=exit export UCX_STATS_TRIGGER=timer:3.5

  • 利用 UCX_STATS_FILTER 环境变量可以过滤报告中的计数器。它接受以,分割的一组匹配项以指定显示的计数器,统计概要将包含匹配的计数器,批配项的顺序是没关系的。列表中的每个表达式可以包含任何以下选项:

    *

    匹配任意字符,包含没有(显示全部报告)

    ?

    匹配任意单子字符 匹配在括号中的一个字符 匹配从括号中一定范围的字符

    关于该参数的更多信息可以参见: https://github.com/openucx/ucx/wiki/Statistics

  • 利用 UCX_STATS_FORMAT 环境参数可以控制统计的格式:

    full

    每个计数器都将被在一个单行中显示

    agg

    每个计数器将在一个单行中显示,但是将会聚合类似的计数器

    summary

    所有计数器将显示在同一行

    注意:统计特性只有当编译安装UCX库时打开启用统计标记的时候才生效。默认为No,即不启用。因此为了使用统计特性,请重新采用文件编译UCX,或采用debug版本的UCX,可以在 $HPCX_UCX_DIR/debug 中找到:

    mpirun -mca pml ucx -x LD_PRELOAD=$HPCX_UCX_DIR/debug/lib/libucp.so ...

    注意:采用上面提到的重新编译的UCX将会影响性能。

PGAS共享内存访问(OpenSHMEM)

共享内存(SHMEM)子程序为高级并行扩展程序提供了低延迟、高带宽的通信。这些子程序在SHMEM API中提供了用于在协作并行进程间交换数据的编程模型。SHMEM API可在同一个并行程序中独自或与MPI子程序一起使用。

SHMEM并行编程库是一种非常简单易用的编程模型,可以使用高效的单边通讯API为共享或分布式内存系统提供直观的全局观点接口。

SHMEM程序是单程序多数据(SPMD)类型的。所有的SHMEM进程,被引用为进程单元(PEs),同时启动且运行相同程序。通常,PEs在它们大程序中自己的子域进行计算,并且周期性与其它下次通讯依赖的PEs进行通信实现数据交换。

SHMEM子程序最小化数据传输请求、最大化带宽以及最小化数据延迟(从一个PE初始化数据传输到结束时的时间周期差)。

SHMEM子程序通过以下支持远程数据传输:

  • put操作:传递数据给一个不同PE;
  • get操作:从一个不同PE和远程指针获取数据,允许直接访问属于其它PE的数据。

其它支持的操作是集合广播和归约、栅栏同步和原子内存操作(atomic memory operation)。原子内存操作指的是原子(不允许多个进程同时)读-更新操作,比如对远程或本地数据的获取-增加。

SHMEM库实现激活消息。源处理器将数据传输到目的处理器时仅涉及一个CPU,例如,一个处理器从另外处理器内存读取数据而无需中断远程CPU,除非编程者实现了一种机制去告知这些,否则远程处理器察觉不到其内存被读写。

HPC-X Open MPI/OpenSHMEM

HPC-X Open MPI/OpenSHMEM编程库是单边通信库,支持唯一的并行编程特性集合,包括并行程序应用进程间使用的点对点和集合子程序、同步、原子操作、和共享内存范式。

HPC-X OpenSHMEM基于OpenSHMEM.org协会定义的API,该库可在OFED(OpenFabrics RDMA for Linux stack )上运行,并可使用UCX和Mellanox FCA,为运行在InfiniBand上的SHMEM程序提供了史无前例的可扩展性级别。

采用UCX运行HPC-X OpenSHMEM

对于HPC-X,采用spml对程序提供服务。v2.1及之后的版本的HPC-X,ucx已是默认的spml,无需特殊指定,或者也可在 oshrun 命令行添加 -mca spml ucx 显式指定。

所有的UCX环境参数, oshrun 使用时与 mpirun 一样,完整的列表可运行下面命令获取:

$HPCX_UCX_DIR/bin/ucx_info -f

采用HPC-X OpenSHMEM与MPI一起开发应用

SHMEM编程模型提供了一种提高延迟敏感性部分的性能的方法。通常,要求采用调用shmem_put/shmem_get和shmem_barrier来代替调用MPI中的send/recv。

SHMEM模型对于短消息来说可以相比传统的MPI调用能显著降低延时。对于MPI-2 MPI_Put/MPI_Get函数,也可以考虑替换为shmem_get/shmem_put调用。

HPC-X OpenSHMEM调整参数

HPC-X OpenSHMEM采用 -MCA 选项来调整设置用户应用运行时环境。每个参数对应一种特定函数,以下为可以改变用于应用函数的参数:

  • memheap:控制内存分配策略及阈值
  • scoll:控制HPC-X OpenSHMEM集合API阈值及算法
  • spml:控制HPC-X OpenSHMEM点对点传输逻辑及阈值
  • atomic:控制HPC-X OpenSHMEM原子操作逻辑及阈值
  • shmem:控制普通HPC-X OpenSHMEM API行为

显示HPC-X OpenSHMEM参数:

  • 显示所有可用参数:
    • oshmem_info -a
  • 显示HPC-X OpenSHMEM特定参数:
    • oshmem_info --param shmem all
    • oshmem_info --param memheap all
    • oshmem_info --param scoll all
    • oshmem_info --param spml all
    • oshmem_info --param atomic all

注解

在所有节点上运行OpenSHMEM应用或性能测试时,需要执行以下命令以释放内存:

echo 3 > /proc/sys/vm/drop_caches

针对对称堆(Symmetric Heap)应用的OpenSHMEM MCA参数

SHMEM memheap大小可以通过对 oshrun 命令添加 SHMEM_SYMMETRIC_HEAP_SIZE 参数来设置,默认为256M。

例如,采用64M memheap来运行SHMEM:

oshrun -x SHMEM_SYMMETRIC_HEAP_SIZE=64M -np 512 -mca mpi_paffinity_alone 1 --map-by node -display-map -hostfile myhostfile example.exe

memheap可以采用下述方法分配:

  • sysv:system V共享内存API,目前不支持采用大页面(hugepages)分配。
  • verbs:采用IB verbs分配子。
  • mmap:采用mmap()分配内存。
  • ucx:通过UCX库分配和注册内存。

默认,HPC-X OpenSHMEM会自己寻找最好的分配子,优先级为verbs、sysv、mmap和ucx,也可以采用 -mca sshmem <name> 指定分配方法。

用于强制连接生成的参数

通常,SHMEM会在PE间消极地生成连接,一般是在第一个通信发生时。

  • 开始时就强制连接生成,设定MCA参数:

    -mca shmem_preconnect_all 1

    内存注册器(如,infiniband rkeys)信息启动时会在进程间交换。

  • 启用按需内存密钥(key)交换,可设置MCA参数:

    -mca shmalloc_use_modex 0

Open MPI库

Open MPI [2] 库是另一种非常优秀MPI实现,用户如需使用可以自己通过运行 module load 选择加载与openmpi相关的项自己设置即可。

Open MPI的安装 /opt/opnempi 目录在下。

Open MPI的编译命令主要为:

  • C程序: mpicc
  • C++程序: mpic++mpicxxmpiCC
  • Fortran 77程序: mpif77mpif90mpifort
  • Fortran 90程序: mpif90
  • Fortran程序: mpifort

mpifort 为1.8系列引入的编译Fortran程序的命令。

mpif77mpif90 为1.6系列和1.8系列的编译Fortran程序的命令。

对于MPI并行程序,对应不同类型源文件的编译命令如下:

  • 将C语言的MPI并行程序 yourprog-mpi.c 编译为可执行文件 yourprog-mpi

    mpicc -o yourprog-mpi yourprog-mpi.c

  • 将C++语言的MPI并行程序 yourprog-mpi.cpp 编译为可执行文件 yourprog-mpi ,也可换为 mpic++mpiCC

    mpicxx -o yourprog-mpi yourprog-mpi.cpp

  • 将Fortran 90语言的MPI并行程序 yourprog-mpi.f90 编译为可执行文件 yourprog-mpi

    mpifort -o yourprog-mpi yourprog-mpi.f90

  • 将Fortran 77语言的MPI并行程序 yourprog-mpi.f 编译为可执行文件 yourprog-mpi

    mpif77 -o yourprog-mpi yourprog-mpi.f

  • 将Fortran 90语言的MPI并行程序 yourprog-mpi.f90 编译为可执行文件 yourprog-mpi

    mpif90 -o yourprog-mpi yourprog-mpi.f90

编译命令的基本语法为: [-showme|-showme:compile|-showme:link] ...

编译参数可以为:

  • --showme :显示所调用的编译器所调用编译参数等信息。
  • --showme:compile :显示调用的编译器的参数
  • --showme:link :显示调用的链接器的参数
  • --showme:command :显示调用的编译命令
  • --showme:incdirs :显示调用的编译器所使用的头文件目录,以空格分隔
  • --showme:libdirs :显示调用的编译器所使用的库文件目录,以空格分隔
  • --showme:libs :显示调用的编译器所使用的库名,以空格分隔
  • --showme:version :显示Open MPI的版本号

默认使用配置Open MPI时所用的编译器及其参数,可以利用环境变量来改变。环境变量格式为 OMPI_value ,其value可以为:

  • CPPFLAGS :调用C或C++预处理器时的参数
  • LDFLAGS :调用链接器时的参数
  • LIBS :调用链接器时所添加的库
  • CC :C编译器
  • CFLAGS :C编译器参数
  • CXX :C++编译器
  • CXXFLAGS :C++编译器参数
  • F77 :Fortran 77编译器
  • FFLAGS :Fortran 77编译器参数
  • FC :Fortran 90编译器
  • FCFLAGS :Fortran 90编译器参数

Intel MPI库

注解

本文档主要基于Intel MPI Library 2021.16.1版。

Intel MPI库 [3] 是一种多结构消息传递接口(MPI)库,Intel MPI库实现了 MPI V4.1标准 。Intel MPI库可以使开发者采用新技术改变或升级其处理器和互联网络而无需改编软件或操作环境成为可能。主要包含以下内容:

  • Intel MPI库运行时环境(RTO):具有运行程序所需要的工具,包含多功能守护进程(MPD)、Hydra及支持的工具、共享库( .so )和文档。
  • Intel MPI库开发套件(SDK):包含所有运行时环境组件和编译工具,含编译器命令,如 mpiicc 、头文件和模块、静态库( .a )、调试库、追踪库和测试代码。

编译命令

下表为Intel MPI编译命令及其对应关系。

编译命令

调用的默认编译器命令

支持的语言

通用编译器

mpicc

gcc, cc

C

mpicxx

g++

C/C++

mpifc

gfortran

Fortran 77/Fortran 95+

GNU编译器

mpigcc

gcc

C

mpigxx

g++

C/C++

mpif77

gfortran

Fortran 77

mpif90

gfortran

Fortran 95+

Intel Fortran、C/C++编译器

mpiicc

icc

C

mpiicx

icx

C

mpiicpc

icpc

C++

mpiicpx

icpx

C++

mpiifort

ifort

Fortran 77/Fortran 95

mpiifx

ifx

Fortran 77/Fortran 95

编译命令选项

  • --nostrip :可在静态链接Intel MPI库时禁用调试信息剥离功能。
  • --config=<name> :加载编译器配置文件。该文件应包含指定编译器使用的环境设置。配置文件命名规则:

    <install-dir>/opt/mpi/etc/<compiler>-<name>.conf

    其中:

    • <compiler>={cc,cxx,f77,f90},取决于编译语言。
    • <name>是底层编译器的名称,其中空格被连字符替换;例如, cc -64 的<name>值为cc–64。
  • -profile=<profile_name> :指定MPI性能分析库。<profile_name>是加载对应性能分析库的配置文件(配置文件)名称。配置文件位于 <install-dir>/opt/mpi/etc 目录下。

    Intel MPI库为Intel Trace Collector提供了多个预定义配置文件,在目录 <install-dir>/opt/intel/mpi/etc/ 下:

    • vt.conf:常规跟踪库
    • vtfs.conf:故障安全跟踪库
    • vtmc.conf:正确性检查跟踪库
    • vtim.conf:负载不平衡跟踪库

    也可创建自定义配置文件 <profile_name>.conf 。可在配置文件中定义以下环境变量:

    • PROFILE_PRELIB :Intel MPI 库加载前需预先加载的库(及路径)
    • PROFILE_POSTLIB :Intel MPI 库加载后需加载的库
    • PROFILE_INCPATHS :包含文件的C预处理器参数

    如创建名为 myprof.conf 的文件并添加以下内容:

    • PROFILE_PRELIB=”-L<path_to_myprof>/lib -lmyprof”
    • PROFILE_INCPATHS=”-I<paths_to_myprof>/include”

    使用相关编译器封装程序的 -profile=myprof 选项即可选择此新配置文件。

  • -t-trace :将生成的可执行文件与Intel Trace Collector库进行链接。此选项的效果等同于 -profile=vt 选项。

    也可以通过将 I_MPI_TRACE_PROFILE 环境变量设置为<profile_name>来指定其他性能分析库。如,将 I_MPI_TRACE_PROFILE 设置为vtfs可链接至Intel Trace Collector的容错版本。

    使用此选项时,需在 VT_ROOT 环境变量中包含Intel Trace Collector的安装路径。请在Intel Trace Analyzer和Collector安装文件夹中执行随附的 vars.[c]sh 脚本。

  • -trace-imbalance :将生成的可执行文件与Intel Trace Collector的负载不平衡跟踪库进行链接。使用此选项的效果与 -profile=vtim 选项相同。

    使用此选项时,需将Intel Trace Collector的安装路径添加至 VT_ROOT 环境变量。请在Intel Trace Analyzer和Collector安装文件夹中执行随附的 vars.[c]sh 脚本。

  • -check_mpi :将生成的可执行文件与Intel Trace Collector正确性检查库进行链接。默认值为 libVTmc.so 。使用此选项的效果与 -profile=vtmc 选项相同。

    也可以使用 I_MPI_CHECK_PROFILE 环境变量将<profile_name>指定为其他检查库。

    使用此选项时,需将Intel Trace Collector的安装路径添加至 VT_ROOT 环境变量。请在Intel Trace Analyzer和Collector安装文件夹中执行随附的 vars.[c]sh 脚本。

  • -ilp64 :启用部分ILP64支持。此时Intel MPI库的所有整数参数均按64位值处理。
  • -no_ilp64 :显式禁用ILP64支持。该选项必须与Intel Fortran编译器的 -i8 选项配合使用。

    若为独立编译指定 -i8 选项,仍需在链接时使用 -i8-ilp64 选项。

  • -dynamic_log :与 -t 选项配合使用时,可动态链接Intel Trace Collector库。此选项不影响其他库的默认链接方式。

    要运行生成的程序,请将$VT_ROOT/slib添加到 LD_LIBRARY_PATH 环境变量中。

  • -g :以调试模式编译程序,并将生成的可执行文件链接至Intel MPI库的调试版本。有关如何在 -g 构建中使用额外调试功能的信息,请参阅 I_MPI_DEBUG

    优化后的库默认使用 -g 选项进行链接。

    运行时使用 vars.{sh|csh} [debug|debug_mt] 加载特定 libmpi.so 配置。

  • -O :启用编译器优化。
  • -fast :以最大化整个程序的运行速度。该选项强制对Intel MPI库采用静态链接方式。此选项仅受 mpiicxmpiiccmpiicpxmpiicpcmpiifxmpiifort 等Intel编译器封装器支持。
  • -echo :显示命令脚本执行的全部内容。
  • -show :显示底层编译器的调用方式,但不会实际运行。
    • 使用以下命令查看所需编译器标志和选项:

    mpiicc -show -c test.c

    • 使用以下命令查看所需链接标志、选项和库:

    mpiicc -show -o a.out test.o

    此选项特别适用于确定直接使用底层编译器的复杂构建流程的命令行。

  • -show_env :查看底层编译器调用时生效的环境设置。
  • -{cc,cxx,fc}=<compiler> :选择底层编译器。

    下表列出了推荐的产品默认LLVM和IL0编译器选项,以及用于调用它们的命令。

    语言/模型

    产品名

    编译命令

    编译器封装命令

    命令

    例子

    C

    Intel oneAPI DPC++/C++ Compiler

    icx

    mpiicc

    -cc=icx

    mpiicc -cc=icx -c test.c

    C++

    Intel oneAPI DPC++/C++ Compiler

    icpx

    mpiicpc

    -cxx=icpx

    mpiicpc -cxx=icpx -c test.cpp

    SYCL

    Intel oneAPI DPC++/C++ Compiler

    -cxx=icpx -fsycl

    mpiicpc

    -cxx=icpx -fsycl

    mpiicpc -cxx=icpx -fsycl -c test.cpp

    Fortran

    Intel Fortran Compiler

    ifx

    mpiifort

    -fc=ifx

    mpiifort -fc=ifx -c test

  • -nofortbind-nofortran :禁用 mpiicc 与Fortran绑定的链接。此选项的效果与 I_MPI_FORT_BIND 环境变量相同。
  • -v :打印编译器封装脚本版本及其底层编译器版本。
  • -norpath :禁用Intel MPI库编译器封装脚本的rpath功能。

环境变量

编译环境
  • I_MPI_{CC,CXX,FC,F77,F90}_PROFILEMPI{CC,CXX,FC,F77,F90}_PROFILE
    • 默认分析库。
    • 语法: I_MPI_{CC,CXX,FC,F77,F90}_PROFILE =<profile_name>。
    • <profile_name> :指定默认的性能分析库。
    • 说明:设置此环境变量可选择默认使用的特定MPI性能分析库。其效果等同于将 -profile=<profile-name> 作为mpiicc或其他Intel MPI库编译器封装程序的参数。
  • I_MPI_TRACE_PROFILE
    • 设定 -trace 参数使用的默认分析文件。
    • 语法: I_MPI_TRACE_PROFILE =<profile_name>, I_MPI_{CC,CXX,F77,F90}_PROFILE 环境变量将覆盖掉 I_MPI_TRACE_PROFILE
    • <profile_name> :指定默认的性能分析库。默认为vt。
    • 说明:设置此环境变量可选择特定的MPI性能分析库,用于配合 mpiicc 或其他英特尔MPI库编译器封装工具的 -trace 选项使用。环境变量 I_MPI_{CC,CXX,F77,F90}_PROFILE 将覆盖 I_MPI_TRACE_PROFILE 的设置。
  • I_MPI_CHECK_PROFILE
    • 设定 -check_mpi 选项使用的默认分析。
    • 语法: I_MPI_CHECK_PROFILE =<profile_name>。
    • <profile_name> :指定检查配置文件名称。默认值为vtmc。
    • 说明:设置此环境变量可指定特定的MPI检查库,用于配合mpiicc或其他英特尔MPI库编译器封装工具的-check_mpi选项使用。环境变量I_MPI_{CC,CXX,F77,F90}_PROFILE将覆盖I_MPI_CHECK_PROFILE的设置。
  • I_MPI_CHECK_COMPILER
    • 设定启用或禁用编译器兼容性检查。
    • 语法: I_MPI_CHECK_COMPILER =<arg>。
    • <arg>
      • enable、yes、on、1:打开兼容性检查。
      • disable、no、off、0:关闭编译器兼容性检查,为默认值。
    • 描述:若启用 I_MPI_CHECK_COMPILER 选项,Intel MPI库编译器封装层将检查底层编译器的兼容性。常规编译需使用已知版本的底层编译器。
  • I_MPI_{CC,CXX,FC,F77,F90}MPICH_{CC,CXX,FC,F77,F90}
    • 设置要使用的底层编译器的路径/名称。
    • 语法: I_MPI_{CC,CXX,FC,F77,F90} =<compiler>。
    • <compiler> :编译器的编译命令名或路径。
    • 说明:设置此环境变量可选择要使用的特定编译器。若编译器未位于搜索路径中,请指定其完整路径。
  • I_MPI_ROOT
    • 设置Intel MPI库的安装目录路径。
    • 语法: I_MPI_ROOT=<path>
    • <path> :Intel MPI库的安装后的目录。
    • 说明:设置此环境变量以指定Intel MPI库的安装目录。
  • VT_ROOT
    • 设置Intel Trace Collector的安装目录路径。
    • 语法: VT_ROOT=<path>
    • <path> :Intel Trace Collector的安装后的目录。
    • 说明:设置此环境变量以指定Intel Trace Collector的安装目录。
  • I_MPI_COMPILER_CONFIG_DIR
    • 设置编译器配置目录路径。
    • 语法: I_MPI_COMPILER_CONFIG_DIR=<path>
    • <path> :编译器安装后的配置目录,默认值为 <installdir>/<arch>/etc
    • 说明:设置此环境变量可更改编译器配置文件的默认位置。
  • I_MPI_LINK
    • 设置链接MPI库版本。
    • 语法: I_MPI_LINK=<arg>
    • <arg>
      • opt :优化的单线程版本Intel MPI库;
      • opt_mt :优化的多线程版本Intel MPI库;
      • dbg :调试的单线程版本Intel MPI库;
      • dbg_mt :调试的多线程版本Intel MPI库;
      • log :日志的单线程版本Intel MPI库;
      • log_mt :日志的多线程版本Intel MPI库。
    • 说明:将此变量设置为始终链接到指定版本的Intel MPI库。
  • I_MPI_DEBUG_INFO_STRIP-
    • 在静态链接应用程序时启用/禁用调试信息剥离功能。
    • 语法: I_MPI_DEBUG_INFO_STRIP =<arg>
    • <arg>
      • enable、yes、on、1:启用,为默认参数
      • disable、no、off、0:关闭
    • 说明:使用此选项可在静态链接Intel MPI库时启用/禁用调试信息剥离功能。默认情况下会剥离调试信息。
I_MPI_ADJUST家族环境变量
  • I_MPI_ADJUST_<opname>
    • 控制集合操作预设选择。

      注解

      预设是算法的衍生产物。预设数量超过算法数量。

    • 语法: I_MPI_ADJUST_<opname> =”<presetid>[:<conditions>][;<presetid>:<conditions>[…]]”
    • <presetid> :预设标识符,设置一个数字以选择所需的预设。值为0时采用集合算法选择的基本逻辑。
    • <conditions> :以逗号分隔的条件列表,空列表表示选择所有消息大小与进程组合:
      • <l>:大小为<l>的消息
      • <l>-<m>:大小介于<l>至<m>(含边界值)的消息
      • <l>@<p>:大小为<l>且进程数为<p>的消息
      • <l>-<m>@<p>-<q>:消息大小在<l>至<m>之间(含边界值),进程数在<p>至<q>之间(含边界值)
    • 说明:设置此环境变量可在特定条件下为集合操作<opname>选择所需预设。每个集合操作均拥有独立的环境变量及算法。

    环境变量

    集合操作

    算法

    I_MPI_ADJUST_ALLGATHER

    MPI_Allgather

    Recursive doubling
    Bruck’s
    Ring
    Topology aware Gatherv + Bcast
    Knomial

    I_MPI_ADJUST_ALLGATHERV

    MPI_Allgatherv

    Recursive doubling
    Bruck’s
    Ring
    Topology aware Gatherv + Bcast

    I_MPI_ADJUST_ALLREDUCE

    MPI_Allreduce

    Recursive doubling
    Rabenseifner’s
    Reduce + Bcast
    Topology aware Reduce + Bcast
    Binomial gather + scatter
    Topology aware binominal gather + scatter
    Shumilin’s ring
    Ring
    Knomial
    Topology aware SHM-based flat
    Topology aware SHM-based Knomial
    Topology aware SHM-based Knary

    I_MPI_ADJUST_ALLTOALL

    MPI_Alltoall

    Bruck’s
    Isend/Irecv + waitall
    Pair wise exchange
    Plum’s

    I_MPI_ADJUST_ALLTOALLV

    MPI_Alltoallv

    Isend/Irecv + waitall
    Plum’s

    I_MPI_ADJUST_ALLTOALLW

    MPI_Alltoallw

    Isend/Irecv + waitall

    I_MPI_ADJUST_BARRIER

    MPI_Barrier

    Dissemination
    Recursive doubling
    Topology aware dissemination
    Topology aware recursive doubling
    Binominal gather + scatter
    Topology aware binominal gather + scatter
    Topology aware SHM-based flat
    Topology aware SHM-based Knomial
    Topology aware SHM-based Knary

    I_MPI_ADJUST_BCAST

    MPI_Bcast

    Binomial
    Recursive doubling
    Ring
    Topology aware binomial
    Topology aware recursive doubling
    Topology aware ring
    Shumilin’s
    Knomial
    Topology aware SHM-based flat
    Topology aware SHM-based Knomial
    Topology aware SHM-based Knary
    NUMA aware SHM-based (SSE4.2)
    NUMA aware SHM-based (AVX2)
    NUMA aware SHM-based (AVX512)

    I_MPI_ADJUST_EXSCAN

    MPI_Exscan

    Partial results gathering
    Topology aware partial results gathering

    I_MPI_ADJUST_SCATTER

    MPI_Scatter

    Binomial
    Topology aware binomial
    Shumilin’s

    I_MPI_ADJUST_SCATTERV

    MPI_Scatterv

    Linear
    Topology aware linear

    I_MPI_ADJUST_SENDRECV_REPLACE

    MPI_Sendrecv_replace

    Generic
    Uniform (with restrictions)

    I_MPI_ADJUST_IALLGATHER

    MPI_Iallgather

    Recursive doubling
    Bruck’s
    Ring

    I_MPI_ADJUST_IALLGATHERV

    MPI_Iallgatherv

    Recursive doubling
    Bruck’s
    Ring

    I_MPI_ADJUST_IALLREDUCE

    MPI_Iallreduce

    Recursive doubling
    Rabenseifner’s
    Reduce + Bcast
    Ring (patarasuk)
    Knomial
    Binomial
    Reduce scatter allgather
    SMP
    Nreduce

    I_MPI_ADJUST_IALLTOALL

    MPI_Ialltoall

    Bruck’s
    Isend/Irecv + Waitall
    Pairwise exchange

    I_MPI_ADJUST_IALLTOALLV

    MPI_Ialltoallv

    Isend/Irecv + Waitall

    I_MPI_ADJUST_IALLTOALLW

    MPI_Ialltoallw

    Isend/Irecv + Waitall

    I_MPI_ADJUST_IBARRIER

    MPI_Ibarrier

    Dissemination

    I_MPI_ADJUST_IBCAST

    MPI_Ibcast

    Binomial
    Recursive doubling
    Ring
    Knomial
    SMP
    Tree knominal
    Tree kary

    I_MPI_ADJUST_IEXSCAN

    MPI_Iexscan

    Recursive doubling
    SMP

    I_MPI_ADJUST_IGATHER

    MPI_Igather

    Binomial
    Knomial

    I_MPI_ADJUST_IGATHERV

    MPI_Igatherv

    Linear
    Linear ssend

    I_MPI_ADJUST_IREDUCE_SCATTER

    MPI_Ireduce_scatter

    Recursive halving
    Pairwise
    Recursive doubling

    I_MPI_ADJUST_IREDUCE

    MPI_Ireduce

    Rabenseifner’s
    Binomial
    Knomial

    I_MPI_ADJUST_ISCAN

    MPI_Iscan

    Recursive Doubling
    SMP

    I_MPI_ADJUST_ISCATTER

    MPI_Iscatter

    Binomial
    Knomial

    I_MPI_ADJUST_ISCATTER

    MPI_Iscatterv

    Linear

    表中描述了集合操作的消息大小计算规则。下表中,“n/a”表示对应的区间<l>-<m>应省略。

    注解

    I_MPI_ADJUST_SENDRECV_REPLACE =2 预设只能在所有级别的数据类型和对象计数相同的情况下使用。

  • I_MPI_ADJUST_<opname>_LIST
    • 语法: I_MPI_ADJUST_<opname>_LIST =<presetid1>[-<presetid2>][,<presetid3>][,<presetid4>-<presetid5>]
    • 说明:设置此环境变量可指定Intel MPI库运行时针对特定<opname>需考虑的预设集。该变量适用于自动调优场景,以及用户需选择特定算法子集的调优场景。

      注解

      设置空字符串将禁用<opname>集合操作的自动调优功能。

  • I_MPI_COLL_INTRANODE
    • 语法: I_MPI_COLL_INTRANODE =<mode>
    • <mode> ,节点内集合操作类型:
      • pt2pt:仅使用基于点对点通信的集合操作
      • shm:启用共享内存集合操作(默认值)
    • 说明:设置此环境变量可切换集合操作的节点内通信类型。当通信对象数量庞大时,可关闭SHM集合操作以避免内存过度消耗。
  • I_MPI_COLL_EXTERNAL
    • 语法: I_MPI_COLL_EXTERNAL =<arg>
    • <arg>
      • enable、yes、on、1:启用外部集合操作功能,使用可用的集合操作库。
      • disable、no、off、0:禁用外部集合操作功能。此为默认值。
      • hcoll:使用HCOLL库启用外部集合操作功能。
    • 说明:设置此环境变量以启用外部集合操作。为获得更佳性能,启用 I_MPI_COLL_EXTERNAL 后请使用自动调优器。该过程将获取最优集合操作设置。

    要强制使用外部集合操作,请使用以下 I_MPI_ADJUST_<opname> 值:I_MPI_ADJUST_ALLREDUCE=24、I_MPI_ADJUST_BARRIER=11、I_MPI_ADJUST_BCAST=16、I_MPI_ADJUST_REDUCE=13、I_MPI_ADJUST_ALLGATHER=6、I_MPI_ADJUST_ALLTOALL=5、I_MPI_ADJUST_ALLTOALLV=5、I_MPI_ADJUST_SCAN=3、I_MPI_ADJUST_EXSCAN=3、I_MPI_ADJUST_GATHER=5、I_MPI_ADJUST_GATHERV=4、I_MPI_ADJUST_SCATTER=5、I_MPI_ADJUST_SCATTERV=4、I_MPI_ADJUST_ALLGATHERV=5、I_MPI_ADJUST_ALLTOALLW=2、I_MPI_ADJUST_REDUCE_SCATTER=6、I_MPI_ADJUST_REDUCE_SCATTER_BLOCK=4、I_MPI_ADJUST_IALLGATHER=5、I_MPI_ADJUST_IALLGATHERV=5、I_MPI_ADJUST_IGATHERV=3、I_MPI_ADJUST_IALLREDUCE=9、I_MPI_ADJUST_IALLTOALLV=2、I_MPI_ADJUST_IBARRIER=2、I_MPI_ADJUST_IBCAST=5、I_MPI_ADJUST_IREDUCE=4。

  • I_MPI_COLL_DIRECT
    • 语法: I_MPI_COLL_DIRECT =<arg>
    • <arg>
      • on:启用直接集体操作。此为默认值。
      • off:禁用直接集体操作。
    • 说明:设置此环境变量以控制直接集体操作的使用。在shm:ofi结构中,禁用此变量可消除节点内通信中对OFI的使用。
  • I_MPI_CBWR
    • 控制相同进程数下浮点运算结果在不同平台、网络和拓扑结构中的可重复性。
    • 语法: I_MPI_CBWR =<arg>

    <arg>

    CBWR兼容模式

    说明

    0

    none

    禁用全库范围的CBWR模式。可通过显式调用MPI_Comm_dup_with_info创建CNR安全通信器。
    此为默认值。

    1

    弱模式

    禁用拓扑感知集体操作。集体操作结果不依赖进程秩。
    该模式保证在同一集群不同运行中结果可重现(与进程秩无关)。

    2

    严格模式

    禁用拓扑感知集体操作,在算法选择时忽略CPU架构与互连方式。
    该模式保证在不同集群上运行时结果可重现(与秩布局、CPU架构及互连方式无关)
    • 说明:条件数值可重现性(CNR)提供控制机制,用于在集体操作中获得可重现的浮点结果。通过此功能,英特尔MPI库的集体操作在MPI秩数量相同的情况下,可确保每次运行返回相同的浮点结果。

      使用 I_MPI_CBWR 环境变量以库级方式控制此功能,此时所有通信器上的集体操作均保证结果可重现。若需更精确地控制浮点运算可重现性,可采用按通信器级别的控制方式。

调优环境变量
  • I_MPI_TUNING_MODE
    • 选择调优方法。
    • 语法: I_MPI_TUNING_MODE =<arg>
    • <arg>
      • none:禁用调优模式。此为默认值。
      • auto:启用自动调优器。
      • auto:application:启用采用应用程序聚焦策略的自动调优器(auto的别名)。
      • auto:cluster:启用不含应用程序特定逻辑的自动调优器。通常需借助基准测试(例如IMB-MPI1)和代理应用程序实现。
    • 说明:设置此环境变量以启用自动调谐器功能并配置自动调谐器策略。
  • I_MPI_TUNING_BIN
    • 指定二进制格式调优设置的路径。
    • 语法: I_MPI_TUNING_BIN =<path>
    • <path>` :指向包含调优设置的二进制文件的路径。默认情况下,Intel MPI库使用位于 <$I_MPI_ONEAPI_ROOT/etc> 的二进制调优文件。
    • 说明:设置此环境变量以加载二进制格式的调优设置。
  • I_MPI_TUNING_BIN_DUMP
    • 指定用于以二进制格式存储调优设置的文件。
    • 语法: I_MPI_TUNING_BIN_DUMP =<filename>
    • <filename> :存储调优设置的二进制文件名。默认情况下不指定路径。
    • 说明:设置此环境变量以二进制格式存储调优设置。
  • I_MPI_TUNING
    • 加载以JSON格式存储的调优设置。
    • 语法: I_MPI_TUNING =<path>
    • <path> :指向包含调优设置的JSON文件的路径。
    • 说明:设置此环境变量以加载JSON格式的调优设置。

      默认情况下,Intel MPI库采用二进制格式加载调优设置。若无法加载二进制格式,则通过 I_MPI_TUNING 环境变量指定的JSON格式调优文件将被加载。因此,要启用JSON调优,需关闭默认二进制调优: I_MPI_TUNING_BIN =””。若无法从JSON文件或二进制格式加载调优设置,则采用默认调优值。

      使用 I_MPI_ADJUST 系列环境变量时,无需关闭二进制或JSON调优设置。通过 I_MPI_ADJUST 环境变量指定的算法始终优先于二进制和JSON调优设置。

自动调优

若应用程序在MPI集合操作上耗费大量时间,调优可能提升其性能。

调优高度依赖于特定平台的规格。自动调优器会在应用程序运行期间搜索集合操作的最佳实现方案。每个集合操作都有其预设参数(包括算法及其参数),自动调优功能会遍历这些参数并评估每种方案的性能。自动调优完成搜索空间评估后,将选择最快的实现方案并在后续运行中持续使用,从而提升应用程序性能。通过 I_MPI_ADJUST_<opname>_LIST 变量可修改自动调优器的搜索空间(详见 I_MPI_ADJUST 系列环境变量)。

自动调优器通过 I_MPI_TUNING_MODEI_MPI_TUNING_AUTO 系列环境变量确定调优参数,并使其可用于自动调优以寻找最佳设置(参见调优环境变量及 I_MPI_TUNING_AUTO 系列环境变量)。

注解

I_MPI_TUNING_MODEI_MPI_TUNING_AUTO 系列环境变量仅支持英特尔处理器,无法在其他平台使用。

当前可自动调优的集合操作包括:MPI_Allreduce、MPI_Bcast、MPI_Barrier、MPI_Reduce、MPI_Gather、MPI_Scatter、MPI_Alltoall、MPI_Allgatherv、MPI_Reduce_scatter、MPI_Reduce_scatter_block、MPI_Scan、MPI_Exscan、 MPI_Iallreduce、MPI_Ibcast、MPI_Ibarrier、MPI_Ireduce、MPI_Igather、MPI_Iscatter、MPI_Ialltoall、MPI_Iallgatherv、MPI_Ireduce_scatter、MPI_Ireduce_scatter_block、MPI_Iscan 以及 MPI_Iexscan。

使用自动调优器需执行以下步骤:

  1. 启用自动调优器启动应用程序,并指定存储结果的转储文件:

    • I_MPI_TUNING_MODE =auto
    • I_MPI_TUNING_BIN_DUMP =tuning-results.dat
  2. 使用上一步生成的调优结果启动应用程序:

    • I_MPI_TUNING_BIN =./tuning-results.dat或使用 -tune Hydra 选项。

若遇到性能问题,请参阅 I_MPI_TUNING_AUTO 系列环境变量。

如:

$ export I_MPI_TUNING_MODE=auto
$ export I_MPI_TUNING_AUTO_SYNC=1
$ export I_MPI_TUNING_AUTO_ITER_NUM=5
$ export I_MPI_TUNING_BIN_DUMP=tuning_results.dat
$ mpirun -n 128 -ppn 64 IMB-MPI1 allreduce -iter 1000,800 -time 4800
$ export I_MPI_TUNING_BIN=./tuning_results.dat
$ mpirun -n 128 -ppn 64 IMB-MPI1 allreduce -iter 1000,800 -time 4800

注意:若需针对应用程序性能快照(APS)识别出的通信器进行集合操作调优,请在步骤中执行以下变量:

GPU支持
  • I_MPI_OFFLOAD
    • 设置此环境变量以启用所有GPU功能。
    • 语法: I_MPI_OFFLOAD =<value>
    • <value>
      • 0禁用。此为默认值。
      • 1启用。
    • 说明:设置此环境变量可启用所有GPU功能,如GPU绑定和GPU缓冲区支持,使您能够在MPI秩之间分配设备,并为MPI函数提供卸载内存的指针。
  • I_MPI_OFFLOAD_MODE
    • 选择GPU/加速器卸载的API。
    • 语法: I_MPI_OFFLOAD_MODE =<value>
    • <value>
      • auto:自动识别GPU后端。此为默认值。
      • level_zero:使用Level-Zero API和库进行GPU操作。
      • cuda:使用CUDA驱动API和库进行GPU操作。
    • 说明:设置此环境变量以选择GPU/加速器卸载的API。
  • I_MPI_OFFLOAD_SYMMETRIC
    • 启用/禁用对操作中所有缓冲区类型相同的假设。
    • 语法: I_MPI_OFFLOAD_SYMMETRIC=<value>
    • <value>
      • 0:禁用。此为默认值。
      • 1:启用。
    • 说明:设置此环境变量以启用/禁用操作中所有缓冲区类型相同的假设。即缓冲区仅分配在GPU或主机上。设置此变量可优化设备间通信,但禁用Host→Device和Device→Host场景的处理。
  • I_MPI_OFFLOAD_LEVEL_ZERO_LIBRARY
    • 指定Level-Zero库的名称及完整路径。
    • 语法: I_MPI_OFFLOAD_LEVEL_ZERO_LIBRARY =”<path>/<name>”
    • 参数描述:
      • <path> :Level-Zero库的完整路径。
      • <name> :Level-Zero库的名称。
    • 说明:设置此环境变量以指定Level-Zero库的名称和完整路径。若Level-Zero库未位于默认路径下,请设置此变量。默认值为 libze_loader.so
  • I_MPI_OFFLOAD_CUDA_LIBRARY
    • 指定CUDA驱动程序库的名称和完整路径。
    • 语法: I_MPI_OFFLOAD_CUDA_LIBRARY =”<path>/<name>”
    • 参数描述:
      • <path> :CUDA驱动程序库的完整路径。
      • <name> :CUDA驱动程序库的名称。
    • 说明:设置此环境变量以指定CUDA驱动程序库的名称和完整路径。若CUDA未位于默认路径中,请设置此变量。默认值为 libcuda.so
  • I_MPI_OFFLOAD_GDR_LIBRARY
    • 指定GDR库的名称和完整路径。
    • 语法: I_MPI_OFFLOAD_GDR_LIBRARY =”<path>/<name>”
    • 参数描述:
      • <path> :GDR库的完整路径。
      • <name> :GDR库的名称。
    • 说明:设置此环境变量以指定GDR库的名称和完整路径。若库文件不在默认路径下,请设置此变量。默认值为 libgdrapi.so 。该库用于小消息的快速内存复制。
GPU固定

使用此功能可在MPI进程间分配GPU设备。

启用GPU绑定时,请设置 I_MPI_OFFLOAD_PIN =1。也可通过 I_MPI_OFFLOAD =1启用所有GPU功能与优化。

此功能要求节点上安装Level-Zero或CUDA库。

默认设置:

  • I_MPI_OFFLOAD_CELL=tile
  • I_MPI_OFFLOAD_DOMAIN_SIZE=-1
  • I_MPI_OFFLOAD_DEVICES=all

默认情况下,所有可用资源将根据进程位置尽可能均衡地分配至各MPI进程;即资源分配会考虑进程与资源所在的NUMA节点。理想情况下,进程仅应使用与自身所在NUMA节点相同的资源。

启用GPU绑定后,进程仅可访问已绑定的设备。这意味着其他设备对该进程不可见,无法被使用或发现。

注解

若设置 ZE_AFFINITY_MASKCUDA_VISIBLE_DEVICES 变量,GPU绑定将自动禁用。

I_MPI_DEBUG =3起,Intel MPI库将打印GPU拓扑结构,包含检测到的设备(GPU)数量及子设备(堆栈stack或瓦片tile)数量。

注解

在扁平化层次结构模式下(参见ZE_FLAT_DEVICE_HIERARCHY),Intel MPI库与其他工具(如sycl-ls/clinfo)报告的节点拓扑可能存在差异。该模式下,Level-Zero驱动程序将每个子设备(堆栈或瓦片)作为独立设备呈现。

  • I_MPI_OFFLOAD_PIN
    • 控制是否启用GPU绑定。
    • 语法: I_MPI_OFFLOAD_PIN =<value>
    • <value>
      • 0:禁用。
      • 1:启用。
    • 说明:默认情况下,GPU绑定功能处于禁用状态。启用时请设置I_MPI_OFFLOAD_PIN=1或I_MPI_OFFLOAD=1。
  • I_MPI_OFFLOAD_TOPOLIB
    • 设置GPU拓扑识别接口。
    • 语法: I_MPI_OFFLOAD_TOPOLIB =<arg>
    • <arg>
      • level_zero:使用Level-Zero库进行GPU拓扑识别。
      • cuda:使用CUDA库进行GPU拓扑识别。
      • none:禁用GPU识别和GPU绑定。
    • 说明:设置此环境变量以定义GPU拓扑识别的接口。
  • I_MPI_OFFLOAD_CELL
    • 设置此变量以定义基础单元:瓦片(堆栈、子设备)或设备(GPU)。
    • 语法: I_MPI_OFFLOAD_CELL =<cell>
    • <cell>
      • tile:单个单元(堆栈、子设备)。此为默认值。
      • device:整个设备(GPU)及其所有子设备。
    • 说明:设置此变量以定义基础单元。该变量可能影响其他GPU绑定变量。
  • I_MPI_OFFLOAD_DOMAIN_SIZE
    • 控制每MPI秩的基础单元数量。
    • 语法: I_MPI_OFFLOAD_DOMAIN_SIZE =<value>
    • <value> 为整数:
      • -1:自动。每MPI秩可使用不同域大小以充分利用可用资源。此为默认值。
      • >0:自定义域大小。
    • 说明:设置此变量以定义将绑定到MPI秩的基础单元数量。 I_MPI_OFFLOAD_CELL 变量定义基础单元类型:堆栈(瓦片)或设备。
  • I_MPI_OFFLOAD_DEVICES
    • 定义可用设备列表。
    • 语法: I_MPI_OFFLOAD_DEVICES =<devicelist>
    • <devicelist> ,可用设备的逗号分隔列表:
      • all:所有设备均可用。此为默认值。
      • <l>:逻辑编号为<l>的设备。
      • <l>-<m>:逻辑编号从<l>到<m>的设备。
      • <k>,<l>-<m>:逻辑编号<k>及从<l>到<m>的设备。
    • 说明:设置此变量以定义可用设备。该变量还支持排除特定设备。
  • I_MPI_OFFLOAD_CELL_LIST
    • 为每MPI秩定义要固定的基础单元列表。
    • 语法: I_MPI_OFFLOAD_DEVICE_LIST =<base_units_list>
    • <base_units_list> 为以逗号分隔的基础单元列表,第i个进程将绑定至列表中第i个基础单元:
      • <l>:逻辑编号为<l>的基础单元。
      • <l>-<m>:逻辑编号从<l>到<m>的基础单元范围。
      • <k>,<l>-<m>:基础单元<k>及编号从<l>到<m>的基础单元。
    • 说明:设置此变量以定义每MPI秩的固定基础单元列表。第i个秩的进程将固定在列表中的第i个基础单元上。
      • I_MPI_OFFLOAD_CELL 变量定义基础单元类型:堆栈单元(瓦片)或设备单元。
      • I_MPI_OFFLOAD_DEVICE_LIST 变量的优先级低于 I_MPI_OFFLOAD_DOMAIN 变量。
  • I_MPI_OFFLOAD_DOMAIN
    • 通过以逗号分隔的十六进制数列表为每MPI秩定义域。
    • 语法: I_MPI_OFFLOAD_DOMAIN =<masklist>
    • <masklist> 是以逗号分隔的十六进制数列表:
      • [m1,…,mn ]对于<masklist>,每个mi是定义独立域的十六进制位掩码。
      • 遵循以下规则:若mi值中对应位为1,则第i个基单元被纳入该域。
    • 说明:设置此变量以定义十六进制位掩码列表。对于第i个掩码,若第j位为1,则第j个基础单元将绑定至第i个MPI秩。
      • I_MPI_OFFLOAD_CELL 变量定义基础单元类型:栈(瓦片)或设备。
      • I_MPI_OFFLOAD_DOMAIN 变量的优先级高于 I_MPI_OFFLOAD_DEVICE_LIST
  • I_MPI_OFFLOAD_PRINT_TOPOLOGY
    • 无论 I_MPI_DEBU G级别如何,均打印GPU绑定和GPU拓扑信息。
    • 语法: I_MPI_OFFLOAD_PRINT_TOPOLOGY =<value>
    • <value>
      • 0:GPU绑定与拓扑打印取决于 I_MPI_DEBUG 级别:
      • I_MPI_DEBUG >= 3,仅打印首个主机的GPU信息
      • I_MPI_DEBUG >= 120,打印所有主机的GPU信息
      • 1:打印所有主机的GPU绑定与拓扑信息。
GPU缓冲区支持

此功能通过使用Level Zero库或CUDA库,使MPI函数(如MPI_Send、MPI_Recv、MPI_Bcast、MPI_Allreduce等)能够处理设备缓冲区。要启用GPU缓冲区支持,请设置 I_MPI_OFFLOAD =1。

若需将卸载内存区域的指针传递给MPI,可能需要使用特定编译器指令,或通过对应的加速运行时API获取该指针。

  • I_MPI_OFFLOAD_MEMCPY_KIND
    • 设置此环境变量以选择GPU内存复制类型。
    • 语法: I_MPI_OFFLOAD_MEMCPY_KIND =<value>
    • <value>
      • cached:创建缓存对象用于与GPU通信,当相同设备缓冲区后续提供给MPI函数时可复用。默认值。
      • blocked:将设备缓冲区复制到主机,并在MPI函数内部等待复制完成。
      • nonblocked:将设备缓冲区复制到主机,不在MPI函数内部等待复制完成。需通过MPI_Wait等待操作完成。
    • 说明:设置此环境变量以选择GPU内存复制类型。默认采用性能最佳的选项。非阻塞复制可配合MPI非阻塞点对点操作实现与计算部分的重叠执行。若其他类型不稳定,可使用阻塞复制。
  • I_MPI_OFFLOAD_PIPELINE
    • 设置此环境变量以启用流水线算法。
    • 语法: I_MPI_OFFLOAD_PIPELINE =<value>
    • <value>
      • 0:禁用流水线算法。
      • 1:启用流水线算法。默认值。
    • 说明:设置此环境变量可启用流水线算法,该算法能提升大消息尺寸的传输性能。其核心原理是将用户缓冲区分割为多个段,将各段复制到主机后再发送至其他进程。
  • I_MPI_OFFLOAD_PIPELINE_THRESHOLD
    • 设置此环境变量可控制流水线算法的阈值。
    • 语法: I_MPI_OFFLOAD_PIPELINE_THRESHOLD =<value>
    • <value> :0,阈值单位为字节,默认值为65536。
  • I_MPI_OFFLOAD_COLL_PIPELINE
    • 为MPI集合函数启用GPU流水线实现。
    • 语法: I_MPI_OFFLOAD_COLL_PIPELINE =<arg>
    • <arg>
      • disable、no、off、0:禁用MPI集合函数的GPU流水线处理。
      • enable、yes、on、1:启用MPI集合函数的GPU流水线处理。此为默认值。
  • I_MPI_OFFLOAD_COLL_PIPELINE_ALLREDUCE_SEGMENTS_SIZE
    • 显式设置全局聚合操作中GPU流水线每阶段的数据大小(单位:字节)。
    • 语法: I_MPI_OFFLOAD_COLL_PIPELINE_ALLREDUCE_SEGMENTS_SIZE =<arg>
    • <value>
      • 正整数:管道中每次迭代的数据字节数。
      • -1:由英特尔MPI库在运行时动态设置最优大小。此为默认值。
  • I_MPI_OFFLOAD_RDMA
    • 设置此环境变量以启用GPU RDMA。
    • 语法: I_MPI_OFFLOAD_RDMA =<value>
    • <value>
      • 0:禁用RDMA。此为默认值。
      • 1:启用RDMA。
    • 说明:设置此环境变量可启用基于GPU RDMA的GPU直连传输。当网络支持此功能时,启用该变量可实现两块GPU间的直接数据传输。

    注解

    在设置此环境变量以启用GPU直通传输前,请确保 FI_PROVIDER_PATH 路径中存在支持GPU的提供程序且具备 FI_HMEM 功能。

  • I_MPI_OFFLOAD_FAST_MEMCPY
    • 设置此环境变量以启用/禁用GPU缓冲区的快速内存复制功能。
    • 语法: I_MPI_OFFLOAD_FAST_MEMCPY =<value>
    • <value>
      • 0:禁用快速内存复制。
      • 1:启用快速内存复制。此为默认值。
    • 说明:设置此环境变量以启用/禁用快速内存复制,从而优化小消息尺寸的性能。

    注解

    此功能需要在计算节点上安装GDR库才能支持CUDA后端。有关该库的安装说明,请参阅此GDRCopy相关GitHub存储库。

  • I_MPI_OFFLOAD_IPC
    • 设置此环境变量以启用/禁用GPU IPC。
    • 语法: I_MPI_OFFLOAD_IPC =<value>
    • <value>
      • 0:禁用IPC路径。
      • 1:启用IPC路径。此为默认值。
    • 说明:设置此环境变量以启用/禁用GPU IPC。当系统和设备支持此功能时,启用该环境变量可实现同一节点上两块GPU之间的直接数据传输。
  • I_MPI_OFFLOAD_COPY_COLL_MAX_SIZE
    • 设置此环境变量以控制阈值,超过该阈值时,GPU 缓冲区上的集合操作将使用复制输入/输出。
    • 语法: I_MPI_OFFLOAD_COPY_COLL_MAX_SIZE =<value>
    • <value> :阈值(单位:字节),默认值为 -1(所有大小)。
    • 说明:设置此环境变量可控制消息大小阈值,超过该阈值时GPU缓冲区集合操作将启用复制输入/输出机制。当通过 I_MPI_OFFLOAD_CBWR =0禁用CBWR时,对于消息大小≤ I_MPI_OFFLOAD_COPY_COLL_MAX_SIZE 的情况,集合操作执行前会将GPU缓冲区复制到主机,操作完成后再复制回设备。当启用CBWR模式(默认)时,此环境变量无效。

    注意

    I_MPI_OFFLOAD_COPY_COLL_MAX_SIZE 变量处于技术预览阶段。

  • I_MPI_OFFLOAD_FAST_MEMCPY_COLL
    • 设置此环境变量以控制阈值,超过该阈值时,GPU缓冲区上的集合操作将使用复制进/复制出机制。
    • 语法: I_MPI_OFFLOAD_FAST_MEMCPY_COLL =<value>
    • <value>
      • 0:禁用。
      • 1:启用。GPU缓冲区集合操作在适用时使用快速复制。此为默认值。
    • 说明:设置此环境变量可为GPU缓冲区集合操作启用快速复制功能。

    注意

    I_MPI_OFFLOAD_FAST_MEMCPY_COLL 变量处于技术预览阶段。

  • I_MPI_OFFLOAD_FAST_MEMCPY_COLL_MAX_SIZE
    • 设置此环境变量以控制阈值,超过该阈值时将对 GPU 缓冲区的集合操作使用快速复制。
    • 语法: I_MPI_OFFLOAD_FAST_MEMCPY_COLL_MAX_SIZE =<value>
    • <value> ,阈值(单位:字节),默认值为512。
    • 说明:设置此环境变量可控制消息大小阈值,超过该阈值时GPU缓冲区集合操作将启用快速复制。当通过 I_MPI_OFFLOAD_FAST_MEMCPY_COLL =1启用时,消息大小≤ I_MPI_OFFLOAD_FAST_MEMCPY_COLL_MAX_SIZE 的集合操作将使用快速复制。

    注意

    I_MPI_OFFLOAD_FAST_MEMCPY_COLL_MAX_SIZE 变量处于技术预览阶段。

  • I_MPI_OFFLOAD_ONESIDED_DEVICE_INITIATED
    • 设置此环境变量可启用设备发起式 MPI 单边通信。
    • 语法: I_MPI_OFFLOAD_ONESIDED_DEVICE_INITIATED =<value>
    • <value>
      • 0:禁用。默认值。
      • 1:启用。
    • 说明:设置此环境变量可启用设备发起式MPI单边通信。该功能允许从OpenMP卸载段(支持C和Fortran)或SYCL内核直接调用下列MPI基本操作。
      • MPI_Put
      • MPI_Get
      • MPI_Win_lock
      • MPI_Win_lock_all
      • MPI_Win_unlock
      • MPI_Win_unlock_all
      • MPI_Win_flush/MPI_Win_flush_all
      • MPI_Win_fence
      • MPI_Win_get_group
      • MPI_Group_rank
      • MPI_Group_size
      • MPI_Group_free

    注意

    I_MPI_OFFLOAD_ONESIDED_DEVICE_INITIATED 变量处于技术预览阶段。

    仅支持连续的MPI数据类型。

网络结构控制环境变量
通信网络结构控制
  • I_MPI_FABRICS
    • 选择要使用的特定网络结构(Fabrics)
    • 语法: I_MPI_FABRICS =ofi | shm:ofi | shm
      • shm:共享内存传输(仅用于节点内通信)。
      • ofi:支持OFI(OpenFabrics Interfaces)的网络结构,例如Intel Omni-Path架构(校超算中心的已废弃)、InfiniBand和以太网(通过OFI API实现)。

    常规模式的默认值为shm:ofi,多端点模式的默认值为ofi。多端点模式下,ofi的默认值不可更改。

    • 说明:设置此环境变量以选择特定的组件组合。默认值为常规模式下的shm:ofi和多端点模式下的ofi。在多端点模式下,默认值ofi不可更改。
共享内存控制
  • I_MPI_SHM
    • 选择要使用的共享内存传输方式。
    • 语法: I_MPI_SHM =<transport>

      <transport>

      作用

      disable、no、off、0

      不使用共享内存传输。

      auto

      自动选择共享内存传输方案。

      bdw_sse

      针对Intel微架构代号Broadwell优化的共享内存传输方案,使用SSE4.2指令集。

      bdw_avx2

      针对Intel微架构代号Broadwell优化的共享内存传输方案,使用AVX2指令集。

      skx_sse

      针对基于Intel微架构代号Skylake的Intel XEON CPU优化的共享内存传输方案,使用CLFLUSHOPT和SSE4.2指令集。

      skx_avx2

      针对基于Intel微架构代号Skylake的Intel Xeon CPU优化的共享内存传输方案,使用CLFLUSHOPT和AVX2指令集。

      skx_avx512

      专为基于Intel微架构代号Skylake 的Intel Xeon CPU优化的共享内存传输方案,采用CLFLUSHOPT和AVX512指令集。

      clx_sse

      专为基于Intel微架构代号Cascade Lake 的Intel Xeon CPU优化的共享内存传输方案,采用CLFLUSHOPT和SSE4.2指令集。

      clx_avx2

      专为基于Intel微架构代号Cascade Lake 的Intel Xeon CPU优化的共享内存传输方案,采用CLFLUSHOPT和AVX2指令集。

      clx_avx512

      专为基于Intel微架构代号Cascade Lake 的Intel Xeon CPU优化的共享内存传输方案,采用CLFLUSHOPT和AVX512指令集。

      clx-ap

      专为基于Intel微架构代号Cascade Lake Advanced Performance的Intel Xeon CPU优化的共享内存传输解决方案。

      icx

      专为基于Intel微架构代号Ice Lake的Intel Xeon CPU优化的共享内存传输解决方案。

    • 说明:设置此环境变量可选择特定的共享内存传输方案。自动选择的传输方案:
      • icx:适用于基于Intel微架构代号Ice Lake的Intel Xeon CPU
      • clx-ap:适用于基于Intel微架构代号Cascade Lake Advanced Performance的Intel Xeon CPU
      • bdw_avx2:适用于基于Intel微架构代号Haswell、Broadwell和Skylake的CPU
      • skx_avx2:适用于基于Intel微架构代号Skylake的Intel Xeon CPU
      • ckx_avx2:适用于基于Intel微架构代号Cascade Lake的Intel Xeon CPU
      • knl_mcdram:适用于Intel微架构代号Knights Landing和Knights Mill的CPU
      • bdw_sse:适用于所有其他平台

    I_MPI_SHM 的取值取决于 I_MPI_FABRICS 的设置:若 I_MPI_FABRICS 为ofi,则禁用 I_MPI_SHM ;若 I_MPI_FABRICS 为shm:ofi,则 I_MPI_SHM 默认设置为auto或采用指定值。

  • I_MPI_SHM_CELL_FWD_SIZE
    • 更改共享内存前向单元大小。
    • 语法: I_MPI_SHM_CELL_FWD_SIZE =<nbytes>
    • <nbytes> :共享内存前向单元大小(单位:字节)默认值 <nbytes> 取决于使用的传输机制,通常应在64K至1024K之间。
    • 说明:向前单元是用于发送少量数据的缓存内消息缓冲单元。建议使用较小值。设置此环境变量可定义共享内存传输中转发单元的大小。
  • I_MPI_SHM_CELL_EXT_SIZE
    • 更改共享内存扩展单元大小。
    • 语法: I_MPI_SHM_CELL_FWD_SIZE =<nbytes>
    • <nbytes> :共享内存扩展单元大小(单位:字节)默认值 <nbytes> 取决于使用的传输机制,通常应在64K至1024K之间。
    • 说明:扩展单元是用于发送大量数据的缓存外消息缓冲单元。建议设置较大值。通过设置此环境变量,可在共享内存传输中定义后向单元的大小。
  • I_MPI_SHM_CELL_FWD_NUM
    • 更改共享内存传输中的前向单元数量(每秩,Rank)。
    • 语法: I_MPI_SHM_CELL_FWD_NUM =<num>
    • <num> :共享内存前向单元数量,默认值取决于使用的传输方式,通常应在4到16之间。
    • 说明:设置此环境变量以定义共享内存传输中的前向单元数量。
  • I_MPI_SHM_CELL_BWD_NUM
    • 更改共享内存传输中每个秩的后向单元数量。
    • 语法: I_MPI_SHM_CELL_FWD_NUM =<num>
    • <num> :共享内存后向单元数量,默认值取决于使用的传输方式,通常应在4到16之间。
    • 说明:设置此环境变量以定义共享内存传输中的后向单元数量。
  • I_MPI_SHM_CELL_EXT_NUM_TOTAL
    • 更改共享内存传输中扩展单元总数。
    • 语法: I_MPI_SHM_CELL_EXT_NUM_TOTAL =<num>
    • <num> :共享内存后向单元数量,默认值取决于使用的传输方式,通常范围为2K至8K。
    • 说明:设置此环境变量以定义共享内存传输中的扩展单元数量。
  • I_MPI_SHM_CELL_FWD_HOLD_NUM
    • 更改共享内存传输中保留前向单元数量(每秩)。
    • 语法: I_MPI_SHM_CELL_FWD_HOLD_NUM =<num>
    • <num> :共享内存后向单元数量,默认值取决于使用的传输方式,通常范围为2K至8K。
    • 说明:设置此环境变量以定义每个秩在共享内存传输中可同时持有的前向单元数量。推荐值为1至8之间的2的幂次方。
  • I_MPI_SHM_MCDRAM_LIMIT
    • 更改绑定到多通道DRAM(MCDRAM)的共享内存大小(每秩的大小)。
    • 语法: I_MPI_SHM_MCDRAM_LIMIT =<nbytes>
    • <nbytes> :每秩绑定到MCDRAM的共享内存大小,1048576为默认值。
    • 说明:设置此环境变量以定义每个秩允许用于共享内存传输的MCDRAM内存量。该变量仅在I_MPI_SHM=knl_mcdram时生效。
  • I_MPI_SHM_SEND_SPIN_COUNT
    • 控制发送消息时共享内存传输的自旋计数值。
    • 语法: I_MPI_SHM_SEND_SPIN_COUNT =<count>
    • <count> :定义自旋计数值,典型值范围为1至1000。
    • 说明:若接收方输入缓冲区已满,发送方可能被阻塞直至达到此自旋计数值。发送小消息时此机制无效。
  • I_MPI_SHM_RECV_SPIN_COUNT
    • 控制共享内存传输接收消息时的自旋计数值。
    • 语法: I_MPI_SHM_RECV_SPIN_COUNT =<count>
    • <count> :定义自旋计数值,典型值范围为1至1000000。
    • 说明:若接收操作为非阻塞模式,此自旋计数仅用于安全地重新排序预期消息与意外消息。它对接收小消息没有任何影响。
  • I_MPI_SHM_FILE_PREFIX_4K
    • 更改共享内存文件创建所在的4KB页面大小文件系统(tmpfs)的挂载点。
    • 语法: I_MPI_SHM_FILE_PREFIX_4K =<path>
    • <path> :定义现有4KB页面文件系统(tmpfs)挂载点的路径。默认该路径未设置。
    • 说明:设置此环境变量可定义共享内存文件的新路径。默认情况下,共享内存文件创建于/dev/shm/。此变量影响共享内存传输缓冲区和RMA窗口。
  • I_MPI_SHM_FILE_PREFIX_2M
    • 更改共享内存文件创建所在的2MB页面大小文件系统(hugetlbfs)的挂载点。
    • 语法: I_MPI_SHM_FILE_PREFIX_2M =<path>
    • <path> :定义现有2MB页面大小文件系统(hugetlbfs)的挂载点路径。默认情况下未设置路径。
    • 说明:设置此环境变量可在Intel MPI库中启用2MB大页面。该变量影响共享内存传输缓冲区。若RMA窗口大小大于或等于2MB,则可能同时影响RMA窗口。
  • I_MPI_SHM_FILE_PREFIX_1G
    • 更改共享内存文件创建所在的1GB页面大小文件系统(hugetlbfs)的挂载点。
    • 语法: I_MPI_SHM_FILE_PREFIX_1G =<path>
    • <path> :定义现有1GB页面大小文件系统(hugetlbfs)的挂载点路径。默认情况下未设置路径。
    • 说明:设置此环境变量可在英特尔MPI库中启用1GB大页面。该变量影响共享内存传输缓冲区。若RMA窗口大小大于或等于1GB,则可能同时影响RMA窗口。
支持OFI的网络结构控制
  • I_MPI_OFI_PROVIDER
    • 定义要加载的OFI提供程序名称。
    • 语法: I_MPI_OFI_PROVIDER =<name>
    • <name> :要加载的OFI提供程序名称
    • 说明:设置此环境变量以定义要加载的OFI提供程序名称。若未指定此变量,OFI库将自动选择提供程序。可通过 I_MPI_OFI_PROVIDER_DUMP 环境变量查看所有可用提供程序。若为可用提供程序设置了错误名称,请使用 FI_LOG_LEVEL =debug获取正确设置名称的提示。
  • I_MPI_OFI_PROVIDER_DUMP
    • 控制从OFI库打印所有OFI提供程序及其属性的信息功能。
    • 语法: I_MPI_OFI_PROVIDER_DUMP =<arg>
    • <arg>
      • enable、yes、on、1 :从OFI库打印所有OFI提供程序及其属性的列表
      • disable、no、off、0:不执行任何操作。此为默认值
    • 说明:设置此环境变量可控制从OFI库打印所有OFI提供者及其属性的信息功能。
  • I_MPI_OFI_DRECV
    • 控制OFI结构中直接接收的功能。
    • 语法: I_MPI_OFI_DRECV =<arg>
    • <arg>
      • enable、yes、on、1:启用直接接收。此为默认值
      • disable、no、off、0:禁用直接接收
    • 说明:仅使用直接接收功能阻塞MPI_Recv调用。启用前请确保仅在单线程MPI应用中使用,并通过设置 I_MPI_FABRICS =ofi确认已选择OFI作为网络结构。
  • I_MPI_OFI_MATCH_COMPLETE
    • 控制所有提供商在OFI结构中匹配完成功能的启用状态(如适用)。
    • 语法: I_MPI_OFI_MATCH_COMPLETE =<arg>
    • <arg>
      • enable、yes、on、1:启用匹配完成功能(如适用)。此为默认值
      • disable、no、off、0:禁用匹配完成功能
  • I_MPI_OFI_LIBRARY_INTERNAL
    • 控制是否使用Intel MPI 库提供的libfabric库。
    • 语法: I_MPI_OFI_LIBRARY_INTERNAL =<arg>
    • <arg>
      • enable、yes、on、1:使用Intel MPI库中的libfabric
      • disable、no、off、0:不使用Intel MPI库中的libfabric
    • 说明:设置此环境变量以禁用或启用Intel MPI库中的libfabric。该变量必须在执行 vars.sh 脚本前设置。
  • I_MPI_OFI_TAG_DYNAMIC
    • 启用动态标签分区。
    • 语法: I_MPI_OFI_TAG_DYNAMIC =<arg>
    • <arg>
      • enable、yes、on、1:启用自动OFI标签分区
      • disable、no、off、0:使用静态OFI标签布局。此为默认值
    • 说明:设置此环境变量可根据运行配置启用动态OFI Netmod标签分区。可用于扩展MPI标签空间或提升大规模运行中的可扩展性。
用于异步进度控制的环境变量
  • I_MPI_ASYNC_PROGRESS
    • 控制进度线程的使用。
    • 语法: I_MPI_ASYNC_PROGRESS =<arg>
    • <arg>
      • enable、yes、on、1:禁用每个级别的异步进度线程。此为默认值。
      • disable、no、off、0:启用异步进度线程。
    • 说明:设置此环境变量以启用异步进度。若禁用,则忽略所有 I_MPI_ASYNC_PROGRESS_ 控制开关。
  • I_MPI_ASYNC_PROGRESS_THREADS
    • 控制异步进度线程的数量。
    • 语法: I_MPI_ASYNC_PROGRESS_THREADS =<arg>
    • <nthreads> :定义进度线程数量。默认值为1。
    • 说明:设置此环境变量以控制每个秩的异步进度线程数量。
  • I_MPI_ASYNC_PROGRESS_PIN
    • 控制异步进度线程的绑定。
    • 语法: I_MPI_ASYNC_PROGRESS_PIN =<arg>
    • <arg> :以,分隔的逻辑CPU列表,CPU列表将本地进程的所有进度线程绑定至列出的CPU。默认情况下,N个进度线程绑定至最后N个逻辑CPU。
    • 说明:设置此环境变量以控制本地进程所有进度线程的绑定。
  • I_MPI_ASYNC_PROGRESS_ID_KEY
    • 设置用于显式定义通信器进度线程标识符的MPI信息对象键。
    • 语法: I_MPI_ASYNC_PROGRESS_ID_KEY =<arg>
    • <key> :MPI信息对象键。默认值为thread_id。
    • 说明:设置此环境变量以控制用于定义通信器进度线程ID的MPI信息对象键。进度线程ID用于在进度线程之间分配工作。默认情况下,通信通过第一个进度线程进行。
多端点(Multi-EP)环境变量
  • I_MPI_THREAD_SPLIT
    • 语法: I_MPI_THREAD_SPLIT =<value>
    • <value>
      • disable、no、off、0:禁用 MPI_THREAD_SPLIT 模型支持。此为默认值。
      • enable、yes、on、1:启用 MPI_THREAD_SPLIT 模型支持。
    • 说明: 使用此环境变量控制 I_MPI_THREAD_SPLIT 编程模型。
  • I_MPI_THREAD_RUNTIME
    • 语法: - I_MPI_THREAD_RUNTIME =<value>
    • <value>

      线程运行时

      generic

      启用运行时支持(如pthreads、TBB)。若运行时无法检测到OpenMP,则此为默认值。

      openmp

      启用 OpenMP 运行时支持。若运行时检测到OpenMP,则此为默认值。

    • 说明:使用此环境变量控制线程运行时支持。
  • I_MPI_THREAD_MAX
    • 语法: I_MPI_THREAD_MAX =<int>
    • <int> :每个秩的最大线程数。若 I_MPI_THREAD_RUNTIME 设置为openmp,则默认值为omp_get_max_threads();否则默认值为1。
    • 说明:使用此环境变量设置每个进程中可并发使用的最大线程数。
  • I_MPI_THREAD_ID_KEY
    • 语法: I_MPI_THREAD_ID_KEY =<string>
    • <string> :定义MPI信息对象键。默认值为thread_id。
    • 说明:使用此环境变量设置MPI信息对象键,用于显式定义逻辑线程编号thread_id。
Hydra环境、进程固定、NIC绑定等

参见官方手册。

编译举例

对于MPI并行程序,对应不同类型源文件的编译命令如下:

  • 调用默认C编译器将C语言的MPI并行程序 yourprog-mpi.c 编译为可执行文件 yourprog-mpi

    mpicc -o yourprog-mpi yourprog-mpi.c

  • 调用Intel C编译器将C语言的MPI并行程序 yourprog-mpi.c 编译为可执行文件 yourprog-mpi

    mpiicx -o yourprog-mpi yourprog-mpi.cpp

  • 调用Intel C++编译器将C++语言的MPI并行程序 yourprog-mpi.cpp 编译为可执行文件 yourprog-mpi

    mpiicpx -o yourprog-mpi yourprog-mpi.cpp

  • 调用GNU Forttan编译器将Fortran 77语言的MPI并行程序 yourprog-mpi.f 编译为可执行文件 yourprog-mpi

    mpif90 -o yourprog-mpi yourprog-mpi.f

  • 调用Intel Fortran编译器将Fortran 90语言的MPI并行程序 yourprog-mpi.f90 编译为可执行文件 yourprog-mpi

    mpiifx -o yourprog-mpi yourprog-mpi.f90

调试

使用以下命令对Intel MPI库调用GDB调试器:

mpirun -gdb -n 4 ./testc

可以像使用GDB调试串行程序一样调试。

也可以使用以下命令附着在一个运行中的作业上:

mpirun -n 4 -gdba <pid>

其中<pid>为运行中的MPI作业进程号。

环境变量 I_MPI_DEBUG 提供一种获得MPI应用运行时信息的方式。可以设置此变量的值从0到1000,值越大,信息量越大。

mpirun -genv I_MPI_DEBUG 5 -n 8 ./my_application

更多信息参见程序调试章节。

追踪

使用 -t-trace 选项链接调用Intel Trace Collector库生成可执行程序。此与当在 mpiicc 或其它编译脚本中使用 -profile=vt 时具有相同的效果。

mpiicc -trace test.c -o testc

在环境变量 VT_ROOT 中包含用Intel Trace Collector库路径以便使用此选项。设置 I_MPI_TRACE_PROFILE 为<profile_name>环境变量指定另一个概要库。如设置 I_MPI_TRACE_PROFILE 为vtfs,以链接fail-safe版本的Intel Trace Collector库。

正确性检查

使用 -check_mpi 选项调用Intel Trace Collector正确性检查库生成可执行程序。此与当在 mpiicc 或其它编译脚本中使用 -profile=vtmc 时具有相同的效果。

mpiicc -profile=vtmc test.c -o testc

mpiicc -check_mpi test.c -o testc

在环境变量 VT_ROOT 中包含用Intel Trace Collector库路径以便使用此选项。设置 I_MPI_CHECK_PROFILE 为<profile_name>环境变量指定另一个概要库。

统计收集

如果想收集在应用使用的MPI函数统计,可以设置 I_MPI_STATS 环境变量的值为1到10。设置好后再运行MPI程序,则在 stats.txt 文件中存储统计信息。

与编译器相关的编译选项

MPI编译环境的编译命令实际上是调用Intel、PGI或GCC编译器进行编译,具体优化选项等,请参看Intel MPI、Open MPI以及Intel、PGI和GCC编译器手册。

MPI并行程序的运行

MPI程序最常见的并行方式类似为: mpirun -n 40 yourmpi-prog

在本超算系统上,MPI并行程序需结合Slurm作业调度系统的作业提交命令 sbatchsrunsalloc 等来调用作业脚本运行,请参看。