#include #include #include int main(int argc, char* argv[]) { MPI_Comm GlobalComm; MPI_Group GlobalGroup, Group0, Group1; int i, numproc, numproc0, numproc1, id; int *ranks, *ranks0, *ranks1; MPI_Init(&argc, &argv); MPI_Comm_dup(MPI_COMM_WORLD,&GlobalComm); MPI_Comm_size(GlobalComm, &numproc); MPI_Comm_rank(GlobalComm, &id); ranks=malloc(numproc*sizeof((int)1)); ranks0=malloc(numproc*sizeof((int)1)); ranks1=malloc(numproc*sizeof((int)1)); for ( i = 0; i < numproc; i++ ) { ranks[i] = ranks0[i] = ranks1[i] = 0; } /* Group of default communicator */ MPI_Comm_group(GlobalComm,&GlobalGroup); /* Divide processes in 2 groups */ numproc0 = numproc/2; for ( i = 0; i < numproc0; i++ ) { ranks0[i] = i; } MPI_Group_incl(GlobalGroup, numproc0, ranks0, &Group0); MPI_Group_excl(GlobalGroup, numproc0, ranks0, &Group1); MPI_Group_size(Group1, &numproc1); for ( i = 0; i < numproc; i++ ) { ranks[i] = i; } MPI_Group_translate_ranks(GlobalGroup, numproc, ranks, Group0, ranks0); MPI_Group_translate_ranks(GlobalGroup, numproc, ranks, Group1, ranks1); if ( id == 0 ) { fprintf(stdout,"Translating table: GlobalGroup, Group0, Group1\n"); for ( i = 0; i < numproc; i++ ) { fprintf(stdout," %10d, %10d, %10d\n",ranks[i], ranks0[i],ranks1[i]); } } MPI_Barrier(GlobalComm); MPI_Group_free(&GlobalGroup); MPI_Group_free(&Group0); MPI_Group_free(&Group1); MPI_Finalize(); return(0); }