MPI_SCAN( sendbuf, recvbuf, count, datatype, op, comm )
[ IN sendbuf] starting address of send buffer (choice)
[ OUT recvbuf] starting address of receive buffer (choice)
[ IN count] number of elements in input buffer (integer)
[ IN datatype] data type of elements of input buffer (handle)
[ IN op] operation (handle)
[ IN comm] communicator (handle)
int MPI_Scan(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm )
MPI_SCAN(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER COUNT, DATATYPE, OP, COMM, IERROR
MPI_SCAN is used to perform a prefix reduction on data distributed across the group. The operation returns, in the receive buffer of the process with rank i, the reduction of the values in the send buffers of processes with ranks 0,...,i (inclusive). The type of operations supported, their semantics, and the constraints on send and receive buffers are as for MPI_REDUCE.
[] Rationale.
We have defined an inclusive scan, that is, the prefix reduction on
process i includes the data from process i. An alternative
is to define scan in an exclusive manner, where the result on i
only includes data up to i-1. Both definitions are useful.
The latter has some advantages:
the inclusive scan can always be computed from the exclusive scan with
no additional communication; for non-invertible operations
such as max and min, communication is required to compute
the exclusive scan from the inclusive scan.
There
is, however, a complication with exclusive scan since one must define the
``unit'' element for the reduction in this case. That is, one must
explicitly say what occurs for process 0. This was thought to
be complex for user-defined operations and hence, the exclusive scan
was dropped.
( End of rationale.)