NVSHMEM


NVSHMEM™ 是一个基于 OpenSHMEM 的并行编程接口 为 NVIDIA GPU 集群提供高效且可扩展的通信。NVSHMEM 为 数据跨越多个 GPU 的显存,并且可以通过细粒度 GPU 初始化进行访问 操作、CPU 发起的操作以及 CUDA® 流上的操作。


下载 NVSHMEM 文档 版本说明 GitHub NVSHMEM API 指南

消息传递接口 (MPI) 等现有通信模型使用 CPU 编排数据传输。相比之下,NVSHMEM 使用 GPU 发起的异步数据传输,从而消除 CPU 和 GPU 之间的同步用度。

高效、强扩展

NVSHMEM 支持包含通信和计算的长时间运行内核,从而减少用度 在强扩展时可能会限制应用程序的性能。

低用度

单侧通信基元允许启动进程或 GPU 线程 指定完成数据传输所需的所有信息。这种低用度模型支持多个 GPU 以便高效沟通。

自然异步

异步通信使程序员能够更轻松地交错计算和通信, 从而提高应用程序的整体性能。



NVSHMEM 3.4 的新功能

  • 在 IB 传输中添加了对数据直接网卡配置的支持。- 添加了新的环境变量`NVSHMEM_DISABLE_DATA_DIRECT`,以强制禁用数据直接网卡 (即使存在) 。
  • 新增了对 CPU 辅助 IBGDA 的支持,无需使用 GDRCopy 或 x86 regkey 设置。不支持其他方法的系统将自动回退到这种新方法。它支持在各种系统上使用 IBGDA,而无需管理员干预。
  • 添加了新的环境变量`NVSHMEM_HCA_PREFIX`,以便在以非标准方式命名 HCA 设备的系统上启用 IB 传输 (例如,使用`ipb` 而非`mlx5`) 。
  • 已弃用对组合的`libnvshmem.a` 主机和设备静态库的支持。


主要特性


  • 将多个 GPU 的显存合并到一个可通过以下方式访问的分区全局地址空间中 NVSHMEM API
  • 包含低用度的内核内通信 API,供 GPU 线程使用
  • 包括基于流和 CPU 发起的通信 API
  • 支持 x86 和 Arm 处理器
  • 可与 MPI 和其他 OpenSHMEM 实现互操作


NVSHMEM 的优势


提升性能

卷积是一种计算密集型内核,广泛用于各种应用程序,包括图像 处理、机器学习和科学计算。空间并行化将域分解为 通过最近邻点通信分布在多个 GPU 上的子分区,通常称为 作为光环交换。

在利弗莫尔大型人工神经网络 (LBANN) 深度学习框架中,空间并行卷积 使用 MPI 和 NVSHMEM 等多种通信方法实现。基于 MPI 的光晕交换 使用标准的发送和接收基元,而基于 NVSHMEM 的实现使用单侧放置, 显著提升了劳伦斯利弗莫尔国家实验室的性能 Sierra 超级计算机


Sierra 超级计算机上的高效强扩展



在 NVIDIA DGX SuperPOD 上实现高效的强扩展

加快解决问题的速度

要缩短高性能科学计算工作负载的解决方案时间,通常需要 强扩展应用程序。QUDA 是一个用于在 GPU 上运行晶格量子色动力学 (QCD) 的库 由热门的 MIMD 格点计算 (MILC) 和 Chroma 代码使用。

支持 NVSHMEM 的 QUDA 可避免通信中的 CPU-GPU 同步,从而减少关键路径 并显著提高强扩展效率。

观看 GTC 2020 演讲



简化开发

共梯度 (CG) 方法是求解线性方程组的常用数值方法, CGSolve 是 Kokkos 编程模型中这种方法的实现。CGSolve 内核 展示了将 NVSHMEM 用作 Kokkos 等更高级别的编程模型的构建块。

NVSHMEM 使用 Kokkos 全局阵列数据结构实现高效的多节点和多 GPU 执行 无需显式代码即可在 GPU 之间进行通信。因此,支持 NVSHMEM 的 Kokkos 与使用 MPI 和 CUDA 相比,显著简化了开发。


Kokkos CGSolve 的高效编程


准备好开始使用 NVSHMEM 进行开发了吗?


开始使用