X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bc08348d5094ea3a908be4ab825efb1cc98dc332..b2f3150048cd87c9e16e251fea65c40221fd56ea:/src/kernel/routing/AsClusterFatTree.cpp diff --git a/src/kernel/routing/AsClusterFatTree.cpp b/src/kernel/routing/AsClusterFatTree.cpp index be82801aad..169497d99b 100644 --- a/src/kernel/routing/AsClusterFatTree.cpp +++ b/src/kernel/routing/AsClusterFatTree.cpp @@ -57,67 +57,52 @@ bool AsClusterFatTree::isInSubTree(FatTreeNode *root, FatTreeNode *node) { return true; } -void AsClusterFatTree::getRouteAndLatency(NetCard *src, - NetCard *dst, - sg_platf_route_cbarg_t into, - double *latency) { - FatTreeNode *source, *destination, *currentNode; +void AsClusterFatTree::getLocalRoute(NetCard* src, NetCard* dst, sg_platf_route_cbarg_t into, double* latency) +{ - std::map::const_iterator tempIter; - if (dst->isRouter() || src->isRouter()) return; /* Let's find the source and the destination in our internal structure */ - tempIter = this->computeNodes_.find(src->id()); + auto searchedNode = this->computeNodes_.find(src->id()); + xbt_assert(searchedNode != this->computeNodes_.end(), "Could not find the source %s [%d] in the fat tree", + src->name().c_str(), src->id()); + FatTreeNode* source = searchedNode->second; - // xbt_die -> assert - if (tempIter == this->computeNodes_.end()) { - xbt_die("Could not find the source %s [%d] in the fat tree", src->name().c_str(), src->id()); - } - source = tempIter->second; - tempIter = this->computeNodes_.find(dst->id()); - if (tempIter == this->computeNodes_.end()) { - xbt_die("Could not find the destination %s [%d] in the fat tree", dst->name().c_str(), dst->id()); - } - - - destination = tempIter->second; + searchedNode = this->computeNodes_.find(dst->id()); + xbt_assert(searchedNode != this->computeNodes_.end(), "Could not find the destination %s [%d] in the fat tree", + dst->name().c_str(), dst->id()); + FatTreeNode* destination = searchedNode->second; XBT_VERB("Get route and latency from '%s' [%d] to '%s' [%d] in a fat tree", src->name().c_str(), src->id(), dst->name().c_str(), dst->id()); - /* In case destination is the source, and there is a loopback, let's get - through it instead of going up to a switch*/ - if(source->id == destination->id && this->hasLoopback_) { + /* In case destination is the source, and there is a loopback, let's use it instead of going up to a switch */ + if (source->id == destination->id && this->hasLoopback_) { into->link_list->push_back(source->loopback); - if(latency) { + if (latency) *latency += source->loopback->latency(); - } return; } - currentNode = source; + FatTreeNode* currentNode = source; // up part while (!isInSubTree(currentNode, destination)) { - int d, k; // as in d-mod-k - d = destination->position; + int d = destination->position; // as in d-mod-k - for (unsigned int i = 0 ; i < currentNode->level ; i++) { + for (unsigned int i = 0; i < currentNode->level; i++) d /= this->upperLevelNodesNumber_[i]; - } - k = this->upperLevelNodesNumber_[currentNode->level]; + + int k = this->upperLevelNodesNumber_[currentNode->level]; d = d % k; into->link_list->push_back(currentNode->parents[d]->upLink); - if(latency) { + if (latency) *latency += currentNode->parents[d]->upLink->latency(); - } - if (this->hasLimiter_) { + if (this->hasLimiter_) into->link_list->push_back(currentNode->limiterLink); - } currentNode = currentNode->parents[d]->upNode; } @@ -126,18 +111,15 @@ void AsClusterFatTree::getRouteAndLatency(NetCard *src, currentNode->level, currentNode->position); // Down part - while(currentNode != destination) { + while (currentNode != destination) { for(unsigned int i = 0 ; i < currentNode->children.size() ; i++) { - if(i % this->lowerLevelNodesNumber_[currentNode->level - 1] == - destination->label[currentNode->level - 1]) { + if (i % this->lowerLevelNodesNumber_[currentNode->level - 1] == destination->label[currentNode->level - 1]) { into->link_list->push_back(currentNode->children[i]->downLink); - if(latency) { + if (latency) *latency += currentNode->children[i]->downLink->latency(); - } currentNode = currentNode->children[i]->downNode; - if (this->hasLimiter_) { + if (this->hasLimiter_) into->link_list->push_back(currentNode->limiterLink); - } XBT_DEBUG("%d(%u,%u) is accessible through %d(%u,%u)", destination->id, destination->level, destination->position, currentNode->id, currentNode->level, currentNode->position);