 Algorithmique Numérique Distribuée Public GIT Repository
 author Arnaud Giersch Tue, 26 Feb 2019 20:54:53 +0000 (21:54 +0100) committer Arnaud Giersch Thu, 28 Feb 2019 20:40:35 +0000 (21:40 +0100)
Save dimensions_.size() in a local variable to help Sonar and Clang, plus other
simplifications.

index ddecf30..1ea74b3 100644 (file)

XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_cluster_torus, surf_route_cluster, "Torus Routing part of surf");

-inline void rankId_to_coords(int rankId, std::vector<unsigned int> dimensions, unsigned int* coords)
-{
-  unsigned int dim_size_product = 1;
-  unsigned int i = 0;
-  for (auto const& cur_dim_size : dimensions) {
-    coords[i] = (rankId / dim_size_product) % cur_dim_size;
-    dim_size_product *= cur_dim_size;
-    i++;
-  }
-}
-
namespace simgrid {
namespace kernel {
namespace routing {
@@ -41,8 +30,8 @@ void TorusZone::create_links_for_node(ClusterCreationArgs* cluster, int id, int

for (unsigned int j = 0; j < dimensions_.size(); j++) {
-    int current_dimension = dimensions_.at(j); // which dimension are we currently in?
-                                               // we need to iterate over all dimensions and create all links there
+    int current_dimension = dimensions_[j]; // which dimension are we currently in?
+                                            // we need to iterate over all dimensions and create all links there
// The other node the link connects
int neighbor_rank_id = ((static_cast<int>(rank) / dim_product) % current_dimension == current_dimension - 1)
? rank - (current_dimension - 1) * dim_product
@@ -113,29 +102,36 @@ void TorusZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationArgs*
* Dimension based routing routes through each dimension consecutively
* TODO Change to dynamic assignment
*/
-  unsigned int current_node = src->id();
-  unsigned int next_node    = 0;
+
/*
* Arrays that hold the coordinates of the current node andthe target; comparing the values at the i-th position of
* both arrays, we can easily assess whether we need to route into this dimension or not.
*/
-  unsigned int myCoords[dimensions_.size()];
-  rankId_to_coords(src->id(), dimensions_, myCoords);
-  unsigned int targetCoords[dimensions_.size()];
-  rankId_to_coords(dst->id(), dimensions_, targetCoords);
+  const unsigned int dsize = dimensions_.size();
+  unsigned int myCoords[dsize];
+  unsigned int targetCoords[dsize];
+  unsigned int dim_size_product = 1;
+  for (unsigned i = 0; i < dsize; i++) {
+    unsigned cur_dim_size = dimensions_[i];
+    myCoords[i]           = (src->id() / dim_size_product) % cur_dim_size;
+    targetCoords[i]       = (dst->id() / dim_size_product) % cur_dim_size;
+    dim_size_product *= cur_dim_size;
+  }
+
/*
* linkOffset describes the offset where the link we want to use is stored(+1 is added because each node has a link
* from itself to itself, which can only be the case if src->m_id == dst->m_id -- see above for this special case)
*/
-  int nodeOffset = (dimensions_.size() + 1) * src->id();
+  int nodeOffset = (dsize + 1) * src->id();

int linkOffset  = nodeOffset;
-  bool use_lnk_up = false; // Is this link of the form "cur -> next" or "next -> cur"?
-  // false means: next -> cur
+  bool use_lnk_up = false; // Is this link of the form "cur -> next" or "next -> cur"? false means: next -> cur
+  unsigned int current_node = src->id();
while (current_node != dst->id()) {
+    unsigned int next_node   = 0;
unsigned int dim_product = 1; // First, we will route in x-dimension
-    int j=0;
-    for (auto const& cur_dim : dimensions_) {
+    for (unsigned j = 0; j < dsize; j++) {
+      const unsigned cur_dim = dimensions_[j];
// current_node/dim_product = position in current dimension
if ((current_node / dim_product) % cur_dim != (dst->id() / dim_product) % cur_dim) {

@@ -172,7 +168,6 @@ void TorusZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationArgs*
break;
}

-      j++;
dim_product *= cur_dim;
}

@@ -184,18 +179,13 @@ void TorusZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationArgs*
}

+    resource::LinkImpl* lnk = use_lnk_up ? info.first : info.second;
+
+    if (lat)
+      *lat += lnk->get_latency();

-    if (use_lnk_up == false) {