Hi,

I have openmpi-2.0.2 builds on two different machines and I have a test
code which works on one machine and does not on the other machine.  I'm
struggling to understand why and I hope that by posting here someone may
have some insight.

The test is using mpi derived data types and mpi_alltoallw on 4 tasks.  On
the machine that fails it appears to ignore the displacement in the derived
datatype defined on task 0 and just send 0-3 to all tasks.    The failing
machine is built against gcc 5.4.0, the working machine has both intel
16.0.3 and gcc 6.3.0 builds.

#include "mpi.h"

#include <stdio.h>


int main(int argc, char *argv[])

{

    int rank, size;

    MPI_Datatype type[4], type2[4];

    int displacement[1];

    int sbuffer[16];

    int rbuffer[4];

    MPI_Status status;

    int scnts[4], sdispls[4], rcnts[4], rdispls[4];

    MPI_Init(&argc, &argv);

    MPI_Comm_size(MPI_COMM_WORLD, &size);

    if (size < 4)

    {

        printf("Please run with 4 processes.\n");

        MPI_Finalize();

        return 1;

    }

    MPI_Comm_rank(MPI_COMM_WORLD, &rank);


    /* task 0 has sbuffer of size 16 and we are going to send 4 values to
each of tasks 0-3, offsetting in each

       case so that the expected result is

       task[0] 0-3

       task[1] 4-7

       task[2] 8-11

       task[3] 12-15

    */



    for( int i=0; i<size; i++){

      if (rank == 0){

scnts[i] = 1;

      }else{

scnts[i] = 0;

      }

      sdispls[i] = 0;

      rcnts[i] = 0;

      rdispls[i] = 0;

    }

    rcnts[0] = 1;



    for (int i=0; i<size; i++){

      type[i] = MPI_INT;

      type2[i] = MPI_INT;

      rbuffer[i] = -1;

    }

      /* on the recv side we create a data type which is a single block of
4 integers for the recv from 0

otherwise we use MPI_INT as a placeholder for the type

(openmpi does not want us to use MPI_DATATYPE_NULL a stupid
misinterpretation of the standard imho )*/


    displacement[0] = 0;

    MPI_Type_create_indexed_block(1, 4, displacement, MPI_INT, type2);

    MPI_Type_commit(type2);


    if (rank == 0)

    {

      for( int i=0; i<size; i++){

displacement[0] = i*4;

/* we create a datatype which is a single block of 4 integers with offset 4
from the start of sbuffer */

MPI_Type_create_indexed_block(1, 4, displacement, MPI_INT, type + i);

MPI_Type_commit(type+i);

      }

      for (int i=0; i<16; i++)

sbuffer[i] = i;

    }


    for (int i=0; i<size; i++)

      printf("rank %d i=%d: scnts %d sdispls %d stype %d rcnts %d rdispls
%d rtype %d\n", rank, i, scnts[i], sdispls[i], type[i], rcnts[i],
rdispls[i], type2[i]);

    MPI_Alltoallw(sbuffer, scnts, sdispls, type, rbuffer, rcnts, rdispls,
type2, MPI_COMM_WORLD);


    for (int i=0; i<4; i++)

      printf("rbuffer[%d] = %d\n", i, rbuffer[i]);

    fflush(stdout);


    MPI_Finalize();

    return 0;

}

-- 
Jim Edwards

CESM Software Engineer
National Center for Atmospheric Research
Boulder, CO
_______________________________________________
users mailing list
users@lists.open-mpi.org
https://rfd.newmexicoconsortium.org/mailman/listinfo/users

Reply via email to