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 的系统的
fcollect
、reducescatter
和reduce
操作。消除了 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=pmi2
和NVSHMEM_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_quiet
和nvshmem_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_bw
、shmem_g_bw
、shmem_atomic_bw
、shmem_put_bw
和shmem_get_bw
perftest 中不正确的总线带宽报告相关的错误。修复了由于不正确地使用矢量化
float16
而不是uint32
数据类型,导致 NVLS reducescatter 最小值和最大值运算中舍入错误的错误。修复了与动态加载未版本控制的引导程序库相关的错误。
修复了与将 CMake 项目链接到系统安装程序包相关的错误。
修复了与构建异构版本设备库相关的错误。
修复了与在使用动态连接 (DC) 模式时在 IBGDA 传输中建立 QP 连接相关的错误。
修复了与为不支持半精度数据类型(例如,
__nv_bfloat16
)的早期 CUDA 版本(例如,11.8)构建 perftest 相关的错误。修复了与 allreduce maxloc op 的 ABI 兼容性中断相关的错误。
修复了与背靠背混合使用
nvshmemx_team_split_strided
和nvshmemx_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_get
与nvshmem_barrier
。主机端
nvshmem_put_on_stream/nvshmem_get_on_stream
。
当使用
NVSHMEM_REMOTE_TRANSPORT=UCX
启用 UCX 远程传输时,在 DGX-2 平台上扩展 32 个或更多 PE 时,可能会观察到数据不匹配。