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 {
if (!xbt_dynar_is_empty(dimensions)) {
/* We are in a torus cluster
- * Parse attribute dimensions="dim1,dim2,dim3,...,dimN"
- * and safe it in a dynarray.
+ * Parse attribute dimensions="dim1,dim2,dim3,...,dimN" and safe it in a vector.
* Additionally, we need to know how many ranks we have in total
*/
xbt_dynar_foreach (dimensions, iter, groups) {
- int tmp = surf_parse_get_int(xbt_dynar_get_as(dimensions, iter, char*));
- dimensions_.push_back(tmp);
+ dimensions_.push_back(surf_parse_get_int(groups));
}
linkCountPerNode_ = dimensions_.size();
* 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
current_node = next_node;
next_node = 0;
}
- delete[] myCoords;
- delete[] targetCoords;
}
}
}