Ah, I see the problem now.

I am working on a fix; many thanks for the report!  (Further updates will be
on http://svn.open-mpi.org/trac/ompi/ticket/430)


On 9/27/06 10:24 AM, "Lisandro Dalcin" <dalc...@intec.unl.edu.ar> wrote:

> Here an example of the problems I have with MPI_INPLACE in OMPI.
> Hoping this can be useful. Perhaps the problem is not in OMPI sources,
> but in my particular build. I've configured with:
> 
> $ head -n 7 config.log | tail -n 1
>   $ ./configure --disable-dlopen --prefix /usr/local/openmpi/1.1.1
> 
> First I present a very simple program that gives right results with
> OMPI, next a small modification changing the sendcount argument, wich
> gives now wrong results.
> 
> Using MPICH2, both versions give the same, right result.
> 
> My environment:
> --------------
> 
> $ echo $PATH
> /usr/local/openmpi/1.1.1/bin:/usr/kerberos/bin:/usr/lib/ccache/bin:/usr/local/
> bin:/bin:/usr/bin:/usr/X11R6/bin:.
> 
> $ echo $LD_LIBRARY_PATH
> /usr/local/openmpi/1.1.1/lib:/usr/local/openmpi/1.1.1/lib/openmpi
> 
> First test program
> -----------------
> 
> This stupid program gathers the values of comm.rank at a root process
> with rank = com.size/2 and prints the gathered values.
> 
> $ cat gather.c
> #include <stdio.h>
> #include <mpi.h>
> 
> int main() {
>   int size, rank, root;
>   MPI_Init(NULL, NULL);
>   MPI_Comm_size(MPI_COMM_WORLD, &size);
>   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
>   root = size/2;
>   if (rank == root) {
>     int i;
>     int *buf = (int *) malloc(size * sizeof(int));
>     for (i=0; i<size; i++) buf[i] = -1;
>     buf[rank] = rank;
>     MPI_Gather(MPI_IN_PLACE, 1, MPI_DATATYPE_NULL,
>                buf,          1, MPI_INT,
>                root, MPI_COMM_WORLD);
>     for (i=0; i<size; i++) printf("%d,", buf[i]);
>     printf("\n");
>     free(buf);
>   } else {
>     MPI_Gather(&rank, 1, MPI_INT,
>                NULL,  0, MPI_DATATYPE_NULL,
>                root, MPI_COMM_WORLD);
>   }
>   MPI_Finalize();
> }
> 
> Run results:
> -----------
> $ mpicc gather.c
> $ mpirun -n 5 a.out
> 0,1,2,3,4,
> 
> 
> Second test program
> -------------------
> 
> I only modify the sendcount argument at root process, which is the one
> passing sendbuf=MPI_INPLACE.
> 
> $ cat gather.c
> #include <stdio.h>
> #include <mpi.h>
> 
> int main() {
>   int size, rank, root;
>   MPI_Init(NULL, NULL);
>   MPI_Comm_size(MPI_COMM_WORLD, &size);
>   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
>   root = size/2;
>   if (rank == root) {
>     int i;
>     int *buf = (int *) malloc(size * sizeof(int));
>     for (i=0; i<size; i++) buf[i] = -1;
>     buf[rank] = rank;
>     MPI_Gather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL,
>                buf,          1, MPI_INT,
>                root, MPI_COMM_WORLD);
>     for (i=0; i<size; i++) printf("%d,", buf[i]);
>     printf("\n");
>     free(buf);
>   } else {
>     MPI_Gather(&rank, 1, MPI_INT,
>                NULL,  0, MPI_DATATYPE_NULL,
>                root, MPI_COMM_WORLD);
>   }
>   MPI_Finalize();
> }
> 
> Run results:
> -----------
> $ mpicc gather.c
> $ mpirun -n 5 a.out
> -1,-1,2,-1,-1,


-- 
Jeff Squyres
Server Virtualization Business Unit
Cisco Systems

Reply via email to