Thanks for the bug report! I have no idea how this slipped through the cracks, but IN_PLACE support for MPI_ALLTOALL seems to be missing. :-(
I've filed a bug about it: https://svn.open-mpi.org/trac/ompi/ticket/2965. On Jan 18, 2012, at 4:38 PM, David Race wrote: > One of our users makes use of the MPI_IN_PLACE option, but there appears to > be a bug in the MPI_Alltoall. According to the specification - > > > The “in place” option for intracommunicators is specified by passing > MPI_IN_PLACE to > the argument sendbuf at all processes. In such a case, sendcount and sendtype > are ignored. > The data to be sent is taken from the recvbuf and replaced by the received > data. Data sent > and received must have the same type map as specified by recvcount and > recvtype. > > The application fails with > > > [prod-0002:12156] *** An error occurred in MPI_Alltoall > [prod-0002:12156] *** on communicator MPI_COMM_WORLD > [prod-0002:12156] *** MPI_ERR_ARG: invalid argument of some other kind > [prod-0002:12156] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort) > > The file below shows the potential bug: > > ================================================================================================================ > > // > // test program for the potential invalid argument bug > // > // David Race > // 18 Jan 2012 > // > > #include <stdlib.h> > #include <stdio.h> > #include <math.h> > #include <time.h> > // > // mpi > // > #include "mpi.h" > #define MAX_SIZE 32 > // > // > // > int main ( int argc, char *argv[] ) > { > // > // definitions > // > int mpierror, isize, myRank; > int typeSize; > int valA[MAX_SIZE], valB[MAX_SIZE]; > int i, j; > int commRoot; > // > // start processing > // > printf("Start of program\n"); > printf("SIZE OF VALA %ld\n",sizeof(valA)); > > mpierror = MPI_Init ( &argc, &argv ); > mpierror = MPI_Comm_rank ( MPI_COMM_WORLD, &myRank ); > mpierror = MPI_Comm_size ( MPI_COMM_WORLD, &isize ); > MPI_Barrier(MPI_COMM_WORLD); > // > // test the mpi_type_size using MPI_Alltoall > // > if (myRank == 0) { > > printf("=====================================================\n"); > printf(" Alltoall : Should work > \n"); > > printf("=====================================================\n"); > } > fflush(stdout); > for(i=0;i<isize;i++) { > valA[i] = i; > valB[i] = -1; > } > commRoot = 0; > MPI_Barrier(MPI_COMM_WORLD); > mpierror = MPI_Alltoall(valA, 1, MPI_INT, valB, 1, MPI_INT, > MPI_COMM_WORLD); > MPI_Barrier(MPI_COMM_WORLD); > for (j=0;j<isize;j++) { > MPI_Barrier(MPI_COMM_WORLD); > if (myRank == j) { > for(i=0;i<isize;i++) printf("ALLTOALL NODE %d\tValue > from node %d is %d\n",myRank, i, valA[i]); > } > fflush(stdout); > } > // > // test the mpi_type_size using MPI_Alltoall > // > MPI_Barrier(MPI_COMM_WORLD); > if (myRank == 0) { > > printf("=====================================================\n"); > printf(" Alltoall : ???? > \n"); > > printf("=====================================================\n"); > } > fflush(stdout); > for(i=0;i<isize;i++) valA[i] = i; > commRoot = 0; > MPI_Barrier(MPI_COMM_WORLD); > // > // The error occurs here > // > mpierror = MPI_Alltoall(MPI_IN_PLACE, 1, MPI_INT, valA, 1, MPI_INT, > MPI_COMM_WORLD); > MPI_Barrier(MPI_COMM_WORLD); > if (myRank == 0) { > for(i=0;i<isize;i++) printf("ALLTOALL NODE %d\tValue from node > %d is %d\n",myRank, i,valA[i]); > } > fflush(stdout); > MPI_Barrier(MPI_COMM_WORLD); > if (myRank == 1) { > for(i=0;i<isize;i++) printf("ALLTOALL NODE %d\tValue from node > %d is %d\n",myRank, i, valA[i]); > } > fflush(stdout); > MPI_Barrier(MPI_COMM_WORLD); > // > // test the mpi_type_size using MPI_Alltoall > // > if (myRank == 0) { > > printf("=====================================================\n"); > printf(" Alltoall : Failure with some MPI > \n"); > > printf("=====================================================\n"); > } > fflush(stdout); > for(i=0;i<isize;i++) valA[i] = i; > commRoot = 0; > MPI_Barrier(MPI_COMM_WORLD); > // > // The error occurs here > // > mpierror = MPI_Alltoall(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, valA, 1, > MPI_INT, MPI_COMM_WORLD); > MPI_Barrier(MPI_COMM_WORLD); > if (myRank == 0) { > for(i=0;i<isize;i++) printf("ALLTOALL NODE %d\tValue from node > %d is %d\n",myRank, i,valA[i]); > } > fflush(stdout); > MPI_Barrier(MPI_COMM_WORLD); > if (myRank == 1) { > for(i=0;i<isize;i++) printf("ALLTOALL NODE %d\tValue from node > %d is %d\n",myRank, i, valA[i]); > } > fflush(stdout); > MPI_Barrier(MPI_COMM_WORLD); > mpierror = MPI_Finalize(); > fflush(stdout); > printf("End of Program\n"); > > } > > _______________________________________________ > users mailing list > us...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/users -- Jeff Squyres jsquy...@cisco.com For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/