NVIDIA® NVSHMEM 3.2.5 发行说明#

NVSHMEM 是 NVIDIA GPU 的 OpenSHMEM 规范的实现。NVSHMEM 编程接口在 NVIDIA GPU 集群上实现了一个分区全局地址空间 (PGAS) 模型。NVSHMEM 提供了一个易于使用的接口来分配在 GPU 之间对称分布的内存。除了 CPU 端接口外,NVSHMEM 还提供了一个 NVIDIA CUDA® 内核端接口,允许 NVIDIA CUDA® 线程访问对称分布内存中的任何位置。

发行说明描述了 NVIDIA® NVSHMEM 3.2.5 及更早版本的关键特性、软件增强和改进以及已知问题。

主要特性和增强功能#

此 NVSHMEM 版本包括以下主要特性和增强功能

  • 在 NVLINK5 连接的基于 B200 的系统上启用对 Blackwell SM100 架构的平台支持。

  • 在支持 NVLINK4 和 NVLINK5 的平台上,为半精度 (float16, bfloat16) 和全精度 (float32) 数据类型添加了单次和两次 NVLINK SHARP (NVLS) allreduce 算法。

  • 添加了自动多 SM 加速的流上集合通信 (fcollect, reducescatter, reduce),以提高 NVLINK4 和 NVLINK5 启用平台上的 NVLINK 带宽,从而与之前的实现相比,在中到大消息大小 (>=1MB) 时实现 8 倍/16 倍的加速。

  • 添加了一个新的符合 LLVM IR 的位代码设备库,以支持新的和即将推出的 Python DSL(Triton、Mosaic、Numba 等)上符合 MLIR 的编译器工具链集成。此功能增强了 perftest,以使用运行时配置 NVSHMEM_TEST_CUBIN_LIBRARY 启用对符合 LLVM IR 的位代码设备库的测试。

  • 通过引入新的命令行界面工具来改进测试参数(例如消息大小、数据类型、reduce op、迭代等)的运行时可调性,从而增强了 NVSHMEM 主机/设备端集合通信和点对点操作。

  • 改进了流上 NVLS 集合通信自动选择的启发式方法,用于跨越 NVLINK 连接的基于 GPU 的系统的 fcollectreducescatterreduce 操作。

  • 消除了 perftest 和示例中对 MPI 和 SHMEM 的动态链接时依赖性,并用动态加载时功能替换了它们。

  • 当 GPU 通过远程互连(IB/RoCE/EFA/等)连接时,为基于环的 allreduce 操作添加了新示例。

  • 当 GPU 通过 P2P 互连 (NVLINK) 连接时,为融合的 alltoall 和 allgather 操作(专家混合模型中常见)添加了新示例。

  • 修复了几个小错误和内存泄漏。

兼容性#

NVSHMEM 3.2.5 已使用以下各项进行测试

NVIDIA CUDA® 工具包

  • 11.8

  • 12.2

  • 12.8

CPU

  • x86 和 NVIDIA GraceTM 处理器上。

GPU

  • Volta V100

  • Ampere A100

  • NVIDIA HopperTM

  • Blackwell B200

局限性#

  • NVSHMEM 与 Cray 系统上的 PMI 客户端库不兼容,必须使用 NVSHMEM 内部 PMI-2 客户端库。

    • 可以通过向 Slurm 指定 --mpi=pmi2NVSHMEM_BOOTSTRAP_PMI=PMI-2 或直接使用 MPI 或 SHMEM 引导程序来使用 PMI 引导程序启动作业。

    • 通过在构建 NVSHMEM 时设置 NVSHMEM_DEFAULT_PMI2=1,也可以将 PMI-2 设置为默认 PMI。

  • libfabric 传输尚不支持 VMM,因此请通过设置 NVSHMEM_DISABLE_CUDA_VMM=1 禁用 VMM。

  • 具有 PCIe 对等通信的系统需要以下其中一项

    • InfiniBand 以支持 NVSHMEM 原子 API。

    • 使用 NVSHMEM 的 UCX 传输,如果不存在 IB,它将使用套接字进行原子操作。

  • nvshmem_barrier*nvshmem_quietnvshmem_wait_until 仅确保源 PE 和目标 PE 之间的排序和可见性,确保全局排序和可见性。

  • 当使用 GDRcopy 构建,并且在早期版本的 460 驱动程序和之前的分支上使用 Infiniband 时,NVSHMEM 无法分配完整的设备内存,因为无法重用 BAR1 空间。这已在最新的 NVIDIA CUDA® 最新 460 驱动程序以及 470 及更高版本中修复。

  • 在此版本中,NVIDIA Grace HopperTM 系统上的 IBGDA 传输支持是实验性的。

  • IBGDA 不适用于 DMABUF。

  • 当链路层为以太网 (RoCE) 时,IBGDA 不适用于 CX-4。

  • Grace + Ada L40 平台上不支持 NVSHMEM。

已修复的问题#

  • 修复了与 shmem_p_bwshmem_g_bwshmem_atomic_bwshmem_put_bwshmem_get_bw perftest 中不正确的总线带宽报告相关的错误。

  • 修复了由于不正确地使用矢量化 float16 而不是 uint32 数据类型,导致 NVLS reducescatter 最小值和最大值运算中舍入错误的错误。

  • 修复了与动态加载未版本控制的引导程序库相关的错误。

  • 修复了与将 CMake 项目链接到系统安装程序包相关的错误。

  • 修复了与构建异构版本设备库相关的错误。

  • 修复了与在使用动态连接 (DC) 模式时在 IBGDA 传输中建立 QP 连接相关的错误。

  • 修复了与为不支持半精度数据类型(例如,__nv_bfloat16)的早期 CUDA 版本(例如,11.8)构建 perftest 相关的错误。

  • 修复了与 allreduce maxloc op 的 ABI 兼容性中断相关的错误。

  • 修复了与背靠背混合使用 nvshmemx_team_split_stridednvshmemx_barrier_all_on_stream 操作时发生不确定性挂起的错误。

  • 修复了与在具有 > 8 个 NVLINK 连接 GPU 的平台上基于动态设备内存的对称堆预留期间发生的内存不足 (OOM) 相关的错误。

  • 修复了与使用唯一 ID 初始化 NVSHMEM 时不正确使用 MPI_Bcast 和未版本控制的 nvshmemx_init_attr_t 结构相关的文档错误。

重大更改#

此版本中没有重大更改。

已弃用的功能#

此版本中没有已弃用的功能。

已知问题#

  • 当前不支持通过在编译时设置 NVSHMEM_COMPLEX_SUPPORT 启用的复杂类型。

  • 当使用 NVSHMEM_LIBFABRIC_PROVIDER=EFA 启用 libfabric 传输时,某些操作是实验性的,可能会导致应用程序内核挂起,出现以下操作

    • 设备端 nvshmem_put/nvshmem_getnvshmem_barrier

    • 主机端 nvshmem_put_on_stream/nvshmem_get_on_stream

  • 当使用 NVSHMEM_REMOTE_TRANSPORT=UCX 启用 UCX 远程传输时,在 DGX-2 平台上扩展 32 个或更多 PE 时,可能会观察到数据不匹配。