[Beowulf] MPI programming question: Interleaved MPI_Gatherv?

Rob Ross rross at mcs.anl.gov
Thu Mar 3 08:36:48 PST 2005



William Gropp wrote:
> At 12:44 AM 3/1/2005, Michael Gauckler wrote:
> 
>> Dear List,
>>
>> I would like to gather the data from several processes.
>> Instead of the comonly used stride, I want to interleave
>> the data:
>>
>> Rank 0: AAAAA -> ABCDABCDABCDABCDABCD
>> Rank 1: BBBBB ----^---^---^---^---^
>> Rank 2: CCCCC -----^---^---^---^---^
>> Rank 3: DDDDD ------^---^---^---^---^
>>
>> Since the stride of the receive type is indicated
>> in multpiles of its mpi_type, no interleaving is
>> possible (the smallest striping factor leads to
>> AAAAABBBBBBCCCCCDDDDD).
>>
>> Is there a way to achieve this behaviour in an
>> elegant way, as MPI_Gather promises it? Or do
>> I need to do Send/Recv with self-aligned offsets?
> 
> 
> You should be able to do this with MPI_Gather by creating a new datatype 
> on the receiving process whose extent is the size of a single item; that 
> will get you the correct offset for the first element.  In order to 
> receive the subsequent elements into the desired location, you need to 
> use a vector type containing the number of elements.  And for this to be 
> fast, you need an MPI implementation that will handle the "resized" 
> datatype efficiently (use MPI_Type_vector to create the full datatype 
> and MPI_Type_create_resized to change its effective extent).  If you are 
> moving large amounts of data, separate send/recvs are probably a better 
> choice.
> 
> Bill

Nice!

Rob



More information about the Beowulf mailing list