NVIDIA® NVSHMEM 3.1.7 Release Notes#
NVSHMEM is an implementation of the OpenSHMEM specification for NVIDIA GPUs. The NVSHMEM programming interface implements a Partitioned Global Address Space (PGAS) model across a cluster of NVIDIA GPUs. NVSHMEM provides an easy-to-use interface to allocate memory that is symmetrically distributed across GPUs. In addition to a CPU-side interface, NVSHMEM also provides an NVIDIA CUDA® kernel-side interface that allows NVIDIA CUDA® threads to access any location in the symmetrically distributed memory.
The release notes describe the key features, software enhancements and improvements, and known issues for NVIDIA® NVSHMEM 3.1.7 and earlier releases.
Key Features and Enhancements#
This NVSHMEM release includes the following key features and enhancements:
Added support for NVLINK SHARP (NVLS)-based collective algorithms on x86, Hopper, and Grace Hopper architecture-based single- and multi-node NVLINK platforms for popular deep-learning collective communications (ReduceScatter, Allgather, and Allreduce) device and on-stream APIs. This feature improves latency for small messages by a 2-3x speedup compared with one-shot algorithms over NVLINK.
Added support for GPU kernels that want to use a low-level query API to NVLS-enabled symmetric memory using the
nvshmemx_mc_ptrhost and device APIs for a given targetteam.Added support for a new low-latency protocol (LL128) for Allgather collective communication device and on-stream APIs.
Enhanced support for the existing low-latency protocol (LL) warp-scoped collective to provide a 2x speedup over traditional algorithms when scaling the number of GPUs up to 32.
Added support for the half-precision (FP16/BF16) format on collective communication (ReduceScatter, Allgather, and Allreduce) on-device and on-stream APIs.
Added support for Python wheels using the PyPI repository and rpm/deb package distributions.
Added support for dynamic RDMA Global Identifier (GID) discovery for RoCE transports. This feature enables automatic fallback to the discovered GID without requiring users to specify the GID using a runtime variable.
Added support for a heterogeneous library build system. This feature allows the NVSHMEM static library to be built with a separate CUDA version from the NVSHMEM host library. This enables new features, such as NVLS in the host library, and allows applications compiled against lower versions of CUDA to link to the NVSHMEM device library. This makes the entire library portable to different CUDA minor versions and remain feature-complete. Users can specify a CUDA version for the device library by setting
NVSHMEM_DEVICELIB_CUDA_HOME=<PATH TO CUDA>. Otherwise, the host CUDA version will be used.Enhanced support for NVSHMEM on-stream signal APIs to use
cuStreamWriteValueover P2P-connected GPUs when possible. This enables a zero-SM implementation of the on-stream signaling op.Added support for DMABuf-based registration of NIC control structures in IBGDA to leverage DMABuf mainline support in newer Linux kernels over the proprietary solution nvidia-peermem.
Added sample code for the NVSHMEM UniqueID (UID) socket-based bootstrap modality under the
examplesdirectory.Added support for NVSHMEM performance benchmarks to the release binary packages.
Enhanced collectives performance reporting by adding the Algorithmic Bandwidth (algoBW) and Bus Bandwidth (BusBW) metrics to the NVSHMEM performance benchmarks.
Enhanced the reduce-based collective symmetric memory scratch space to 512 KB to accommodate the additional space required for
reducescatter-based collectives.Fixed support for the Ninja build generator in the CMake build system.
Added support for the symmetric memory management unit test framework.
Fixed several minor bugs and memory leaks.
Compatibility#
NVSHMEM 3.1.7 has been tested with the following:
NVIDIA CUDA® Toolkit:
11.8
12.2
12.6
CPUs
On x86 and NVIDIA GraceTM processors.
GPUs
Volta V100
Ampere A100
NVIDIA HopperTM
Limitations#
NVSHMEM is not compatible with the PMI client library on Cray systems and must use the NVSHMEM internal PMI-2 client library.
Jobs can be launched with the PMI bootstrap by specifying
--mpi=pmi2to Slurm andNVSHMEM_BOOTSTRAP_PMI=PMI-2or directly by using the MPI or SHMEM bootstraps.PMI-2 can also be set as the default PMI by setting
NVSHMEM_DEFAULT_PMI2=1when building NVSHMEM.
The libfabric transport does not yet support VMM, so VMM must be disabled by setting
NVSHMEM_DISABLE_CUDA_VMM=1.Systems with PCIe peer-to-peer communication require one of the following:
InfiniBand to support NVSHMEM atomics APIs.
Using NVSHMEM’s UCX transport that, if IB is absent, will use sockets for atomics.
nvshmem_barrier*,nvshmem_quiet, andnvshmem_wait_untilonly ensure ordering and visibility between the source and destination PEs and do not ensure global ordering and visibility.When built with GDRcopy and when using InfiniBand on earlier versions of the 460 driver and previous branches, NVSHMEM cannot allocate the complete device memory because it cannot reuse the BAR1 space. This was fixed in the latest NVIDIA CUDA® 460 driver and in release 470 and later.
IBGDA transport support on NVIDIA Grace HopperTM systems is experimental in this release.
IBGDA does not work with DMABUF.
IBGDA does not work with CX-4 when the link layer is Ethernet (RoCE).
NVSHMEM is not supported on Grace + Ada L40 platforms.
Fixed Issues#
Fixed a bug related to the incorrect use of the
NVSHMEM_DEVICE_TIMEOUT_POLLLINGbuild-time variable.Fixed a performance bug in the on-stream collectives perf test related to using
cudaMemcpyAsyncon the same CUDA stream, wherecudaEventis used to profile the start and end times of the on-stream communication kernel.Fixed a bug related to virtual member functions of
nvshmemi_symmetric_heapby forcing its access specifier toprotectedto limit access to inherited child classes only.Fixed a bug related to recursive destructor memory corruption and
nullptraccess in the static member function of thenvshmemi_mem_transportclass.Fixed a bug related to the incorrect compile-time definitions for the
NVML_GPU_FABRIC_STATE_COMPLETEDandNVML_GPU_FABRIC_UUID_LENconstants.Fixed a bug related to
nvshmemx_collective_launch_query_gridsize, which could cause it to erroneously return a grid size of 0.Fixed a bug related to
nvshmem_init, which might cause the application to crash in MNNVL discovery when used with the CUDA compat libraries at runtime for CUDA Toolkit 12.4 or later.Fixed a bug related to
nvshmemx_collective_launch, which might cause duplicate initialization of the NVSHMEM device state.Fixed a bug related to uninitialized variables in the IBGDA device code.
Fixed a bug related to out-of-bounds access (OOB) in the atomic BW performance test.
Fixed a bug related to missing C/C++
stdintheaders on Ubuntu 24.04 and x86-based systems.Fixed a bug related to the incorrect calculation of team-specific stride when creating a new team using
nvshmem_team_split_strided.
Breaking Changes#
There are no breaking changes in this release.
Deprecated Features#
Removed host API-based nvshmem collectives performance benchmarks.
Known Issues#
Complex types, which are enabled by setting
NVSHMEM_COMPLEX_SUPPORTat compile time, are not currently supported.When enabling libfabric transport with
NVSHMEM_LIBFABRIC_PROVIDER=EFA, certain operations are experimental and might result in the application kernel hanging with the following operations:Device side
nvshmem_put/nvshmem_getwithnvshmem_barrier.Host side
nvshmem_put_on_stream/nvshmem_get_on_stream.
When enabling UCX remote transport with
NVSHMEM_REMOTE_TRANSPORT=UCX, a data mismatch might be observed when scaling to 32 PEs or more on DGX-2 platforms.