mpi advanced point to point

**Advanced MPI Communication** encompasses **sophisticated messaging primitives beyond basic send/receive, including persistent requests for reduced overhead, one-sided remote-memory-access patterns, and specialized datatype handling for irregular communication.** **MPI Persistent Requests** - **Persistent Send/Recv**: Pre-allocate send/recv request (MPI_Send_init, MPI_Recv_init) with parameters (buffer, count, datatype, dest, tag). Reuse request in tight loops. - **Performance Benefit**: Request initialization overhead amortized across multiple uses. Typical overhead reduction: 20-40% for bandwidth-limited messages. - **Usage Pattern**: Start/complete cycle (MPI_Start, MPI_Wait). Multiple requests can be started (MPI_Startall) enabling pipelined communication. - **Compared to Non-Persistent**: Each send/recv allocates request (small overhead but accumulates). Persistent requests ~5-10% faster in tight loops. **One-Sided Communication (Remote Memory Access, RMA)** - **MPI Window Creation**: MPI_Win_create(base, size, ...) registers memory region for RMA access. Other processes can read/write this window. - **RMA Operations**: MPI_Put (write remote memory), MPI_Get (read remote memory), MPI_Accumulate (atomic operation on remote memory). - **Advantages**: Sender initiates operation (PUT/GET) without target blocking. Sender knows when operation complete (local semantics). Enables asynchronous communication. - **Use Cases**: Producer-consumer, work-stealing, load-balancing algorithms naturally express via RMA. **MPI Window Synchronization Semantics** - **Fence Synchronization**: MPI_Win_fence() acts as collective barrier (all processes in window). Ensures previous RMA operations completed globally. - **Post-Wait-Complete-Wait (PSCW)**: More flexible synchronization. MPI_Win_post(), MPI_Win_start(), MPI_Win_complete(), MPI_Win_wait(). Processes indicate participation, synchronize only when needed. - **Lock Synchronization**: MPI_Win_lock() acquires exclusive/shared lock on target process. MPI_Win_unlock() releases. Enables fine-grained mutual exclusion. - **Memory Model**: Fence: all processes agree on consistency. Lock: only target process sees consistent view. Pipelining: process-specific synchronization. **Derived Datatypes and Communication of Non-Contiguous Data** - **Contiguous Datatype**: MPI_FLOAT, MPI_INT, etc. communicate single array in memory. - **Vector Datatype**: MPI_Type_vector(count, blocklen, stride, base_type) communicates evenly-spaced blocks. Example: column of matrix (stride = row_width). - **Indexed Datatype**: MPI_Type_indexed(count, array_of_blocklengths, array_of_displacements) arbitrary displacements. Example: sparse matrix rows. - **Struct Datatype**: MPI_Type_create_struct() combines multiple types with offsets. Example: structure containing integer + float fields. **Derived Datatype Usage** - **MPI_Type_commit()**: Finalize datatype definition before use. Commit enables compiler optimizations (e.g., compute contiguous regions). - **Packing Advantage**: Derived datatype reduces host-CPU overhead vs manual packing/unpacking. Single MPI call vs loop of multiple calls. - **Subarray Extraction**: MPI_Type_create_subarray() extracts rectangular region of N-dimensional array. Useful for domain decomposition (decompose 3D domain into 1D slices). **Neighborhood Collectives (MPI 3.0+)** - **MPI_Neighbor_allgather**: Local gather from neighbors (defined by topology/graph). Replaces global allgather for sparse communication patterns. - **MPI_Neighbor_alltoall**: Local all-to-all (each rank sends to all neighbors, receives from all). Efficient for stencil computations. - **Topology Definition**: MPI_Dist_graph_create() defines custom neighbor topology (sparse directed graph). Enables application-specific communication patterns. - **Optimization Opportunity**: Neighborhood collectives permit more aggressive optimization (fewer ranks participate, topology-aware routing). **MPI-4 Features and Enhancements** - **Persistent Collectives**: MPI_Allreduce_init() similar to persistent send/recv. Pre-allocate collective request, reuse in loops. - **Partitioned Point-to-Point**: Send/recv partitioned into smaller sub-messages, enabling overlap across multiple messages. - **Request-Based Collectives**: Non-blocking collectives return request immediately. Enable pipelined collective operations across multiple pairs. - **Topology-Aware Mapping**: Queries machine topology, maps ranks to optimize communication locality (reduce inter-socket/inter-switch traffic). **Real-World Optimization Strategies** - **Double Buffering**: Alternate between two buffers for ping-pong communication. While GPU computes buffer N, GPU transfers buffer N+1 to host asynchronously. - **Batching**: Collect multiple small messages, send single large message. Reduces overhead (fewer syscalls, network headers). - **Stencil Optimization**: Halos (boundary rows/cols) communicated separately from bulk. Computation on interior while edges exchange.

Go deeper with CFSGPT

Get AI-powered deep-dives, save terms, and run advanced simulations — free account.

Create Free Account