NVSHMEM™ is a parallel programming interface based on OpenSHMEM that provides efficient and scalable communication for NVIDIA GPU clusters. NVSHMEM creates a global address space for data that spans the memory of multiple GPUs and can be accessed with fine-grained GPU-initiated operations, CPU-initiated operations, and operations on CUDA® streams.
Efficient, Strong Scaling
NVSHMEM enables long-running kernels that include both communication and computation, reducing overheads that can limit an application’s performance when strong scaling.
One-sided communication primitives reduce overhead by allowing the initiating process or GPU thread to specify all information required to complete a data transfer. This low-overhead model enables many GPU threads to communicate efficiently.
Asynchronous communications make it easier for programmers to interleave computation and communication, thereby increasing overall application performance.
What's new in NVSHMEM 2.2.1
- Implemented dynamic heap memory allocation for runs with P2P GPUs.
- This feature, which requires CUDA version 11.3 or later, can be enabled using NVSHMEM_DISABLE_CUDA_VMM=0. Support for IB runs will be added in the next release
- Improved UCX transport performance for AMO and RMA operations.
- Improved performance for warp and block put/get operations.
- Added atomic support for PCIe-connected GPUs over the UCX transport.
- The UCX transport now supports non-symmetric buffers for use as local buffers in RMA and AMO operations.
- Added support to initialize NVSHMEM in CUmodule.
- Enabled MPI and PMIx bootstrap modules to be compiled externally from the NVSHMEM build.
- This allows multiple builds of these plugins to support various MPI and PMIx libraries. To select the plugins, set NVSHMEM_BOOTSTRAP="plugin" and NVSHMEM_BOOTSTRAP_PLUGIN="plugin_name.so".
- Enabled MPI bootstrap to be used with nvshmem_init.
- You can set NVSHMEM_BOOTSTRAP=MPI or use the bootstrap plugin method.
- Fixed bugs in nvshmem_<typename>_g and the fetch atomics implementation.
- Changed nvshmem_<typename>collect to nvshmem<typename>_fcollect to match OpenSHMEM specification
- Fixed a type of nreduce argument in the reduction API to size_t to match the OpenSHMEM specification.
- Improved NVSHMEM build times with a multi-threaded option in the CUDA compiler (requires CUDA version 11.2 and later).
Note:The plugin sources are installed with the compiled NVSHMEM library.
- Combines the memory of multiple GPUs into a partitioned global address space that’s accessed through NVSHMEM APIs
- Includes a low-overhead, in-kernel communication API for use by GPU threads
- Includes stream-based and CPU-initiated communication APIs
- Supports x86 and POWER9 processors
- Is interoperable with MPI and other OpenSHMEM implementations
Convolution is a compute-intensive kernel that’s used in a wide variety of applications, including image processing, machine learning, and scientific computing. Spatial parallelization decomposes the domain into sub-partitions that are distributed over multiple GPUs with nearest-neighbor communications, often referred to as halo exchanges.
In the Livermore Big Artificial Neural Network (LBANN) deep learning framework, spatial-parallel convolution is implemented using several communication methods, including MPI and NVSHMEM. The MPI-based halo exchange uses the standard send and receive primitives, whereas the NVSHMEM-based implementation uses one-sided put, yielding significant performance improvements on Lawrence Livermore National Laboratory’s Sierra supercomputer.
Efficient Strong-Scaling on Sierra Supercomputer
Efficient Strong-Scaling on NVIDIA DGX SuperPOD
Accelerate Time to Solution
Reducing the time to solution for high-performance, scientific computing workloads generally requires a strong-scalable application. QUDA is a library for lattice quantum chromodynamics (QCD) on GPUs, and it’s used by the popular MIMD Lattice Computation (MILC) and Chroma codes.
NVSHMEM-enabled QUDA avoids CPU-GPU synchronization for communication, thereby reducing critical-path latencies and significantly improving strong-scaling efficiency.
The conjugate gradient (CG) method is a popular numerical approach to solving systems of linear equations, and CGSolve is an implementation of this method in the Kokkos programming model. The CGSolve kernel showcases the use of NVSHMEM as a building block for higher-level programming models like Kokkos.
NVSHMEM enables efficient multi-node and multi-GPU execution using Kokkos global array data structures without requiring explicit code for communication between GPUs. As a result, NVSHMEM-enabled Kokkos significantly simplifies development compared to using MPI and CUDA.
Productive Programming of Kokkos CGSolve
- Introductory Webinar
- NVSHMEM Documentation
- NVSHMEM API Documentation
- OpenSHMEM Specification
- For questions or to provide feedback, please contact email@example.com
- Related libraries and software:
Ready to start developing with NVSHMEM?