330 lines
12 KiB
Groff
330 lines
12 KiB
Groff
.\" Man page generated from reStructuredText.
|
|
.
|
|
.TH "MPI_ALLTOALLW_INIT" "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
|
|
..
|
|
.INDENT 0.0
|
|
.INDENT 3.5
|
|
.UNINDENT
|
|
.UNINDENT
|
|
.sp
|
|
\fI\%MPI_Alltoallw\fP, \fI\%MPI_Ialltoallw\fP, \fI\%MPI_Alltoallw_init\fP \- All processes
|
|
send data of different types to, and receive data of different types
|
|
from, all processes
|
|
.SH SYNTAX
|
|
.SS C Syntax
|
|
.INDENT 0.0
|
|
.INDENT 3.5
|
|
.sp
|
|
.nf
|
|
.ft C
|
|
#include <mpi.h>
|
|
|
|
int MPI_Alltoallw(const void *sendbuf, const int sendcounts[],
|
|
const int sdispls[], const MPI_Datatype sendtypes[],
|
|
void *recvbuf, const int recvcounts[], const int rdispls[],
|
|
const MPI_Datatype recvtypes[], MPI_Comm comm)
|
|
|
|
int MPI_Ialltoallw(const void *sendbuf, const int sendcounts[],
|
|
const int sdispls[], const MPI_Datatype sendtypes[],
|
|
void *recvbuf, const int recvcounts[], const int rdispls[],
|
|
const MPI_Datatype recvtypes[], MPI_Comm comm,
|
|
MPI_Request *request)
|
|
|
|
int MPI_Alltoallw_init(const void *sendbuf, const int sendcounts[],
|
|
const int sdispls[], const MPI_Datatype sendtypes[],
|
|
void *recvbuf, const int recvcounts[], const int rdispls[],
|
|
const MPI_Datatype recvtypes[], 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_ALLTOALLW(SENDBUF, SENDCOUNTS, SDISPLS, SENDTYPES,
|
|
RECVBUF, RECVCOUNTS, RDISPLS, RECVTYPES, COMM, IERROR)
|
|
|
|
<type> SENDBUF(*), RECVBUF(*)
|
|
INTEGER SENDCOUNTS(*), SDISPLS(*), SENDTYPES(*)
|
|
INTEGER RECVCOUNTS(*), RDISPLS(*), RECVTYPES(*)
|
|
INTEGER COMM, IERROR
|
|
|
|
MPI_IALLTOALLW(SENDBUF, SENDCOUNTS, SDISPLS, SENDTYPES,
|
|
RECVBUF, RECVCOUNTS, RDISPLS, RECVTYPES, COMM, REQUEST, IERROR)
|
|
|
|
<type> SENDBUF(*), RECVBUF(*)
|
|
INTEGER SENDCOUNTS(*), SDISPLS(*), SENDTYPES(*)
|
|
INTEGER RECVCOUNTS(*), RDISPLS(*), RECVTYPES(*)
|
|
INTEGER COMM, REQUEST, IERROR
|
|
|
|
MPI_ALLTOALLW_INIT(SENDBUF, SENDCOUNTS, SDISPLS, SENDTYPES,
|
|
RECVBUF, RECVCOUNTS, RDISPLS, RECVTYPES, COMM, INFO, REQUEST, IERROR)
|
|
|
|
<type> SENDBUF(*), RECVBUF(*)
|
|
INTEGER SENDCOUNTS(*), SDISPLS(*), SENDTYPES(*)
|
|
INTEGER RECVCOUNTS(*), RDISPLS(*), RECVTYPES(*)
|
|
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_Alltoallw(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts,
|
|
rdispls, recvtypes, comm, ierror)
|
|
|
|
TYPE(*), DIMENSION(..), INTENT(IN) :: sendbuf
|
|
TYPE(*), DIMENSION(..) :: recvbuf
|
|
INTEGER, INTENT(IN) :: sendcounts(*), sdispls(*), recvcounts(*),
|
|
rdispls(*)
|
|
TYPE(MPI_Datatype), INTENT(IN) :: sendtypes(*)
|
|
TYPE(MPI_Datatype), INTENT(IN) :: recvtypes(*)
|
|
TYPE(MPI_Comm), INTENT(IN) :: comm
|
|
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
|
|
|
MPI_Ialltoallw(sendbuf, sendcounts, sdispls, sendtypes, recvbuf,
|
|
recvcounts, rdispls, recvtypes, comm, request, ierror)
|
|
|
|
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: sendbuf
|
|
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: recvbuf
|
|
INTEGER, INTENT(IN), ASYNCHRONOUS :: sendcounts(*), sdispls(*),
|
|
recvcounts(*), rdispls(*)
|
|
TYPE(MPI_Datatype), INTENT(IN), ASYNCHRONOUS :: sendtypes(*),
|
|
recvtypes(*)
|
|
TYPE(MPI_Comm), INTENT(IN) :: comm
|
|
TYPE(MPI_Request), INTENT(OUT) :: request
|
|
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
|
|
|
MPI_Alltoallw_init(sendbuf, sendcounts, sdispls, sendtypes, recvbuf,
|
|
recvcounts, rdispls, recvtypes, comm, fIinfo, request, ierror)
|
|
|
|
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: sendbuf
|
|
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: recvbuf
|
|
INTEGER, INTENT(IN), ASYNCHRONOUS :: sendcounts(*), sdispls(*),
|
|
recvcounts(*), rdispls(*)
|
|
TYPE(MPI_Datatype), INTENT(IN), ASYNCHRONOUS :: sendtypes(*),
|
|
recvtypes(*)
|
|
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.
|
|
.IP \(bu 2
|
|
\fBsendcounts\fP: Integer array, where entry i specifies the number of elements to send to rank i.
|
|
.IP \(bu 2
|
|
\fBsdispls\fP: Integer array, where entry i specifies the displacement (in bytes, offset from \fIsendbuf) from which to send data to rank i.\fP
|
|
.IP \(bu 2
|
|
\fBsendtypes\fP: Datatype array, where entry i specifies the datatype to use when sending data to rank i.
|
|
.IP \(bu 2
|
|
\fBrecvcounts\fP: Integer array, where entry j specifies the number of elements to receive from rank j.
|
|
.IP \(bu 2
|
|
\fBrdispls\fP: Integer array, where entry j specifies the displacement (in bytes, offset from \fIrecvbuf) to which data from rank j should\fP be written.
|
|
.IP \(bu 2
|
|
\fBrecvtypes\fP: Datatype array, where entry j specifies the datatype to use when receiving data from rank j.
|
|
.IP \(bu 2
|
|
\fBcomm\fP: Communicator over which data is to be exchanged.
|
|
.IP \(bu 2
|
|
\fBinfo\fP: Info (handle, persistent only)
|
|
.UNINDENT
|
|
.SH OUTPUT PARAMETERS
|
|
.INDENT 0.0
|
|
.IP \(bu 2
|
|
\fBrecvbuf\fP: Address of receive buffer.
|
|
.IP \(bu 2
|
|
\fBrequest\fP: Request (handle, non\-blocking only).
|
|
.IP \(bu 2
|
|
\fBierror\fP: Fortran only: Error status.
|
|
.UNINDENT
|
|
.SH DESCRIPTION
|
|
.sp
|
|
\fI\%MPI_Alltoallw\fP is a generalized collective operation in which all
|
|
processes send data to and receive data from all other processes. It
|
|
adds flexibility to \fI\%MPI_Alltoallv\fP by allowing the user to specify the
|
|
datatype of individual data blocks (in addition to displacement and
|
|
element count). Its operation can be thought of in the following way,
|
|
where each process performs 2n (n being the number of processes in
|
|
communicator \fIcomm) independent point\-to\-point communications\fP
|
|
(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 + sdispls[i], sendcounts[i],
|
|
sendtypes[i], i, ..., comm);
|
|
for (i = 0, i < n; i++)
|
|
MPI_Recv(recvbuf + rdispls[i], recvcounts[i],
|
|
recvtypes[i], i, ..., comm);
|
|
.ft P
|
|
.fi
|
|
.UNINDENT
|
|
.UNINDENT
|
|
.sp
|
|
Process j sends the k\-th block of its local \fIsendbuf to process\fP k,
|
|
which places the data in the j\-th block of its local \fIrecvbuf.\fP
|
|
.sp
|
|
When a pair of processes exchanges data, each may pass different element
|
|
count and datatype arguments so long as the sender specifies the same
|
|
amount of data to send (in bytes) as the receiver expects to receive.
|
|
.sp
|
|
Note that process i may send a different amount of data to process j
|
|
than it receives from process j. Also, a process may send entirely
|
|
different amounts and types of data to different processes in the
|
|
communicator.
|
|
.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, \fIsendcounts\fP, \fIsdispls\fP, and \fIsendtypes\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
|
|
The specification of counts, types, and displacements should not cause
|
|
any location to be written more than once.
|
|
.sp
|
|
All arguments on all processes are significant. The \fIcomm\fP argument, in
|
|
particular, must describe the same communicator on all processes.
|
|
.sp
|
|
The offsets of \fIsdispls\fP and \fIrdispls\fP are measured in bytes. Compare
|
|
this to \fI\%MPI_Alltoallv\fP, where these offsets are measured in units of
|
|
\fIsendtype\fP and \fIrecvtype\fP, respectively.
|
|
.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_Alltoall\fP
|
|
.IP \(bu 2
|
|
\fI\%MPI_Alltoallv\fP
|
|
.UNINDENT
|
|
.UNINDENT
|
|
.UNINDENT
|
|
.SH COPYRIGHT
|
|
2003-2025, The Open MPI Community
|
|
.\" Generated by docutils manpage writer.
|
|
.
|