Maybe the example is too simple. Here is another one which when run on two tasks sends two integers from each task to task 0. Task 1 receives nothing. This works with mpich and impi but fails with openmpi.
#include <stdio.h> #include <mpi.h> my_mpi_test(int rank, int ntasks) { MPI_Datatype stype, rtype; int sbuf[2]; int rbuf[4]; int slen[ntasks], sdisp[ntasks], stypes[ntasks], rlen[ntasks], rdisp[ntasks], rtypes[ntasks]; sbuf[0]=rank; sbuf[1]=ntasks+rank; slen[0]=2; slen[1]=0; stypes[0]=MPI_INT; stypes[1]=MPI_DATATYPE_NULL; sdisp[0]=0; sdisp[1]=4; if(rank==0){ rlen[0]=2; rlen[1]=2; rtypes[0]=MPI_INT; rtypes[1]=MPI_INT; rdisp[0]=0; rdisp[1]=8; }else{ rlen[0]=0; rlen[1]=0; rtypes[0]=MPI_DATATYPE_NULL; rtypes[1]=MPI_DATATYPE_NULL; rdisp[0]=0; rdisp[1]=0; } MPI_Alltoallw(sbuf, slen, sdisp, stypes, rbuf, rlen, rdisp, rtypes, MPI_COMM_WORLD); if(rank==0){ printf("%d %d %d %d\n",rbuf[0],rbuf[1],rbuf[2],rbuf[3]); } int main(int argc, char **argv) { int rank, ntasks; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD, &ntasks); printf("rank %d ntasks %d\n",rank, ntasks); my_mpi_test(rank,ntasks); MPI_Finalize(); }