Open MPI logo

Open MPI Development Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Development mailing list

Subject: Re: [OMPI devel] Bug report: single processor MPI_Allgatherv
From: Daniel G. Hyams (Daniel-Hyams_at_[hidden])
Date: 2008-01-18 16:57:30


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-Hyams_at_[hidden]
 Phone: 423-425-5491
 Fax:   423-425-5517
=========================================================