Open MPI logo

Open MPI Development Mailing List Archives

  |   Home   |   Support   |   FAQ   |  

This web mail archive is frozen.

This page is part of a frozen web archive of this mailing list.

You can still navigate around this archive, but know that no new mails have been added to it since July of 2016.

Click here to be taken to the new web archives of this list; it includes all the mails that are in this frozen archive plus all new mails that have been sent to the list since it was migrated to the new archives.

From: Lisandro Dalcin (dalcinl_at_[hidden])
Date: 2006-09-27 10:24:18


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,

-- 
Lisandro Dalcín
---------------
Centro Internacional de Métodos Computacionales en Ingeniería (CIMEC)
Instituto de Desarrollo Tecnológico para la Industria Química (INTEC)
Consejo Nacional de Investigaciones Científicas y Técnicas (CONICET)
PTLC - Güemes 3450, (3000) Santa Fe, Argentina
Tel/Fax: +54-(0)342-451.1594