Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
prefer the stack to the heap for temp data
authorMartin Quinson <martin.quinson@loria.fr>
Thu, 2 Mar 2017 18:29:51 +0000 (19:29 +0100)
committerMartin Quinson <martin.quinson@loria.fr>
Thu, 2 Mar 2017 18:36:41 +0000 (19:36 +0100)
src/kernel/routing/DragonflyZone.cpp
src/kernel/routing/DragonflyZone.hpp
src/kernel/routing/TorusZone.cpp

index 8405006..827aa98 100644 (file)
@@ -30,18 +30,15 @@ DragonflyZone::~DragonflyZone()
   }
 }
 
-unsigned int* DragonflyZone::rankId_to_coords(int rankId)
+void DragonflyZone::rankId_to_coords(int rankId, unsigned int (*coords)[4])
 {
   // coords : group, chassis, blade, node
-  unsigned int* coords =  new unsigned int[4];
-  coords[0]            = rankId / (numChassisPerGroup_ * numBladesPerChassis_ * numNodesPerBlade_);
+  (*coords)[0]         = rankId / (numChassisPerGroup_ * numBladesPerChassis_ * numNodesPerBlade_);
   rankId               = rankId % (numChassisPerGroup_ * numBladesPerChassis_ * numNodesPerBlade_);
-  coords[1]            = rankId / (numBladesPerChassis_ * numNodesPerBlade_);
+  (*coords)[1]         = rankId / (numBladesPerChassis_ * numNodesPerBlade_);
   rankId               = rankId % (numBladesPerChassis_ * numNodesPerBlade_);
-  coords[2]            = rankId / numNodesPerBlade_;
-  coords[3]            = rankId % numNodesPerBlade_;
-
-  return coords;
+  (*coords)[2]         = rankId / numNodesPerBlade_;
+  (*coords)[3]         = rankId % numNodesPerBlade_;
 }
 
 void DragonflyZone::parse_specific_arguments(sg_platf_cluster_cbarg_t cluster)
@@ -271,8 +268,10 @@ void DragonflyZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_c
     return;
   }
 
-  unsigned int* myCoords     = rankId_to_coords(src->id());
-  unsigned int* targetCoords = rankId_to_coords(dst->id());
+  unsigned int myCoords[4];
+  rankId_to_coords(src->id(), &myCoords);
+  unsigned int targetCoords[4];
+  rankId_to_coords(dst->id(), &targetCoords);
   XBT_DEBUG("src : %u group, %u chassis, %u blade, %u node", myCoords[0], myCoords[1], myCoords[2], myCoords[3]);
   XBT_DEBUG("dst : %u group, %u chassis, %u blade, %u node", targetCoords[0], targetCoords[1], targetCoords[2],
             targetCoords[3]);
@@ -349,9 +348,6 @@ void DragonflyZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_c
   route->link_list->push_back(targetRouter->myNodes_[targetCoords[3] * numLinksperLink_ + numLinksperLink_ - 1]);
   if (latency)
     *latency += targetRouter->myNodes_[targetCoords[3] * numLinksperLink_ + numLinksperLink_ - 1]->latency();
-
-  delete[] myCoords;
-  delete[] targetCoords;
 }
 }
 }
index 8a0386b..b974803 100644 (file)
@@ -69,9 +69,9 @@ public:
   void generateRouters();
   void generateLinks();
   void createLink(std::string id, int numlinks, surf::LinkImpl** linkup, surf::LinkImpl** linkdown);
-  unsigned int* rankId_to_coords(int rankId);
 
 private:
+  void rankId_to_coords(int rankId, unsigned int (*coords)[4]);
   sg_platf_cluster_cbarg_t cluster_;
   unsigned int numNodesPerBlade_    = 0;
   unsigned int numBladesPerChassis_ = 0;
index cbea25d..3174121 100644 (file)
@@ -9,19 +9,15 @@
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_cluster_torus, surf_route_cluster, "Torus Routing part of surf");
 
-inline unsigned int* rankId_to_coords(int rankId, std::vector<unsigned int> dimensions)
+inline void rankId_to_coords(int rankId, std::vector<unsigned int> dimensions, unsigned int (*coords)[4])
 {
-
   unsigned int dim_size_product = 1;
-  unsigned int* coords =  new unsigned int[dimensions.size()];
   unsigned int i = 0;
   for (auto cur_dim_size: dimensions) {
-    coords[i]    = (rankId / dim_size_product) % cur_dim_size;
+    (*coords)[i] = (rankId / dim_size_product) % cur_dim_size;
     dim_size_product *= cur_dim_size;
     i++;
   }
-
-  return coords;
 }
 
 namespace simgrid {
@@ -133,8 +129,10 @@ void TorusZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_cbarg
    * both arrays, we can easily assess whether we need to route
    * into this dimension or not.
    */
-  unsigned int* myCoords     = rankId_to_coords(src->id(), dimensions_);
-  unsigned int* targetCoords = rankId_to_coords(dst->id(), dimensions_);
+  unsigned int myCoords[4];
+  rankId_to_coords(src->id(), dimensions_, &myCoords);
+  unsigned int targetCoords[4];
+  rankId_to_coords(dst->id(), dimensions_, &targetCoords);
   /*
    * linkOffset describes the offset where the link
    * we want to use is stored
@@ -212,8 +210,6 @@ void TorusZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_cbarg
     current_node = next_node;
     next_node    = 0;
   }
-  delete[] myCoords;
-  delete[] targetCoords;
 }
 }
 }