X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b7bae6a27325376248620283dafc43915142b254..9fb274493911c49b0e1e9ef4b19c81adea5ff7c8:/src/kernel/routing/DragonflyZone.cpp diff --git a/src/kernel/routing/DragonflyZone.cpp b/src/kernel/routing/DragonflyZone.cpp index 2b76d0b7d1..74241c8d17 100644 --- a/src/kernel/routing/DragonflyZone.cpp +++ b/src/kernel/routing/DragonflyZone.cpp @@ -25,8 +25,8 @@ DragonflyZone::~DragonflyZone() { if (this->routers_ != nullptr) { for (unsigned int i = 0; i < this->numGroups_ * this->numChassisPerGroup_ * this->numBladesPerChassis_; i++) - delete (routers_[i]); - xbt_free(routers_); + delete routers_[i]; + delete[] routers_; } } @@ -47,8 +47,7 @@ void DragonflyZone::parse_specific_arguments(ClusterCreationArgs* cluster) std::vector tmp; boost::split(parameters, cluster->topo_parameters, boost::is_any_of(";")); - // TODO : we have to check for zeros and negative numbers, or it might crash - if (parameters.size() != 4) { + if (parameters.size() != 4 || parameters.empty()) { surf_parse_error( "Dragonfly are defined by the number of groups, chassis per groups, blades per chassis, nodes per blade"); } @@ -135,20 +134,15 @@ DragonflyRouter::DragonflyRouter(int group, int chassis, int blade) : group_(gro DragonflyRouter::~DragonflyRouter() { - if (this->myNodes_ != nullptr) - xbt_free(myNodes_); - if (this->greenLinks_ != nullptr) - xbt_free(greenLinks_); - if (this->blackLinks_ != nullptr) - xbt_free(blackLinks_); - if (this->blueLinks_ != nullptr) - xbt_free(blueLinks_); + delete[] myNodes_; + delete[] greenLinks_; + delete[] blackLinks_; + delete blueLinks_; } void DragonflyZone::generateRouters() { - this->routers_ = static_cast(xbt_malloc0(this->numGroups_ * this->numChassisPerGroup_ * - this->numBladesPerChassis_ * sizeof(DragonflyRouter*))); + this->routers_ = new DragonflyRouter*[this->numGroups_ * this->numChassisPerGroup_ * this->numBladesPerChassis_]; for (unsigned int i = 0; i < this->numGroups_; i++) { for (unsigned int j = 0; j < this->numChassisPerGroup_; j++) { @@ -161,7 +155,7 @@ void DragonflyZone::generateRouters() } } -void DragonflyZone::createLink(std::string id, int numlinks, surf::LinkImpl** linkup, surf::LinkImpl** linkdown) +void DragonflyZone::createLink(const std::string& id, int numlinks, surf::LinkImpl** linkup, surf::LinkImpl** linkdown) { *linkup = nullptr; *linkdown = nullptr; @@ -202,12 +196,9 @@ void DragonflyZone::generateLinks() // Links from routers to their local nodes. for (unsigned int i = 0; i < numRouters; i++) { // allocate structures - this->routers_[i]->myNodes_ = static_cast( - xbt_malloc0(numLinksperLink_ * this->numNodesPerBlade_ * sizeof(surf::LinkImpl*))); - this->routers_[i]->greenLinks_ = - static_cast(xbt_malloc0(this->numBladesPerChassis_ * sizeof(surf::LinkImpl*))); - this->routers_[i]->blackLinks_ = - static_cast(xbt_malloc0(this->numChassisPerGroup_ * sizeof(surf::LinkImpl*))); + this->routers_[i]->myNodes_ = new surf::LinkImpl*[numLinksperLink_ * this->numNodesPerBlade_]; + this->routers_[i]->greenLinks_ = new surf::LinkImpl*[this->numBladesPerChassis_]; + this->routers_[i]->blackLinks_ = new surf::LinkImpl*[this->numChassisPerGroup_]; for (unsigned int j = 0; j < numLinksperLink_ * this->numNodesPerBlade_; j += numLinksperLink_) { std::string id = "local_link_from_router_"+ std::to_string(i) + "_to_node_" + @@ -265,8 +256,8 @@ void DragonflyZone::generateLinks() for (unsigned int j = i + 1; j < this->numGroups_; j++) { unsigned int routernumi = i * numBladesPerChassis_ * numChassisPerGroup_ + j; unsigned int routernumj = j * numBladesPerChassis_ * numChassisPerGroup_ + i; - this->routers_[routernumi]->blueLinks_ = static_cast(xbt_malloc0(sizeof(surf::LinkImpl*))); - this->routers_[routernumj]->blueLinks_ = static_cast(xbt_malloc0(sizeof(surf::LinkImpl*))); + this->routers_[routernumi]->blueLinks_ = new surf::LinkImpl*; + this->routers_[routernumj]->blueLinks_ = new surf::LinkImpl*; std::string id = "blue_link_between_group_"+ std::to_string(i) +"_and_" + std::to_string(j) +"_routers_" + std::to_string(routernumi) + "_and_" + std::to_string(routernumj) + "_" + std::to_string(uniqueId); this->createLink(id, this->numLinksBlue_, &linkup, &linkdown); @@ -290,7 +281,7 @@ void DragonflyZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_c dst->id()); if ((src->id() == dst->id()) && hasLoopback_) { - std::pair info = privateLinks_.at(src->id() * linkCountPerNode_); + std::pair info = privateLinks_.at(nodePosition(src->id())); route->link_list->push_back(info.first); if (latency) @@ -318,7 +309,7 @@ void DragonflyZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_c *latency += myRouter->myNodes_[myCoords[3] * numLinksperLink_]->latency(); if (hasLimiter_) { // limiter for sender - std::pair info = privateLinks_.at(src->id() * linkCountPerNode_ + hasLoopback_); + std::pair info = privateLinks_.at(nodePositionWithLoopback(src->id())); route->link_list->push_back(info.first); } @@ -364,13 +355,11 @@ void DragonflyZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_c route->link_list->push_back(currentRouter->blackLinks_[targetCoords[1]]); if (latency) *latency += currentRouter->blackLinks_[targetCoords[1]]->latency(); - currentRouter = routers_[targetCoords[0] * (numChassisPerGroup_ * numBladesPerChassis_) + - targetCoords[1] * numBladesPerChassis_ + targetCoords[2]]; } } if (hasLimiter_) { // limiter for receiver - std::pair info = privateLinks_.at(dst->id() * linkCountPerNode_ + hasLoopback_); + std::pair info = privateLinks_.at(nodePositionWithLoopback(dst->id())); route->link_list->push_back(info.first); }