MPI_Iscan(3)
π« MPI_Iscan(3) π«
okay bestie, welcome to the MPI manual, page MPI_Iscan(3) β¨ pull up a chair, grab a lil snack, we're doing nonblocking partial reductions today and honestly? it's giving iconic.
πΈ NAME πΈ
MPI_Iscan β computes the scan (partial reductions) of data on a collection of processes in a nonblocking way π¦
like yes she does the prefix-reduction thing but she does it asynchronously, so you can go do your little side quests while she cooks. no cap.
β¨ SYNOPSIS β¨
int MPI_Iscan(const void *sendbuf, void *recvbuf, int count,
MPI_Datatype datatype, MPI_Op op, MPI_Comm comm,
MPI_Request *request)
int MPI_Iscan_c(const void *sendbuf, void *recvbuf, MPI_Count count,
MPI_Datatype datatype, MPI_Op op, MPI_Comm comm,
MPI_Request *request)
two flavors, same vibe π
the _c one is for when your count needs that big big MPI_Count energy.
π₯ INPUT PARAMETERS π₯
sendbufβ starting address of send buffer (choice). this is where your data starts, bestie π«Άcountβ number of elements in input buffer (non-negative integer). non-negative! that's the rule, don't be chaotic.datatypeβ data type of elements of input buffer (handle).MPI_Datatypemoment πopβ operation (handle). this is yourMPI_Op, the lil function that knows how to combine stuff.commβ communicator (handle). your group chat, basically. who's in the scan.
π€ OUTPUT PARAMETERS π€
recvbufβ starting address of receive buffer (choice). where the partial reductions land πrequestβ communication request (handle). hold onto this, it's your receipt for the nonblocking operation π
π¨ NOTES ON COLLECTIVE OPERATIONS π¨
the reduction functions (MPI_Op) do not return an error value. periodt. so if they detect a lil problem, all they can do is either call MPI_Abort or just silently skip it β like not addressing the group chat situation at all π
so lowkey, if you change the error handler from MPI_ERRORS_ARE_FATAL to something else, for example MPI_ERRORS_RETURN, then no error may be indicated. it's not being shady on purpose, it just literally cannot tell you.
bestie the reason for this is the performance problems in ensuring that all collective routines return the same error value. so it's a trade-off, and yes it's a little cursed, but it's our little cursed. π
π§΅ THREAD AND INTERRUPT SAFETY π§΅
this routine is thread-safe π meaning you can safely use it from multiple threads with zero user-provided thread locks, no gatekeeping required. slay.
however β and this is the important part β the routine is not interrupt safe. typically this is because of memory allocation routines such as malloc or other non-MPICH runtime routines that are themselves not interrupt-safe. so don't be interrupting her mid-malloc, she will not recover gracefully fr fr.
π§ 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 they're invoked with the call statement. very vintage, very demure.
all MPI objects (e.g., MPI_Datatype, MPI_Comm) are of type INTEGER in Fortran. yes, even the complicated ones. it's just integers all the way down π
π 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 comes back, the current MPI error handler gets called. by default, this error handler aborts the MPI job π³ dramatic but effective.
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 β so like, she's still around but she's retired, we don't really call her anymore π«
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. resilient queen behavior β¨
here's the error code menu:
MPI_SUCCESSβ No error; MPI routine completed successfully. π we love to see it.MPI_ERR_ARGβ Invalid argument. Some argument is invalid and is not identified by a specific error class (e.g.,MPI_ERR_RANK). vague on purpose, sorry babe.MPI_ERR_BUFFERβ Invalid buffer pointer. Usually a null buffer where one is not valid. girl, you can't be passingNULLhere πMPI_ERR_COMMβ Invalid communicator. A common error is to use a null communicator in a call (not even allowed inMPI_Comm_rank). so like, do not.MPI_ERR_COUNTβ Invalid count argument. Count arguments must be non-negative; a count of zero is often valid. zero is fine! negative is not!MPI_ERR_OPβ Invalid operation. MPI operations (objects of typeMPI_Op) must either be one of the predefined operations (e.g.,MPI_SUM) or created withMPI_Op_create.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 bestie, that's the whole thing πMPI_ERR_OTHERβ Other error; useMPI_Error_stringto get more information about this error code. the catch-all bin, but she'll tell you more if you ask nicely.
and that's the whole page!! go forth and nonblocking-scan, main character π¦
anyway, this was page MPI_Iscan(3) from the MPI manual, dated 4/10/2026 β mwah, take care of her, she's a classic ππβ¨
π¦ 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