Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}