Daniel,

Thanks for the fix. It is indeed the right solution. I'll make sure it gets into the trunk asap.

  Thanks,
    george.

On Jan 18, 2008, at 4:57 PM, Daniel G. Hyams wrote:

Sorry to reply to my own mail, but the bug only affects MPI_Allgatherv.
In this changeset:

https://svn.open-mpi.org/trac/ompi/changeset/16360


In coll_self_allgatherv.c, the "extent" variable is never used. So the
fix is just to multiply
"extent" by disps[0], on line 50.  I've verified that this fixes the
problem.



Daniel G. Hyams wrote:
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
=========================================================

_______________________________________________
devel mailing list
de...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/devel

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to