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=
调整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=
启用卸载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=
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=
注:由于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/ucx 、 http://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 =
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:
存到一个文件中,具有以下替换:%h: host, %p:pid, %c:cpu, %t: time, %e:exe,如文件名有%h,则自动替换为节点名
stderr
显示标准错误信息
stdout
显示标准输出
udp:
通过UDP协议发送到host:port
比如:
export UCX_STATS_DEST="file:ucx_%h_%e_%p.stats"
export UCX_STATS_DEST="stdout"
触发器通过 UCX_STATS_TRIGGER 环境变量设置,其值可以为下述之一:
exit
在程序退出前存储统计信息
timer:
每隔一定时间存储统计信息
signal:
当进程收到信号时存储统计信息
比如:
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
用于强制连接生成的参数¶
通常,SHMEM会在PE间消极地生成连接,一般是在第一个通信发生时。
开始时就强制连接生成,设定MCA参数:
-mca shmem_preconnect_all 1
内存注册器(如,infiniband rkeys)信息启动时会在进程间交换。
启用按需内存密钥(key)交换,可设置MCA参数:
-mca shmalloc_use_modex 0