void F77_FUNC(mpix_torus_ndims,MPIX_TORUS_NDIMS)(MPI_Fint * numdim, MPI_Fint * ierr) { int mynumdim = -1; *ierr = (MPI_Fint)MPIX_Torus_ndims(&mynumdim); *numdim = (MPI_Fint)mynumdim; return; }
MPI_Comm ReorderRanksZCurve(MPI_Comm comm) { MPI_Status status; int rank, size; MPI_Comm_rank(comm, &rank); MPI_Comm_size(comm, &size); int dim; MPIX_Torus_ndims(&dim); int* mycoords = new int[dim + 1]; MPIX_Rank2torus(rank, mycoords); MPI_Send(mycoords, dim, MPI_INT, 0, 111, comm); delete [] mycoords; if (rank == 0) { int** coords = new int*[size]; for (int i = 0; i < size; i++) { coords[i] = new int[dim + 1]; coords[i][dim] = i; MPI_Recv(coords[i], dim, MPI_INT, i, 111, comm, &status); } KdTreeSort(coords, 0, dim, size); //DebugRankCoords(coords, dim, size); for (int i = 0; i < size; i++) { MPI_Send(&coords[i][dim], 1, MPI_INT, i, 112, comm); delete [] coords[i]; } delete [] coords; } int new_rank; MPI_Recv(&new_rank, 1, MPI_INT, 0, 112, comm, &status); MPI_Comm new_comm; MPI_Comm_split(comm, 0, new_rank, &new_comm); return new_comm; }
void F77_FUNC(mpix_rank2torus,MPIX_RANK2TORUS)(MPI_Fint * rank, MPI_Fint * coords, MPI_Fint * ierr) { int torusdim = -1; int rc = MPIX_Torus_ndims(&torusdim); if (rc!=MPI_SUCCESS) { *ierr = (MPI_Fint)rc; return; } int myrank = -1; safecast(*rank, &myrank); int * mycoords = malloc(torusdim*sizeof(int)); *ierr = (MPI_Fint)MPIX_Rank2torus(myrank, mycoords); for (int i=0; i<torusdim; i++) coords[i] = (MPI_Fint)mycoords[i]; free(mycoords); return; }
void F77_FUNC(mpix_torus2rank,MPIX_TORUS2RANK)(MPI_Fint * coords, MPI_Fint * rank, MPI_Fint * ierr) { int torusdim = -1; int rc = MPIX_Torus_ndims(&torusdim); if (rc!=MPI_SUCCESS) { *ierr = (MPI_Fint)rc; return; } int * mycoords = malloc(torusdim*sizeof(int)); for (int i=0; i<torusdim; i++) safecast(mycoords[i], &(mycoords[i]) ); int myrank = -1; *ierr = (MPI_Fint)MPIX_Torus2rank(mycoords, &myrank); *rank = (MPI_Fint)myrank; free(mycoords); return; }