On 07/06/2012 05:27 PM, Ryan S. Davis wrote:
> Hi all,
> I am trying to scatter data from the master process to the others using
> scatterv and my own datatype that maps out the blocks of data in memory.
> The problem is that I dont know what unit size the function (scatterv)
> is using to measure displacements in. I assume that it is using the
> extent of the user-defined datatype, but I need
> to specify the displacements in bytes.
> For example, if I specify a displacement of 2 from the sendbuffer, does
> this mean 2 bytes
> or 2*MPI_Type_size() or 2*MPI_Type_extent()? The man page isn't very
> clear on this.
> I know that there is function MPI_Type_hindexed, that accepts
> displacements measured is bytes
> when creating new datatypes.
> Is there something similar for scatterv/gatherv?
I think MPI multiplies the displacement values by the type extent,
to get the buffer addresses being scattered.
So, if I understood your question right, the
answer is: the second address will be 2*MPI_Type_extent()
bytes away from the sendbuffer initial address.
MPI, The Complete Reference, Vol. 1, 2nd Edition,
by M. Snir et al., p. 212-
The outcome is as if the root executed n send operations,
MPI_Send(sendbuf+displs[i].extent(sendtype), sendcounts[i], sendtype, i,
...), i=0 to n-1, and each process executed a receive,
MPI_Recv(recvbuf, recvcount, recvtype, root,...)."
There is a similar description/clarification
for MPI_Gatherv on pp 202-209, and examples with
user defined types.
I hope this helps,