Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
no need for a lib to store the netcards. A dict is easier
[simgrid.git] / src / smpi / smpi_topo.cpp
index 1e5f55d..5d5417e 100644 (file)
@@ -45,7 +45,7 @@ typedef struct s_smpi_mpi_topology {
 } s_smpi_mpi_topology_t;
 
 void smpi_topo_destroy(MPI_Topology topo) {
-    if(topo == NULL) {
+    if(topo == nullptr) {
         return;
     }
     switch (topo->kind) {
@@ -64,6 +64,7 @@ void smpi_topo_destroy(MPI_Topology topo) {
         return;
         break;
     }
+    xbt_free(topo);
 }
 
 MPI_Topology smpi_topo_create(MPIR_Topo_type kind) {
@@ -79,15 +80,15 @@ MPI_Topology smpi_topo_create(MPIR_Topo_type kind) {
 void smpi_cart_topo_destroy(MPIR_Cart_Topology cart) {
     if (cart) {
         if(cart->dims) {
-            free(cart->dims);
+            xbt_free(cart->dims);
         }
         if(cart->periodic) {
-            free(cart->periodic);
+            xbt_free(cart->periodic);
         }
         if(cart->position) {
-            free(cart->position);
+            xbt_free(cart->position);
         }
-        free(cart);
+        xbt_free(cart);
     }
 }
 
@@ -132,9 +133,6 @@ int smpi_mpi_cart_create(MPI_Comm comm_old, int ndims, int dims[], int periods[]
 
         newCart->topo.cart->nnodes = newSize;
 
-        /* memcpy(newCart->topo.cart->dims, dims, ndims * sizeof(*newCart->topo.cart->dims)); */
-        /* memcpy(newCart->topo.cart->periodic, periods, ndims * sizeof(*newCart->topo.cart->periodic)); */
-
         //  FIXME : code duplication... See smpi_mpi_cart_coords
         nranks = newSize;
         for (i=0; i<ndims; i++) {
@@ -150,7 +148,7 @@ int smpi_mpi_cart_create(MPI_Comm comm_old, int ndims, int dims[], int periods[]
     } else {
         if (rank == 0) {
             newCart = smpi_cart_topo_create(ndims);
-            *comm_cart = smpi_comm_new(smpi_comm_group(MPI_COMM_SELF), newCart);
+            *comm_cart = smpi_comm_new(smpi_group_copy(smpi_comm_group(MPI_COMM_SELF)), newCart);
         } else {
             *comm_cart = MPI_COMM_NULL;
         }
@@ -161,14 +159,15 @@ int smpi_mpi_cart_create(MPI_Comm comm_old, int ndims, int dims[], int periods[]
 int smpi_mpi_cart_sub(MPI_Comm comm, const int remain_dims[], MPI_Comm *newcomm) {
     MPI_Topology oldTopo = smpi_comm_topo(comm);
     int oldNDims = oldTopo->topo.cart->ndims;
-    int i, j = 0, newNDims, *newDims = NULL, *newPeriodic = NULL;
+    int i, j = 0, newNDims, *newDims = nullptr, *newPeriodic = nullptr;
   
-    if (remain_dims == NULL && oldNDims != 0) {
+    if (remain_dims == nullptr && oldNDims != 0) {
         return MPI_ERR_ARG;
     }
     newNDims = 0;
     for (i = 0 ; i < oldNDims ; i++) {
-        if (remain_dims[i]) newNDims++;
+        if (remain_dims[i]) 
+            newNDims++;
     }
   
     if (newNDims > 0) {
@@ -203,8 +202,8 @@ int smpi_mpi_cart_coords(MPI_Comm comm, int rank, int maxdims, int coords[]) {
 
 int smpi_mpi_cart_get(MPI_Comm comm, int maxdims, int* dims, int* periods, int* coords) {
     MPI_Topology topo = smpi_comm_topo(comm);
-
-    for(int i = 0 ; i < maxdims ; i++) {
+    int ndims=topo->topo.cart->ndims < maxdims ? topo->topo.cart->ndims : maxdims;
+    for(int i = 0 ; i < ndims ; i++) {
         dims[i] = topo->topo.cart->dims[i];
         periods[i] = topo->topo.cart->periodic[i];
         coords[i] = topo->topo.cart->position[i];
@@ -236,7 +235,8 @@ int smpi_mpi_cart_rank(MPI_Comm comm, int* coords, int* rank) {
         } else if (coord <  0) {
             if(topo->topo.cart->periodic[i]) {
                 coord = coord % topo->topo.cart->dims[i];
-                if (coord) coord = topo->topo.cart->dims[i] + coord;
+                if (coord) 
+                    coord = topo->topo.cart->dims[i] + coord;
             } else {
                 *rank = -1;
                 return MPI_ERR_ARG;
@@ -424,7 +424,7 @@ assignnodes(int ndim, int nfactor, int *pfacts, int **pdims)
 
     /* Allocate and initialize the bins */
     bins = (int *) malloc((unsigned) ndim * sizeof(int));
-    if (NULL == bins) {
+    if (nullptr == bins) {
         return MPI_ERR_NO_MEM;
     }
     *pdims = bins;
@@ -477,7 +477,7 @@ static int getfactors(int num, int *nfactors, int **factors) {
 
     if(num  < 2) {
         (*nfactors) = 0;
-        (*factors) = NULL;
+        (*factors) = nullptr;
         return MPI_SUCCESS;
     }
     /* Allocate the array of prime factors which cannot exceed log_2(num) entries */