c5596548b2
Blocking versions are simple linear algorithms implemented in coll/basic. Non- blocking versions are from libnbc 1.1.1. All algorithms have been tested with simple test cases. cmr=v1.7.4:reviewer=jsquyres This commit was SVN r29265.
166 строки
5.7 KiB
Plaintext
166 строки
5.7 KiB
Plaintext
.\" Copyright 2013 Los Alamos National Security, LLC. All rights reserved.
|
|
.\" Copyright 2010 Cisco Systems, Inc. All rights reserved.
|
|
.\" Copyright 2006-2008 Sun Microsystems, Inc.
|
|
.\" Copyright (c) 1996 Thinking Machines Corporation
|
|
.TH MPI_Neighbor_alltoallw 3 "#OMPI_DATE#" "#PACKAGE_VERSION#" "#PACKAGE_NAME#"
|
|
|
|
.SH NAME
|
|
\fBMPI_Neighbor_alltoallw\fP \- All processes send data of different types to, and receive data of different types from, all processes
|
|
|
|
.SH SYNTAX
|
|
.ft R
|
|
|
|
.SH C Syntax
|
|
.nf
|
|
#include <mpi.h>
|
|
int MPI_Neighbor_alltoallw(void *\fIsendbuf\fP, int *\fIsendcounts\fP,
|
|
int *\fIsdispls\fP, MPI_Datatype *\fIsendtypes\fP,
|
|
void *\fIrecvbuf\fP, int *\fIrecvcounts\fP,
|
|
int *\fIrdispls\fP, MPI_Datatype *\fIrecvtypes\fP, MPI_Comm \fIcomm\fP)
|
|
|
|
.fi
|
|
.SH Fortran Syntax
|
|
.nf
|
|
INCLUDE 'mpif.h'
|
|
MPI_ALLTOALLW(\fISENDBUF, SENDCOUNTS, SDISPLS, SENDTYPES,
|
|
RECVBUF, RECVCOUNTS, RDISPLS, RECVTYPES, COMM, IERROR\fP)
|
|
|
|
<type> \fISENDBUF(*), RECVBUF(*)\fP
|
|
INTEGER \fISENDCOUNTS(*), SDISPLS(*), SENDTYPES(*)\fP
|
|
INTEGER \fIRECVCOUNTS(*), RDISPLS(*), RECVTYPES(*)\fP
|
|
INTEGER \fICOMM, IERROR\fP
|
|
|
|
.fi
|
|
.SH INPUT PARAMETERS
|
|
.ft R
|
|
.TP 1.2i
|
|
sendbuf
|
|
Starting address of send buffer.
|
|
.TP 1.2i
|
|
sendcounts
|
|
Integer array, where entry i specifies the number of elements to send
|
|
to neighbor i.
|
|
.TP 1.2i
|
|
sdispls
|
|
Integer array, where entry i specifies the displacement (in bytes,
|
|
offset from \fIsendbuf\fP) from which to send data to neighbor i.
|
|
.TP 1.2i
|
|
sendtypes
|
|
Datatype array, where entry i specifies the datatype to use when
|
|
sending data to neighbor i.
|
|
.TP 1.2i
|
|
recvcounts
|
|
Integer array, where entry j specifies the number of elements to
|
|
receive from neighbor j.
|
|
.TP 1.2i
|
|
rdispls
|
|
Integer array, where entry j specifies the displacement (in bytes,
|
|
offset from \fIrecvbuf\fP) to which data from neighbor j should
|
|
be written.
|
|
.TP 1.2i
|
|
recvtypes
|
|
Datatype array, where entry j specifies the datatype to use when
|
|
receiving data from neighbor j.
|
|
.TP 1.2i
|
|
comm
|
|
Communicator over which data is to be exchanged.
|
|
|
|
.SH OUTPUT PARAMETERS
|
|
.ft R
|
|
.TP 1.2i
|
|
recvbuf
|
|
Address of receive buffer.
|
|
.ft R
|
|
.TP 1.2i
|
|
IERROR
|
|
Fortran only: Error status.
|
|
|
|
.SH DESCRIPTION
|
|
.ft R
|
|
MPI_Neighbor_alltoallw is a generalized collective operation in which all
|
|
processes send data to and receive data from all neighbors. It
|
|
adds flexibility to MPI_Neighbor_alltoallv 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 neighbors in
|
|
the topology of communicator \fIcomm\fP) independent point-to-point communications.
|
|
The neighbors and buffer layout are determined by the topology of \fIcomm\fP.
|
|
.sp
|
|
.nf
|
|
MPI_Cart_get(\fIcomm\fP, maxdims, dims, periods, coords);
|
|
for (dim = 0, i = 0 ; dim < dims ; ++dim) {
|
|
MPI_Cart_shift(\fIcomm\fP, dim, 1, &r0, &r1);
|
|
MPI_Isend(\fIsendbuf\fP + \fIsdispls\fP[i] * extent(\fIsendtype\fP),
|
|
\fIsendcount\fP, \fIsendtypes\fP[i], r0, ..., \fIcomm\fP, ...);
|
|
MPI_Irecv(\fIrecvbuf\fP + \fIrdispls\fP[i] * extent(\fIrecvtype\fP),
|
|
\fIrecvcount\fP, \fIrecvtypes\fP[i], r0, ..., \fIcomm\fP, ...);
|
|
++i;
|
|
MPI_Isend(\fIsendbuf\fP + \fIsdispls\fP[i] * extent(\fIsendtype\fP),
|
|
\fIsendcount\fP, \fIsendtypes\fP[i], r1, ..., \fIcomm\fP, &req[i]);
|
|
MPI_Irecv(\fIrecvbuf\fP + \fIrdispls\fP[i] * extent(\fIrecvtype\fP),
|
|
\fIrecvcount\fP, \fIrecvtypes\fP[i], r1, ..., \fIcomm\fP, ...);
|
|
++i;
|
|
}
|
|
|
|
MPI_Wait_all (...);
|
|
|
|
MPI_Comm_size(\fIcomm\fP, &n);
|
|
for (i = 0, i < n; i++)
|
|
MPI_Send(\fIsendbuf\fP + \fIsdispls\fP[i], \fIsendcounts\fP[i],
|
|
\fIsendtypes\fP[i], i, ..., \fIcomm\fP);
|
|
for (i = 0, i < n; i++)
|
|
MPI_Recv(\fIrecvbuf\fP + \fIrdispls\fP[i], \fIrecvcounts\fP[i],
|
|
\fIrecvtypes\fP[i], i, ..., \fIcomm\fP);
|
|
.fi
|
|
.sp
|
|
Process j sends the k-th block of its local \fIsendbuf\fP to neighbor
|
|
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
|
|
.SH NOTES
|
|
.ft R
|
|
The MPI_IN_PLACE option for \fIsendbuf\fP is not meaningful for this operation
|
|
.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 MPI_Neighbor_alltoallv, where these offsets are measured in units
|
|
of \fIsendtype\fP and \fIrecvtype\fP, respectively.
|
|
|
|
.SH ERRORS
|
|
.ft R
|
|
Almost all MPI routines return an error value; C routines as
|
|
the value of the function and Fortran routines in the last argument.
|
|
.sp
|
|
Before the error value is returned, the current MPI error handler is
|
|
called. By default, this error handler aborts the MPI job, except for
|
|
I/O function errors. The error handler may be changed with
|
|
MPI_Comm_set_errhandler; 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.
|
|
|
|
.SH SEE ALSO
|
|
.ft R
|
|
.nf
|
|
MPI_Neighbor_alltoall
|
|
MPI_Neighbor_alltoallv
|
|
MPI_Cart_create
|
|
MPI_Graph_create
|
|
MPI_Dist_graph_create
|
|
|