MPI_Neighbor_allgather(3)
π 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 inMPI_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 uncommittedMPI_Datatype(seeMPI_Type_commit) is used in a communication call. Commit your types, girl!MPI_ERR_OTHERβ Other error; useMPI_Error_stringto 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
- nixos 26.05: mpich 5.0.1
- ubuntu stonking: mpich-doc 5.0.1-9 Β· other
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms