Papers
Topics
Authors
Recent
Search
2000 character limit reached

Persistent MPI GPU Communication API

Updated 23 February 2026
  • Persistent MPI GPU Communication API is a technique that enables direct, asynchronous, and lock-free message passing between GPU buffers using device streams and persistent requests.
  • It decouples CPU and GPU execution by offloading communication tasks to GPUs, thereby minimizing synchronization overhead and improving performance in distributed systems.
  • Empirical results show up to 50% latency reduction and enhanced scalability in high-performance computing environments, benefiting scientific and machine learning workloads.

A persistent MPI GPU communication API enables direct, asynchronous, and lock-free message passing between GPU-resident data buffers across distributed compute nodes via the MPI (Message Passing Interface) abstraction. This class of API establishes a binding from device-side execution contexts—primarily GPU streams—to network endpoints, allowing communication requests to be enqueued and progressed entirely in the device’s execution flow, thereby eliminating or strictly minimizing CPU intervention. The resulting communication model supports persistent or reusable send/receive requests with low overhead, high concurrency, and maximal CPU/GPU/network overlap, motivated by the increasing architectural heterogeneity of HPC systems and the need for scaling in GPU-driven scientific and machine learning workloads (Zhou et al., 2024, Bridges et al., 17 Feb 2026, Zhou et al., 2022).

1. Conceptual Foundations and Design Principles

Persistent MPI GPU communication APIs are defined by three central elements:

  • Separation of Initialization and Invocation: Requests are initialized once (e.g., via MPI_Send_init, MPI_Recv_init) and invoked repeatedly with minimal overhead. This design is inherited from classic persistent MPI semantics and extended for device-side asynchrony.
  • Binding to Execution Contexts: Explicit association of MPI communication objects (streams/queues/communicators) with device execution contexts (e.g., CUDA streams). APIs such as MPIX_Stream_create and MPIX_Stream_comm_create in MPICH codify this binding, enabling the MPI library to map each stream to a dedicated network endpoint or virtual communication interface (VCI) (Zhou et al., 2024, Zhou et al., 2022).
  • Device-Driven Progression: Enqueue, triggering, and completion are performed from the device context, either through CUDA/HIP stream operations (e.g., cudaStreamWriteValue64, cudaLaunchHostFunc) or through polling kernels, enabling CPU-free communication (Namashivayam et al., 2022, Bridges et al., 17 Feb 2026).

This API paradigm addresses the limitations of legacy GPU-aware MPI—namely, reliance on the CPU for orchestration, excessive synchronization between CPU and GPU, and suboptimal exploitation of network and device parallelism.

2. API Surface and Programmer Workflow

2.1 Fundamental API Operations

A representative persistent MPI GPU API, as concretized in MPICH’s MPIX stream extension and CPU-free communication stacks, comprises the following core operations (Zhou et al., 2024, Zhou et al., 2022, Bridges et al., 17 Feb 2026):

  • Context/Queue Creation:
    • int MPIX_Stream_create(MPI_Info info, MPIX_Stream *stream)
    • int MPIX_Stream_comm_create(MPI_Comm comm, MPIX_Stream stream, MPI_Comm *newcomm)
    • int MPI_Queue_init(MPI_Request *queue, const char *provider, GPU_Stream_Handle *stream)
  • Persistent Request Lifecycle:
    • int MPI_Send_init(const void *buf, int count, MPI_Datatype dt, int dest, int tag, MPI_Comm comm, MPI_Request *req)
    • int MPI_Recv_init(void *buf, int count, MPI_Datatype dt, int src, int tag, MPI_Comm comm, MPI_Request *req)
    • int MPI_Request_free(MPI_Request *req)
  • Decoupled Matching (where supported):
    • int MPI_Matchall(int count, MPI_Request reqs[], MPI_Status *status)
  • Enqueuing Communications:
    • int MPIX_Isend_enqueue(const void *buf, int count, MPI_Datatype dt, int dest, int tag, MPI_Comm comm, MPI_Request *req)
    • int MPIX_Irecv_enqueue(void *buf, int count, MPI_Datatype dt, int src, int tag, MPI_Comm comm, MPI_Request *req)
    • int MPI_Enqueue_startall(MPI_Request queue, int count, MPI_Request reqs[])
    • int MPI_Enqueue_waitall(MPI_Request queue, int count, MPI_Request reqs[])
    • int MPIX_Stream_progress(MPIX_Stream stream) (progress thread or device-initiated polling)

2.2 Usage Flow

  1. Stream/queue establishment: Application creates or obtains a GPU execution stream, encodes it into MPI_Info, and constructs a corresponding MPIX_Stream and stream communicator.
  2. Persistent request setup: GPU buffers are pinned and registered. Requests are initialized; optional matching and negotiation is performed for CPU-free operation.
  3. Enqueue and progress: Send/receive operations are enqueued into the device stream/queue. Host progress loops or background threads may supplement but are not required for semantics.
  4. Completion and reuse: Completion detected via stream synchronization or polling; persistent requests are re-enqueued as needed; resources freed when no longer needed (Zhou et al., 2022, Namashivayam et al., 2022, Zhou et al., 2024).

3. Internal Semantics: Progress Engine and Hardware Interactions

3.1 Progress and Completion

Persistent GPU enqueues are mapped to persistent generalized requests in the MPI library, which are driven to completion using hardware or software progress mechanisms:

  • Device-Triggered Progression: Completion is detected via device-visible counters (trigger/completion counters in the NIC, such as HPE Slingshot 11). Device-side memory operations (cudaStreamWriteValue64, polling kernels) increment or wait on these counters; the NIC acts upon triggers to initiate network transfers (Namashivayam et al., 2022, Bridges et al., 17 Feb 2026).
  • Generalized Requests and Callbacks: MPICH uses the generalized-request extension to associate poll/wait callbacks with each stream, ensuring progress and completion are handled without global locks (Zhou et al., 2024).
  • Decoupled Matching: APIs like MPI_Matchall pre-negotiate all required RMA keys and tags, eliminating CPU involvement on subsequent device-triggered enqueues (Bridges et al., 17 Feb 2026).

3.2 Hardware Dependencies

  • NIC Support: Deferred work queues (DWQ) and triggered operations in network cards, such as Slingshot 11, enable direct device–NIC coordination.
  • Memory Registration: All device buffers and MMIO regions for counters require registration for both NIC and GPU access.
  • Polling Approaches: On supported hardware, all synchronization is device-to-NIC; where not available, fallback to host progress threads or software emulations incurs additional overhead (Namashivayam et al., 2022).

4. Performance Models and Empirical Results

4.1 Analytical Models

Across proposals, performance is commonly modeled as: T(n)=α+βnT(n) = \alpha + \beta n where nn is the message size (bytes), α\alpha a fixed latency (setup and synchronization), and β\beta the per-byte transfer time. Persistent, device-driven APIs reduce α\alpha by eliminating GPU–CPU synchronizations in the critical path (Zhou et al., 2024, Zhou et al., 2022, Bridges et al., 17 Feb 2026).

4.2 Experimental Outcomes

Table: Comparative Latency and Bandwidth (16 KB message, ∼10K GPUs, Slingshot-11, MPICH vs. persistent stream-based API) (Bridges et al., 17 Feb 2026):

Implementation α\alpha [µs] β\beta [µs/KB] Total [µs] Observed % Latency Reduction
Cray MPICH (GPU) 5.2 0.04 6.84 Baseline
Stream-Triggered 2.8 0.02 3.12 54%

Selected key findings:

  • Up to 50% reduction in medium-message ping-pong latency and 20–30% higher bandwidth for message sizes from 4 KB to 512 KB (Bridges et al., 17 Feb 2026).
  • 28% strong scaling improvement in halo-exchange benchmarks at 8,192 GPU scale due to offloaded progress and reduced critical-path synchronization.
  • In multi-threaded microbenchmarks, explicit per-stream binding yields ≈20% higher aggregate message rates versus VCI-hashing or serialized progress paths (Zhou et al., 2022).

A plausible implication is that maximal benefit occurs for latency-sensitive, high-concurrency patterns where CPU removal and device progress dominate.

5. Comparisons and Taxonomy of Approaches

Research classifies persistent GPU MPI APIs by:

  • Control Path: Device-offloaded (“stream-triggered”) APIs (e.g., MPICH's MPIX_Stream, HPE's MPI_Queue) versus “kernel-triggered” partitioned APIs (MPI-4’s MPI_Psend_init and device-callable readiness/completion).
  • Ordering Object: Use of explicit stream/queue handles (MPICH, HPE) or implicit via device kernel launches only.
  • Scope: Two-sided (point-to-point, collectives) and one-sided (RMA) operations (Bridges et al., 2024).
  • Degree of Host Offload: Full (Slingshot-11 with triggered receive/send), partial (host progress thread required for receive matching), or none (classic MPI).
  • Legacy Compatibility: Stream-triggered APIs require new communicator objects but preserve host-side semantics; partitioned API extends existing MPI-4 standards (Bridges et al., 2024).

6. Integration and Future Directions

Persistent GPU MPI APIs have been integrated into production research codebases and performance portability frameworks (e.g., Cabana+Kokkos), enabling patterns such as halo-exchange and gather/scatter to proceed entirely on the GPU, with only a final MPI_Queue_wait or cudaStreamSynchronize at iteration boundaries (Bridges et al., 17 Feb 2026).

Key open issues and standardization discussions include:

  • Need for standard MPI stream/queue objects and device-callable completion routines (for send as well as receive).
  • Clarification and guarantee of initialization-time matching semantics (as opposed to start-time, which incurs additional CPU cost).
  • Backward compatibility and coexistence with existing point-to-point and collective semantics (Bridges et al., 2024).

Community proposals include extending MPI to standardize buffer preparation at initialization, lightweight stream/queue abstractions, and full device-callable test/wait primitives, with the expectation that MPI-5 (and beyond) will formally codify these practices.

7. Summary of Impact and Limitations

Persistent MPI GPU communication APIs improve asynchrony, overlap, and lock-freedom for large-scale, heterogenous applications by:

  • Decoupling CPU and GPU execution flows for communication,
  • Enabling full offload to device (subject to hardware/NIC support),
  • Reducing critical-path synchronization and overhead,
  • Maintaining MPI compatibility or extending it in an orthogonal and composable way,
  • Delivering up to 50% latency reduction and substantial strong-scaling gains in production environments (Bridges et al., 17 Feb 2026, Zhou et al., 2024).

Limitations remain where hardware lacks full support for triggered receive offload and where integration with legacy MPI collective or RMA is not yet implemented. Nevertheless, persistent MPI GPU communication APIs represent the state of the art for efficient message passing on current and emerging HPC systems.

Topic to Video (Beta)

No one has generated a video about this topic yet.

Whiteboard

No one has generated a whiteboard explanation for this topic yet.

Follow Topic

Get notified by email when new papers are published related to Persistent MPI GPU Communication API.