#include #include /* for sleep() */ #include #define Uflag -99235 void printival(char *s, int ival) { printf(s); if (ival==Uflag) { printf("U"); } else if (ival==MPI_PROC_NULL) { printf("MPI_PROC_NULL"); } else if (ival==MPI_UNDEFINED) { printf("MPI_UNDEFINED"); } else { printf("%1d",ival); } } void report_topo(int myrank, char *name, MPI_Comm cart) { int size, rank, status; MPI_Comm_size(cart, &size); MPI_Comm_rank(cart, &rank); MPI_Topo_test(cart, &status); printf("[%02d] %s: size=%1d rank=%1d %s", myrank, name, size, rank, (status==MPI_CART ? "CART" : "NOT-CART") ); if (status==MPI_CART) { int ndims; MPI_Cartdim_get(cart,&ndims); printf(" ndims=%1d", ndims); if (ndims >= 0) { int dims, periods, coords; dims=Uflag; periods=Uflag; coords=Uflag; MPI_Cart_get(cart,1,&dims,&periods,&coords); printival(" dims=",dims); printival(" periods=",periods); printival(" coords=",coords); } } printf("\n"); fflush(stdout); } int main(int argc, char *argv[]) { int myrank, size, periods, reorder, remain_dims, status, coords, rank, src, dest, dims; MPI_Comm cart1dim, sub0dim, subsub0dim, cart0dim; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); for (periods=0; periods<=1; periods++) { MPI_Barrier(MPI_COMM_WORLD); sleep(1); if (myrank==0) printf("\nndim=0 generated via MPI_Cart_sub(remain_dims=0) -- periods=%1d\n\n",periods); fflush(stdout); sleep(1); MPI_Barrier(MPI_COMM_WORLD); reorder=0; MPI_Cart_create(MPI_COMM_WORLD,1,&size,&periods,reorder,&cart1dim); report_topo(myrank, "cart1dim", cart1dim); remain_dims=0; MPI_Cart_sub(cart1dim,&remain_dims,&sub0dim); report_topo(myrank, "sub0dim", sub0dim); MPI_Topo_test(sub0dim, &status); if (status==MPI_CART) { coords=0; rank=Uflag; MPI_Cart_rank(sub0dim, &coords, &rank); printf("[%02d] MPI_Cart_rank(sub0dim,coords=0,OUT rank) -->",myrank); printival(" rank=",rank); printf("\n"); fflush(stdout); rank=0; coords=Uflag; MPI_Cart_coords(sub0dim, rank, 1, &coords); printf("[%02d] MPI_Cart_coords(sub0dim,rank=0,maxdims=1,OUT coords) -->",myrank); printival(" coords=",coords); printf("\n"); fflush(stdout); /* src=Uflag; dest=Uflag; MPI_Cart_shift(sub0dim, 0, 1, &src, &dest); printf("[%02d] MPI_Cart_shift(sub0dim,dir=0,disp=1,OUT src, OUT dest) -->",myrank); printival(" src=",src); printival(" dest=",dest); printf("\n"); fflush(stdout); */ MPI_Cart_sub(sub0dim,&remain_dims,&subsub0dim); report_topo(myrank, "subsub0dim", subsub0dim); } } for (periods=0; periods<=1; periods++) { MPI_Barrier(MPI_COMM_WORLD); sleep(1); if (myrank==0) printf("\nndim=0 generated directly with MPI_Cart_create(ndims=0) -- periods=%1d\n\n",periods); fflush(stdout); sleep(1); MPI_Barrier(MPI_COMM_WORLD); reorder=0; dims=1; MPI_Cart_create(MPI_COMM_SELF,0,&dims,&periods,reorder,&cart0dim); report_topo(myrank, "cart0dim", cart0dim); MPI_Topo_test(cart0dim, &status); if (status==MPI_CART) { coords=0; rank=Uflag; MPI_Cart_rank(cart0dim, &coords, &rank); printf("[%02d] MPI_Cart_rank(cart0dim,coords=0,OUT rank) -->",myrank); printival(" rank=",rank); printf("\n"); fflush(stdout); rank=0; coords=Uflag; MPI_Cart_coords(cart0dim, rank, 1, &coords); printf("[%02d] MPI_Cart_coords(cart0dim,rank=0,maxdims=1,OUT coords) -->",myrank); printival(" coords=",coords); printf("\n"); fflush(stdout); /* src=Uflag; dest=Uflag; MPI_Cart_shift(cart0dim, 0, 1, &src, &dest); printf("[%02d] MPI_Cart_shift(cart0dim,dir=0,disp=1,OUT src, OUT dest) -->",myrank); printival(" src=",src); printival(" dest=",dest); printf("\n"); fflush(stdout); */ MPI_Cart_sub(cart0dim,&remain_dims,&subsub0dim); report_topo(myrank, "subsub0dim", subsub0dim); } } MPI_Finalize(); }