Jim,

can you please post your configure command line and test output on both systems ?



fwiw, Open MPI strictly sticks to the (current) MPI standard regarding MPI_DATATYPE_NULL

(see http://lists.mpi-forum.org/pipermail/mpi-forum/2016-January/006417.html)


there have been some attempts to deviate from the MPI standard

(e.g. implement what the standard "should" be versus what the standard says)

and they were all crushed at a very early stage in Open MPI.



Cheers,


Gilles


On 4/20/2017 2:53 AM, Jim Edwards wrote:
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

_______________________________________________
users mailing list
users@lists.open-mpi.org
https://rfd.newmexicoconsortium.org/mailman/listinfo/users

Reply via email to