376 lines
13 KiB
Groff
376 lines
13 KiB
Groff
.\" Man page generated from reStructuredText.
|
|
.
|
|
.TH "MPI_SCATTERV" "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_Scatterv\fP, \fI\%MPI_Iscatterv\fP, \fI\%MPI_Scatterv_init\fP \- Scatters a buffer
|
|
in parts to all tasks in a group.
|
|
.SH SYNTAX
|
|
.SS C Syntax
|
|
.INDENT 0.0
|
|
.INDENT 3.5
|
|
.sp
|
|
.nf
|
|
.ft C
|
|
#include <mpi.h>
|
|
|
|
int MPI_Scatterv(const void *sendbuf, const int sendcounts[], const int displs[],
|
|
MPI_Datatype sendtype, void *recvbuf, int recvcount,
|
|
MPI_Datatype recvtype, int root, MPI_Comm comm)
|
|
|
|
int MPI_Iscatterv(const void *sendbuf, const int sendcounts[], const int displs[],
|
|
MPI_Datatype sendtype, void *recvbuf, int recvcount,
|
|
MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Request *request)
|
|
|
|
int MPI_Scatterv_init(const void *sendbuf, const int sendcounts[], const int displs[],
|
|
MPI_Datatype sendtype, void *recvbuf, int recvcount,
|
|
MPI_Datatype recvtype, int root, 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_SCATTERV(SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RECVBUF,
|
|
RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)
|
|
<type> SENDBUF(*), RECVBUF(*)
|
|
INTEGER SENDCOUNTS(*), DISPLS(*), SENDTYPE
|
|
INTEGER RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR
|
|
|
|
MPI_ISCATTERV(SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RECVBUF,
|
|
RECVCOUNT, RECVTYPE, ROOT, COMM, REQUEST, IERROR)
|
|
<type> SENDBUF(*), RECVBUF(*)
|
|
INTEGER SENDCOUNTS(*), DISPLS(*), SENDTYPE
|
|
INTEGER RECVCOUNT, RECVTYPE, ROOT, COMM, REQUEST, IERROR
|
|
|
|
MPI_SCATTERV_INIT(SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RECVBUF,
|
|
RECVCOUNT, RECVTYPE, ROOT, COMM, INFO, REQUEST, IERROR)
|
|
<type> SENDBUF(*), RECVBUF(*)
|
|
INTEGER SENDCOUNTS(*), DISPLS(*), SENDTYPE
|
|
INTEGER RECVCOUNT, RECVTYPE, ROOT, 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_Scatterv(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount,
|
|
recvtype, root, comm, ierror)
|
|
TYPE(*), DIMENSION(..), INTENT(IN) :: sendbuf
|
|
TYPE(*), DIMENSION(..) :: recvbuf
|
|
INTEGER, INTENT(IN) :: sendcounts(*), displs(*), recvcount, root
|
|
TYPE(MPI_Datatype), INTENT(IN) :: sendtype, recvtype
|
|
TYPE(MPI_Comm), INTENT(IN) :: comm
|
|
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
|
|
|
MPI_Iscatterv(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount,
|
|
recvtype, root, comm, request, ierror)
|
|
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: sendbuf
|
|
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: recvbuf
|
|
INTEGER, INTENT(IN), ASYNCHRONOUS :: sendcounts(*), displs(*)
|
|
INTEGER, INTENT(IN) :: recvcount, root
|
|
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_scatterv_init(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount,
|
|
recvtype, root, comm, info, request, ierror)
|
|
TYPE(*), DIMENSION(..), INTENT(IN), ASYNCHRONOUS :: sendbuf
|
|
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: recvbuf
|
|
INTEGER, INTENT(IN), ASYNCHRONOUS :: sendcounts(*), displs(*)
|
|
INTEGER, INTENT(IN) :: recvcount, root
|
|
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: Address of send buffer (choice, significant only at root).
|
|
.IP \(bu 2
|
|
\fBsendcounts\fP: Integer array (of length group size) specifying the number of elements to send to each processor.
|
|
.IP \(bu 2
|
|
\fBdispls\fP: Integer array (of length group size). Entry i specifies the displacement (relative to sendbuf) from which to take the outgoing data to process i.
|
|
.IP \(bu 2
|
|
\fBsendtype\fP: Datatype of send buffer elements (handle).
|
|
.IP \(bu 2
|
|
\fBrecvcount\fP: Number of elements in receive buffer (integer).
|
|
.IP \(bu 2
|
|
\fBrecvtype\fP: Datatype of receive buffer elements (handle).
|
|
.IP \(bu 2
|
|
\fBroot\fP: Rank of sending process (integer).
|
|
.IP \(bu 2
|
|
\fBcomm\fP: Communicator (handle).
|
|
.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 (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_Scatterv\fP is the inverse operation to \fI\%MPI_Gatherv\fP\&.
|
|
.sp
|
|
\fI\%MPI_Scatterv\fP extends the functionality of \fI\%MPI_Scatter\fP by allowing a
|
|
varying count of data to be sent to each process, since \fIsendcounts\fP is
|
|
now an array. It also allows more flexibility as to where the data is
|
|
taken from on the root, by providing the new argument, \fIdispls\fP\&.
|
|
.sp
|
|
The outcome is as if the root executed \fIn\fP send operations,
|
|
.INDENT 0.0
|
|
.INDENT 3.5
|
|
.sp
|
|
.nf
|
|
.ft C
|
|
MPI_Send(sendbuf + displs[i] * extent(sendtype),
|
|
sendcounts[i], sendtype, i, ...);
|
|
|
|
// and each process executed a receive,
|
|
|
|
MPI_Recv(recvbuf, recvcount, recvtype, root, ...)
|
|
.ft P
|
|
.fi
|
|
.UNINDENT
|
|
.UNINDENT
|
|
.sp
|
|
The send buffer is ignored for all nonroot processes.
|
|
.sp
|
|
The type signature implied by \fIsendcount\fP[\fIi\fP], \fIsendtype\fP at the root
|
|
must be equal to the type signature implied by \fIrecvcount\fP, \fIrecvtype\fP
|
|
at process \fIi\fP (however, the type maps may be different). This implies
|
|
that the amount of data sent must be equal to the amount of data
|
|
received, pairwise between each process and the root. Distinct type maps
|
|
between sender and receiver are still allowed.
|
|
.sp
|
|
All arguments to the function are significant on process \fIroot\fP, while
|
|
on other processes, only arguments \fIrecvbuf\fP, \fIrecvcount\fP, \fIrecvtype\fP,
|
|
\fIroot\fP, \fIcomm\fP are significant. The arguments \fIroot\fP and \fIcomm\fP must
|
|
have identical values on all processes.
|
|
.sp
|
|
The specification of counts, types, and displacements should not cause
|
|
any location on the root to be read more than once.
|
|
.sp
|
|
\fBExample 1:\fP The reverse of Example 5 in the \fI\%MPI_Gatherv\fP manpage. We
|
|
have a varying stride between blocks at sending (root) side, at the
|
|
receiving side we receive 100 \- \fIi\fP elements into the \fIi\fPth column of
|
|
a 100 x 150 C array at process \fIi\fP\&.
|
|
.INDENT 0.0
|
|
.INDENT 3.5
|
|
.sp
|
|
.nf
|
|
.ft C
|
|
MPI_Comm comm;
|
|
int gsize,recvarray[100][150],*rptr;
|
|
int root, *sendbuf, myrank, bufsize, *stride;
|
|
MPI_Datatype rtype;
|
|
int i, *displs, *scounts, offset;
|
|
\&...
|
|
MPI_Comm_size( comm, &gsize);
|
|
MPI_Comm_rank( comm, &myrank );
|
|
|
|
stride = (int *)malloc(gsize*sizeof(int));
|
|
\&...
|
|
/* stride[i] for i = 0 to gsize\-1 is set somehow
|
|
* sendbuf comes from elsewhere
|
|
*/
|
|
\&...
|
|
displs = (int *)malloc(gsize*sizeof(int));
|
|
scounts = (int *)malloc(gsize*sizeof(int));
|
|
offset = 0;
|
|
for (i=0; i<gsize; ++i) {
|
|
displs[i] = offset;
|
|
offset += stride[i];
|
|
scounts[i] = 100 \- i;
|
|
}
|
|
/* Create datatype for the column we are receiving
|
|
*/
|
|
MPI_Type_vector( 100\-myrank, 1, 150, MPI_INT, &rtype);
|
|
MPI_Type_commit( &rtype );
|
|
rptr = &recvarray[0][myrank];
|
|
MPI_Scatterv(sendbuf, scounts, displs, MPI_INT,
|
|
rptr, 1, rtype, root, comm);
|
|
.ft P
|
|
.fi
|
|
.UNINDENT
|
|
.UNINDENT
|
|
.sp
|
|
\fBExample 2:\fP The reverse of Example 1 in the MPI_Gather manpage. The
|
|
root process scatters sets of 100 ints to the other processes, but the
|
|
sets of 100 are stride ints apart in the sending buffer. Requires use of
|
|
\fI\%MPI_Scatterv\fP, where \fIstride\fP >= 100.
|
|
.INDENT 0.0
|
|
.INDENT 3.5
|
|
.sp
|
|
.nf
|
|
.ft C
|
|
MPI_Comm comm;
|
|
int gsize,*sendbuf;
|
|
int root, rbuf[100], i, *displs, *scounts;
|
|
|
|
\&...
|
|
|
|
MPI_Comm_size(comm, &gsize);
|
|
sendbuf = (int *)malloc(gsize*stride*sizeof(int));
|
|
\&...
|
|
displs = (int *)malloc(gsize*sizeof(int));
|
|
scounts = (int *)malloc(gsize*sizeof(int));
|
|
for (i=0; i<gsize; ++i) {
|
|
displs[i] = i*stride;
|
|
scounts[i] = 100;
|
|
}
|
|
MPI_Scatterv(sendbuf, scounts, displs, MPI_INT,
|
|
rbuf, 100, MPI_INT, root, comm);
|
|
.ft P
|
|
.fi
|
|
.UNINDENT
|
|
.UNINDENT
|
|
.SH USE OF IN-PLACE OPTION
|
|
.sp
|
|
When the communicator is an intracommunicator, you can perform a scatter
|
|
operation in\-place (the output buffer is used as the input buffer). Use
|
|
the variable MPI_IN_PLACE as the value of the root process \fIrecvbuf\fP\&. In
|
|
this case, \fIrecvcount\fP and \fIrecvtype\fP are ignored, and the root process
|
|
sends no data to itself.
|
|
.sp
|
|
Note that MPI_IN_PLACE is a special kind of value; it has the same
|
|
restrictions on its use as MPI_BOTTOM.
|
|
.sp
|
|
Because the in\-place option converts the receive buffer into a
|
|
send\-and\-receive buffer, a Fortran binding that includes INTENT must
|
|
mark these as INOUT, not OUT.
|
|
.SH WHEN COMMUNICATOR IS AN INTER-COMMUNICATOR
|
|
.sp
|
|
When the communicator is an inter\-communicator, the root process in the
|
|
first group sends data to all processes in the second group. The first
|
|
group defines the root process. That process uses MPI_ROOT as the value
|
|
of its \fIroot\fP argument. The remaining processes use \fBMPI_PROC_NULL\fP as the
|
|
value of their \fIroot\fP argument. All processes in the second group use
|
|
the rank of that root process in the first group as the value of their
|
|
\fIroot\fP argument. The receive buffer argument of the root process in the
|
|
first group must be consistent with the receive buffer argument of the
|
|
processes in the second group.
|
|
.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_Gather\fP
|
|
.IP \(bu 2
|
|
\fI\%MPI_Gatherv\fP
|
|
.IP \(bu 2
|
|
\fI\%MPI_Scatter\fP
|
|
.UNINDENT
|
|
.UNINDENT
|
|
.UNINDENT
|
|
.SH COPYRIGHT
|
|
2003-2025, The Open MPI Community
|
|
.\" Generated by docutils manpage writer.
|
|
.
|