}
}
-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)
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]);
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;
}
}
}
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;
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 {
* 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;
}
}
}