I don't think that the displacements (disps) are being handled correctly in MPI_Allgatherv, for a single process case. The disps are being handled as byte offsets, instead of 'item' offsets...they need to be multiplied by the size, in bytes,
of the MPI_Datatype being sent.

This bug seems to be closely related this: https://svn.open-mpi.org/trac/ompi/changeset/16360
and probably is present in all of the routines listed there.

The following code demonstrates the problem; make sure you run it as one process only. The input and output should
be the same, but that is not the case.

==================================================

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

void tcalloc(int **p,int n)
{
 *p = (int*)calloc(n,sizeof(int));
}


int main(int argc, char * argv[])
{
 int i;
 int nto_global = 0;
 int np = 1;
 int *propto_global = NULL;
 int *propto = NULL;
 int  nto = 10;
 int counts[1];
 int displs[1];

 MPI_Init(&argc,&argv);

 tcalloc(&propto,nto+1);

 for (i = 1; i <= nto; i++) propto[i] = i;

 counts[0] = nto;
 displs[0] = 1;

// BUG: if I set displs[0] above to 4, things work as expected. But, the displacements
 // are supposed to be the number of items, not bytes.

 for (i = 0; i < np; i++)
   {
     nto_global += counts[i];
   }


 tcalloc(&propto_global, nto_global+1);

 for (i = 1; i <= nto; i++) printf("INPUT %d --> %d\n",i,propto[i]);

 MPI_Allgatherv(propto+1,
                nto,
                MPI_INT,
                propto_global,
                counts,
                displs,
                MPI_INT,
                MPI_COMM_WORLD);

for (i = 1; i <= nto_global; i++) printf("OUTPUT %d --> %d\n",i,propto_global[i]);

 free(propto_global);
 free(propto);

 return(0);
}



--
=========================================================
Daniel G. Hyams
Associate Research Professor
UT SimCenter at Chattanooga
Email: daniel-hy...@utc.edu
Phone: 423-425-5491
Fax:   423-425-5517
=========================================================

Reply via email to