300 lines
10 KiB
Groff
300 lines
10 KiB
Groff
.\" Man page generated from reStructuredText.
|
||
.
|
||
.TH "MPI_ALLTOALL" "3" "Feb 14, 2025" "" "Open MPI"
|
||
.
|
||
.nr rst2man-indent-level 0
|
||
.
|
||
.de1 rstReportMargin
|
||
\\$1 \\n[an-margin]
|
||
level \\n[rst2man-indent-level]
|
||
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||
-
|
||
\\n[rst2man-indent0]
|
||
\\n[rst2man-indent1]
|
||
\\n[rst2man-indent2]
|
||
..
|
||
.de1 INDENT
|
||
.\" .rstReportMargin pre:
|
||
. RS \\$1
|
||
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
|
||
. nr rst2man-indent-level +1
|
||
.\" .rstReportMargin post:
|
||
..
|
||
.de UNINDENT
|
||
. RE
|
||
.\" indent \\n[an-margin]
|
||
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||
.nr rst2man-indent-level -1
|
||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||
..
|
||
.sp
|
||
\fI\%MPI_Alltoall\fP, \fI\%MPI_Ialltoall\fP, \fI\%MPI_Alltoall_init\fP \- All processes send
|
||
data to all processes
|
||
.SH SYNTAX
|
||
.SS C Syntax
|
||
.INDENT 0.0
|
||
.INDENT 3.5
|
||
.sp
|
||
.nf
|
||
.ft C
|
||
#include <mpi.h>
|
||
|
||
int MPI_Alltoall(const void *sendbuf, int sendcount,
|
||
MPI_Datatype sendtype, void *recvbuf, int recvcount,
|
||
MPI_Datatype recvtype, MPI_Comm comm)
|
||
|
||
int MPI_Ialltoall(const void *sendbuf, int sendcount,
|
||
MPI_Datatype sendtype, void *recvbuf, int recvcount,
|
||
MPI_Datatype recvtype, MPI_Comm comm, MPI_Request *request)
|
||
|
||
int MPI_Alltoall_init(const void *sendbuf, int sendcount,
|
||
MPI_Datatype sendtype, void *recvbuf, int recvcount,
|
||
MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request)
|
||
.ft P
|
||
.fi
|
||
.UNINDENT
|
||
.UNINDENT
|
||
.SS Fortran Syntax
|
||
.INDENT 0.0
|
||
.INDENT 3.5
|
||
.sp
|
||
.nf
|
||
.ft C
|
||
USE MPI
|
||
! or the older form: INCLUDE \(aqmpif.h\(aq
|
||
MPI_ALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
|
||
RECVTYPE, COMM, IERROR)
|
||
|
||
<type> SENDBUF(*), RECVBUF(*)
|
||
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE
|
||
INTEGER COMM, IERROR
|
||
|
||
MPI_IALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
|
||
RECVTYPE, COMM, REQUEST, IERROR)
|
||
|
||
<type> SENDBUF(*), RECVBUF(*)
|
||
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE
|
||
INTEGER COMM, REQUEST, IERROR
|
||
|
||
MPI_ALLTOALL_INIT(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
|
||
RECVTYPE, COMM, INFO, REQUEST, IERROR)
|
||
|
||
<type> SENDBUF(*), RECVBUF(*)
|
||
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE
|
||
INTEGER COMM, INFO, REQUEST, IERROR
|
||
.ft P
|
||
.fi
|
||
.UNINDENT
|
||
.UNINDENT
|
||
.SS Fortran 2008 Syntax
|
||
.INDENT 0.0
|
||
.INDENT 3.5
|
||
.sp
|
||
.nf
|
||
.ft C
|
||
USE mpi_f08
|
||
MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype,
|
||
comm, ierror)
|
||
|
||
TYPE(*), DIMENSION(..), INTENT(IN) :: sendbuf
|
||
TYPE(*), DIMENSION(..) :: recvbuf
|
||
INTEGER, INTENT(IN) :: sendcount, recvcount
|
||
TYPE(MPI_Datatype), INTENT(IN) :: sendtype, recvtype
|
||
TYPE(MPI_Comm), INTENT(IN) :: comm
|
||
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
||
|
||
MPI_Ialltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype,
|
||
comm, request, ierror)
|
||
|
||
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: sendbuf
|
||
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: recvbuf
|
||
INTEGER, INTENT(IN) :: sendcount, recvcount
|
||
TYPE(MPI_Datatype), INTENT(IN) :: sendtype, recvtype
|
||
TYPE(MPI_Comm), INTENT(IN) :: comm
|
||
TYPE(MPI_Request), INTENT(OUT) :: request
|
||
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
||
|
||
MPI_Alltoall_init(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype,
|
||
comm, info, request, ierror)
|
||
|
||
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: sendbuf
|
||
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: recvbuf
|
||
INTEGER, INTENT(IN) :: sendcount, recvcount
|
||
TYPE(MPI_Datatype), INTENT(IN) :: sendtype, recvtype
|
||
TYPE(MPI_Comm), INTENT(IN) :: comm
|
||
TYPE(MPI_Info), INTENT(IN) :: info
|
||
TYPE(MPI_Request), INTENT(OUT) :: request
|
||
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
||
.ft P
|
||
.fi
|
||
.UNINDENT
|
||
.UNINDENT
|
||
.SH INPUT PARAMETERS
|
||
.INDENT 0.0
|
||
.IP \(bu 2
|
||
\fBsendbuf\fP: Starting address of send buffer (choice).
|
||
.IP \(bu 2
|
||
\fBsendcount\fP: Number of elements to send to each process (integer).
|
||
.IP \(bu 2
|
||
\fBsendtype\fP: Datatype of send buffer elements (handle).
|
||
.IP \(bu 2
|
||
\fBrecvcount\fP: Number of elements to receive from each process (integer).
|
||
.IP \(bu 2
|
||
\fBrecvtype\fP: Datatype of receive buffer elements (handle).
|
||
.IP \(bu 2
|
||
\fBcomm\fP: Communicator over which data is to be exchanged (handle).
|
||
.IP \(bu 2
|
||
\fBinfo\fP: Info (handle, persistent only)
|
||
.UNINDENT
|
||
.SH OUTPUT PARAMETERS
|
||
.INDENT 0.0
|
||
.IP \(bu 2
|
||
\fBrecvbuf\fP: Starting address of receive buffer (choice).
|
||
.IP \(bu 2
|
||
\fBrequest\fP: Request (handle, non\-blocking only).
|
||
.IP \(bu 2
|
||
\fBierror\fP: Fortran only: Error status (integer).
|
||
.UNINDENT
|
||
.SH DESCRIPTION
|
||
.sp
|
||
\fI\%MPI_Alltoall\fP is a collective operation in which all processes send the
|
||
same amount of data to each other, and receive the same amount of data
|
||
from each other. The operation of this routine can be represented as
|
||
follows, where each process performs 2n (n being the number of processes
|
||
in communicator \fIcomm\fP) independent point\-to\-point communications
|
||
(including communication with itself).
|
||
.INDENT 0.0
|
||
.INDENT 3.5
|
||
.sp
|
||
.nf
|
||
.ft C
|
||
MPI_Comm_size(comm, &n);
|
||
for (i = 0, i < n; i++)
|
||
MPI_Send(sendbuf + i * sendcount * extent(sendtype),
|
||
sendcount, sendtype, i, ..., comm);
|
||
for (i = 0, i < n; i++)
|
||
MPI_Recv(recvbuf + i * recvcount * extent(recvtype),
|
||
recvcount, recvtype, i, ..., comm);
|
||
.ft P
|
||
.fi
|
||
.UNINDENT
|
||
.UNINDENT
|
||
.sp
|
||
Each process breaks up its local \fIsendbuf\fP into n blocks \- each
|
||
containing \fIsendcount\fP elements of type \fIsendtype\fP \- and divides its
|
||
\fIrecvbuf\fP similarly according to \fIrecvcount\fP and \fIrecvtype\fP\&. Process j
|
||
sends the k\-th block of its local \fIsendbuf\fP to process k, which places
|
||
the data in the j\-th block of its local \fIrecvbuf\fP\&. The amount of data
|
||
sent must be equal to the amount of data received, pairwise, between
|
||
every pair of processes.
|
||
.sp
|
||
WHEN COMMUNICATOR IS AN INTER\-COMMUNICATOR
|
||
.sp
|
||
When the communicator is an inter\-communicator, the gather operation
|
||
occurs in two phases. The data is gathered from all the members of the
|
||
first group and received by all the members of the second group. Then
|
||
the data is gathered from all the members of the second group and
|
||
received by all the members of the first. The operation exhibits a
|
||
symmetric, full\-duplex behavior.
|
||
.sp
|
||
The first group defines the root process. The root process uses MPI_ROOT
|
||
as the value of \fIroot\fP\&. All other processes in the first group use
|
||
\fBMPI_PROC_NULL\fP as the value of \fIroot\fP\&. All processes in the second group
|
||
use the rank of the root process in the first group as the value of
|
||
\fIroot\fP\&.
|
||
.sp
|
||
When the communicator is an intra\-communicator, these groups are the
|
||
same, and the operation occurs in a single phase.
|
||
.SH USE OF IN-PLACE OPTION
|
||
.sp
|
||
When the communicator is an intracommunicator, you can perform an
|
||
all\-to\-all operation in\-place (the output buffer is used as the input
|
||
buffer). Use the variable MPI_IN_PLACE as the value of \fIsendbuf\fP\&. In
|
||
this case, \fIsendcount\fP and \fIsendtype\fP are ignored. The input data of
|
||
each process is assumed to be in the area where that process would
|
||
receive its own contribution to the receive buffer.
|
||
.SH NOTES
|
||
.sp
|
||
All arguments on all processes are significant. The \fIcomm\fP argument, in
|
||
particular, must describe the same communicator on all processes.
|
||
.sp
|
||
There are two MPI library functions that are more general than
|
||
\fI\%MPI_Alltoall\fP\&. \fI\%MPI_Alltoallv\fP allows all\-to\-all communication to and from
|
||
buffers that need not be contiguous; different processes may send and
|
||
receive different amounts of data. \fI\%MPI_Alltoallw\fP expands \fI\%MPI_Alltoallv\fP’s
|
||
functionality to allow the exchange of data with different datatypes.
|
||
.SH ERRORS
|
||
.sp
|
||
Almost all MPI routines return an error value; C routines as the return result
|
||
of the function and Fortran routines in the last argument.
|
||
.sp
|
||
Before the error value is returned, the current MPI error handler associated
|
||
with the communication object (e.g., communicator, window, file) is called.
|
||
If no communication object is associated with the MPI call, then the call is
|
||
considered attached to MPI_COMM_SELF and will call the associated MPI error
|
||
handler. When MPI_COMM_SELF is not initialized (i.e., before
|
||
\fI\%MPI_Init\fP/\fI\%MPI_Init_thread\fP, after \fI\%MPI_Finalize\fP, or when using the Sessions
|
||
Model exclusively) the error raises the initial error handler. The initial
|
||
error handler can be changed by calling \fI\%MPI_Comm_set_errhandler\fP on
|
||
MPI_COMM_SELF when using the World model, or the mpi_initial_errhandler CLI
|
||
argument to mpiexec or info key to \fI\%MPI_Comm_spawn\fP/\fI\%MPI_Comm_spawn_multiple\fP\&.
|
||
If no other appropriate error handler has been set, then the MPI_ERRORS_RETURN
|
||
error handler is called for MPI I/O functions and the MPI_ERRORS_ABORT error
|
||
handler is called for all other MPI functions.
|
||
.sp
|
||
Open MPI includes three predefined error handlers that can be used:
|
||
.INDENT 0.0
|
||
.IP \(bu 2
|
||
\fBMPI_ERRORS_ARE_FATAL\fP
|
||
Causes the program to abort all connected MPI processes.
|
||
.IP \(bu 2
|
||
\fBMPI_ERRORS_ABORT\fP
|
||
An error handler that can be invoked on a communicator,
|
||
window, file, or session. When called on a communicator, it
|
||
acts as if \fI\%MPI_Abort\fP was called on that communicator. If
|
||
called on a window or file, acts as if \fI\%MPI_Abort\fP was called
|
||
on a communicator containing the group of processes in the
|
||
corresponding window or file. If called on a session,
|
||
aborts only the local process.
|
||
.IP \(bu 2
|
||
\fBMPI_ERRORS_RETURN\fP
|
||
Returns an error code to the application.
|
||
.UNINDENT
|
||
.sp
|
||
MPI applications can also implement their own error handlers by calling:
|
||
.INDENT 0.0
|
||
.IP \(bu 2
|
||
\fI\%MPI_Comm_create_errhandler\fP then \fI\%MPI_Comm_set_errhandler\fP
|
||
.IP \(bu 2
|
||
\fI\%MPI_File_create_errhandler\fP then \fI\%MPI_File_set_errhandler\fP
|
||
.IP \(bu 2
|
||
\fI\%MPI_Session_create_errhandler\fP then \fI\%MPI_Session_set_errhandler\fP or at \fI\%MPI_Session_init\fP
|
||
.IP \(bu 2
|
||
\fI\%MPI_Win_create_errhandler\fP then \fI\%MPI_Win_set_errhandler\fP
|
||
.UNINDENT
|
||
.sp
|
||
Note that MPI does not guarantee that an MPI program can continue past
|
||
an error.
|
||
.sp
|
||
See the \fI\%MPI man page\fP for a full list of \fI\%MPI error codes\fP\&.
|
||
.sp
|
||
See the Error Handling section of the MPI\-3.1 standard for
|
||
more information.
|
||
.sp
|
||
\fBSEE ALSO:\fP
|
||
.INDENT 0.0
|
||
.INDENT 3.5
|
||
.INDENT 0.0
|
||
.IP \(bu 2
|
||
\fI\%MPI_Alltoallv\fP
|
||
.IP \(bu 2
|
||
\fI\%MPI_Alltoallw\fP
|
||
.UNINDENT
|
||
.UNINDENT
|
||
.UNINDENT
|
||
.SH COPYRIGHT
|
||
2003-2025, The Open MPI Community
|
||
.\" Generated by docutils manpage writer.
|
||
.
|