MPI_Neighbor_allgather(3)

πŸ“¦
version 5.0.1 Β· 5 versions
, in nixos 26.05, ubuntu stonking

πŸ’– MPI_Neighbor_allgather(3) πŸ’–

okay bestie, so this is a page from the MPI manual, and we're talking about MPI_Neighbor_allgather β€” and no cap, it's kind of a vibe. Let's get into it 🫢


✨ NAME ✨

MPI_Neighbor_allgather β€” gathers data from all neighboring processes and distributes the combined data to all neighboring processes 🌈

Like, everybody sends, everybody receives, and the topology decides who counts as a "neighbor." It's giving group chat energy fr fr.


🌸 SYNOPSIS 🌸

int MPI_Neighbor_allgather(const void *sendbuf, int sendcount,
MPI_Datatype sendtype, void *recvbuf, int recvcount,
MPI_Datatype recvtype, MPI_Comm comm)
int MPI_Neighbor_allgather_c(const void *sendbuf, MPI_Count sendcount,
MPI_Datatype sendtype, void *recvbuf,
MPI_Count recvcount, MPI_Datatype recvtype,
MPI_Comm comm)

Two versions, both iconic. The _c one is the one that rolls with MPI_Count counts instead of plain int, for when your counts are lowkey huge πŸ’…


πŸŽ€ INPUT PARAMETERS πŸŽ€

  • sendbuf β€” starting address of send buffer (choice). This is where the tea you're sending lives.
  • sendcount β€” number of elements sent to each neighbor (non-negative integer). Not the total, bestie β€” each neighbor.
  • sendtype β€” data type of send buffer elements (handle).
  • recvcount β€” number of elements received from each neighbor (non-negative integer).
  • recvtype β€” data type of receive buffer elements (handle).
  • comm β€” communicator with topology structure (handle). Yes it needs a topology, that's the whole point, she's a neighbor girlie.

πŸ¦‹ OUTPUT PARAMETERS πŸ¦‹

  • recvbuf β€” starting address of receive buffer (choice). This is where the incoming tea lands.

⭐ NOTES ⭐

Okay so here's the lore. In this function, each process i gathers data items from each process j if an edge (j,i) exists in the topology graph, and each process i sends the same data items to all processes j where an edge (i,j) exists. So the edge direction literally decides who's giving and who's receiving, and it's not always symmetric, so pay attention.

The send buffer is sent to each neighboring process, and the l-th block in the receive buffer is received from the l-th neighbor. So the order of your neighbors matters β€” that's just how she is πŸ™ˆ


πŸ’€ THREAD AND INTERRUPT SAFETY πŸ’€

This routine is thread-safe. Which means you can safely use it from multiple threads and you don't need to bring your own user-provided thread locks. Slay. πŸ’…

BUT. She is not interrupt safe. Typically this is because of memory allocation routines like malloc or other non-MPICH runtime routines that are themselves not interrupt-safe. So don't come for her about that, it's not her fault βœ‹


🧚 NOTES FOR FORTRAN 🧚

All MPI routines in Fortran (except for MPI_WTIME and MPI_WTICK) have an additional argument ierr at the end of the argument list. ierr is an integer and has the same meaning as the return value of the routine in C. In Fortran, MPI routines are subroutines and are invoked with the call statement. Very Fortran of them πŸ’œ

All MPI objects (e.g., MPI_Datatype, MPI_Comm) are of type INTEGER in Fortran. Not handles. INTEGER. Periodt.


πŸ”₯ ERRORS πŸ”₯

All MPI routines (except MPI_Wtime and MPI_Wtick) return an error value β€” C routines as the value of the function, and Fortran routines in the last argument. Before that value is returned, the current MPI error handler is called. By default, this error handler aborts the MPI job. So yeah, it's giving dramatic 😭

The error handler may be changed with:

  • MPI_Comm_set_errhandler (for communicators)
  • MPI_File_set_errhandler (for files)
  • MPI_Win_set_errhandler (for RMA windows)

The MPI-1 routine MPI_Errhandler_set may be used, but its use is deprecated β€” like, don't, bestie, upgrade your vibe. The predefined error handler MPI_ERRORS_RETURN may be used to cause error values to be returned.

Note that MPI does not guarantee that an MPI program can continue past an error; however, MPI implementations will attempt to continue whenever possible. Fingers crossed 🀞

Here's the error-code lineup:

  • MPI_SUCCESS β€” No error; MPI routine completed successfully. The dream. ✨
  • MPI_ERR_BUFFER β€” Invalid buffer pointer. Usually a null buffer where one is not valid. Not the null-buffer jumpscare 😭
  • MPI_ERR_COMM β€” Invalid communicator. A common error is to use a null communicator in a call (not even allowed in MPI_Comm_rank).
  • MPI_ERR_COUNT β€” Invalid count argument. Count arguments must be non-negative; a count of zero is often valid. (Zero is a valid count sometimes, noted.)
  • MPI_ERR_TYPE β€” Invalid datatype argument. Additionally, this error can occur if an uncommitted MPI_Datatype (see MPI_Type_commit) is used in a communication call. Commit your types, girl!
  • MPI_ERR_OTHER β€” Other error; use MPI_Error_string to get more information about this error code.

and that's the whole page, bestie, you ate it πŸ’– mwah. this lil manual page is from the MPI manual, dated 4/10/2026 β€” and the title up top? MPI_Neighbor_allgather(3), obviously, main character energy. go forth and neighbor-allgather responsibly πŸ‘‘πŸŒΈ

πŸ“¦ where this page comes from