Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
smpi topo : a topo can be shared between some comm (duplicates), but there was no...
[simgrid.git] / src / smpi / mpi / smpi_topo.cpp
index 058b4bd..5928501 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2019. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2014-2020. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 #include <vector>
 
 /* static functions */
-static int assignnodes(int ndim, int nfactor, int *pfacts,int **pdims);
+static int assignnodes(int ndim, int nfactor, const int* pfacts, int** pdims);
 static int getfactors(int num, int *nfators, int **factors);
 
 
 namespace simgrid{
 namespace smpi{
 
+void Topo::setComm(MPI_Comm comm)
+{
+  xbt_assert(not comm_);
+  comm_ = comm;
+}
+
 /*******************************************************************************
  * Cartesian topologies
  ******************************************************************************/
@@ -67,19 +73,21 @@ Topo_Cart::Topo_Cart(MPI_Comm comm_old, int ndims, const int dims[], const int p
       for (int i = 0 ; i < newSize ; i++) {
         newGroup->set_mapping(oldGroup->actor(i), i);
       }
-      *comm_cart = new  Comm(newGroup, this);
+      *comm_cart = new  Comm(newGroup, std::shared_ptr<Topo>(this));
     }
   } else {
     if(comm_cart != nullptr){
       if (rank == 0) {
-        *comm_cart = new  Comm(new  Group(MPI_COMM_SELF->group()), this);
+        MPI_Group group = new Group(MPI_COMM_SELF->group());
+        *comm_cart      = new Comm(group, std::shared_ptr<Topo>(this));
       } else {
         *comm_cart = MPI_COMM_NULL;
       }
     }
   }
-  if(comm_cart != nullptr)
+  if(comm_cart != nullptr){
     setComm(*comm_cart);
+  }
 }
 
 Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) {
@@ -102,7 +110,7 @@ Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) {
 
     // that should not segfault
     int j = 0;
-    for (int i = 0 ; j < newNDims ; i++) {
+    for (int i = 0; i < oldNDims; i++) {
       if(remain_dims[i]) {
         newDims[j] =dims_[i];
         newPeriodic[j] =periodic_[i];
@@ -124,7 +132,9 @@ Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) {
   } else {
     *newcomm = getComm()->split(color, getComm()->rank());
     res = new Topo_Cart(getComm(), newNDims, newDims, newPeriodic, 0, nullptr);
+    std::shared_ptr<Topo> topo=std::shared_ptr<Topo>(res);
     res->setComm(*newcomm);
+    (*newcomm)->set_topo(topo);
   }
   delete[] newDims;
   delete[] newPeriodic;
@@ -264,7 +274,7 @@ int Topo_Cart::Dims_create(int nnodes, int ndims, int dims[])
   /* Get # of free-to-be-assigned processes and # of free dimensions */
   int freeprocs = nnodes;
   int freedims = 0;
-  int *p = dims;
+  const int* p  = dims;
   for (int i = 0; i < ndims; ++i) {
     if (*p == 0) {
       ++freedims;
@@ -340,7 +350,7 @@ int Topo_Cart::Dims_create(int nnodes, int ndims, int dims[])
  *          - ptr to array of dimensions (returned value)
  *  Returns:    - 0 or ERROR
  */
-static int assignnodes(int ndim, int nfactor, int *pfacts, int **pdims)
+static int assignnodes(int ndim, int nfactor, const int* pfacts, int** pdims)
 {
   int *pmin;