From: Frederic Suter Date: Tue, 25 Jul 2017 08:36:32 +0000 (+0200) Subject: Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid X-Git-Tag: v3_17~322 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/e05a1337ff6756490bf19378bcaf875b002b9b82?hp=7cb9b465d2d93d035190c9afd0916cf5d8b0d0bb Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid --- diff --git a/examples/s4u/app-token-ring/s4u_app-token-ring.cpp b/examples/s4u/app-token-ring/s4u_app-token-ring.cpp index 05fa90995a..ead05bfbef 100644 --- a/examples/s4u/app-token-ring/s4u_app-token-ring.cpp +++ b/examples/s4u/app-token-ring/s4u_app-token-ring.cpp @@ -23,8 +23,12 @@ public: void operator()() { - rank = xbt_str_parse_int(simgrid::s4u::this_actor::getName().c_str(), - "Any process of this example must have a numerical name, not %s"); + try { + rank = std::stoi(simgrid::s4u::this_actor::getName()); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Processes of this example must have a numerical name, not ") + + ia.what()); + } my_mailbox = simgrid::s4u::Mailbox::byName(std::to_string(rank)); if (rank + 1 == simgrid::s4u::Engine::getInstance()->getHostCount()) /* The last process, which sends the token back to rank 0 */ diff --git a/src/kernel/routing/DragonflyZone.cpp b/src/kernel/routing/DragonflyZone.cpp index 827aa982e7..a89ff4b87f 100644 --- a/src/kernel/routing/DragonflyZone.cpp +++ b/src/kernel/routing/DragonflyZone.cpp @@ -59,17 +59,34 @@ void DragonflyZone::parse_specific_arguments(sg_platf_cluster_cbarg_t cluster) surf_parse_error("Dragonfly topologies are defined by 3 levels with 2 elements each, and one with one element"); } - this->numGroups_ = xbt_str_parse_int(tmp[0].c_str(), "Invalid number of groups: %s"); - this->numLinksBlue_ = xbt_str_parse_int(tmp[1].c_str(), "Invalid number of links for the blue level: %s"); + try { + this->numGroups_ = std::stoi(tmp[0]); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Invalid number of groups:") + tmp[0]); + } + try { + this->numLinksBlue_ = std::stoi(tmp[1]); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Invalid number of links for the blue level:") + tmp[1]); + } // Black network : number of chassis/group, number of links between each router on the black network boost::split(tmp, parameters[1], boost::is_any_of(",")); if (tmp.size() != 2) { surf_parse_error("Dragonfly topologies are defined by 3 levels with 2 elements each, and one with one element"); } - this->numChassisPerGroup_ = xbt_str_parse_int(tmp[0].c_str(), "Invalid number of groups: %s"); - this->numLinksBlack_ = xbt_str_parse_int(tmp[1].c_str(), "Invalid number of links for the black level: %s"); + try { + this->numChassisPerGroup_ = std::stoi(tmp[0]); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Invalid number of groups:") + tmp[0]); + } + + try { + this->numLinksBlack_ = std::stoi(tmp[1]); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Invalid number of links for the black level:") + tmp[1]); + } // Green network : number of blades/chassis, number of links between each router on the green network boost::split(tmp, parameters[2], boost::is_any_of(",")); @@ -77,12 +94,25 @@ void DragonflyZone::parse_specific_arguments(sg_platf_cluster_cbarg_t cluster) surf_parse_error("Dragonfly topologies are defined by 3 levels with 2 elements each, and one with one element"); } - this->numBladesPerChassis_ = xbt_str_parse_int(tmp[0].c_str(), "Invalid number of groups: %s"); - this->numLinksGreen_ = xbt_str_parse_int(tmp[1].c_str(), "Invalid number of links for the green level: %s"); + try { + this->numBladesPerChassis_ = std::stoi(tmp[0]); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Invalid number of groups:") + tmp[0]); + } + + try { + this->numLinksGreen_ = std::stoi(tmp[1]); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Invalid number of links for the green level:") + tmp[1]); + } // The last part of topo_parameters should be the number of nodes per blade - this->numNodesPerBlade_ = - xbt_str_parse_int(parameters[3].c_str(), "Last parameter is not the amount of nodes per blade: %s"); + try { + this->numNodesPerBlade_ = std::stoi(parameters[3]); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Last parameter is not the amount of nodes per blade:") + parameters[3]); + } + this->cluster_ = cluster; } diff --git a/src/kernel/routing/FatTreeZone.cpp b/src/kernel/routing/FatTreeZone.cpp index a364180f7a..9031a4f059 100644 --- a/src/kernel/routing/FatTreeZone.cpp +++ b/src/kernel/routing/FatTreeZone.cpp @@ -369,7 +369,11 @@ void FatTreeZone::parse_specific_arguments(sg_platf_cluster_cbarg_t cluster) } // The first parts of topo_parameters should be the levels number - this->levels_ = xbt_str_parse_int(parameters[0].c_str(), "First parameter is not the amount of levels: %s"); + try { + this->levels_ = std::stoi(parameters[0]); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("First parameter is not the amount of levels:") + parameters[0]); + } // Then, a l-sized vector standing for the children number by level boost::split(tmp, parameters[1], boost::is_any_of(",")); @@ -378,7 +382,11 @@ void FatTreeZone::parse_specific_arguments(sg_platf_cluster_cbarg_t cluster) ", see the documentation for more information"); } for (size_t i = 0; i < tmp.size(); i++) { - this->lowerLevelNodesNumber_.push_back(xbt_str_parse_int(tmp[i].c_str(), "Invalid lower level node number: %s")); + try { + this->lowerLevelNodesNumber_.push_back(std::stoi(tmp[i])); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Invalid lower level node number:") + tmp[i]); + } } // Then, a l-sized vector standing for the parents number by level @@ -388,7 +396,11 @@ void FatTreeZone::parse_specific_arguments(sg_platf_cluster_cbarg_t cluster) ", see the documentation for more information"); } for (size_t i = 0; i < tmp.size(); i++) { - this->upperLevelNodesNumber_.push_back(xbt_str_parse_int(tmp[i].c_str(), "Invalid upper level node number: %s")); + try { + this->upperLevelNodesNumber_.push_back(std::stoi(tmp[i])); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Invalid upper level node number:") + tmp[i]); + } } // Finally, a l-sized vector standing for the ports number with the lower level @@ -398,7 +410,11 @@ void FatTreeZone::parse_specific_arguments(sg_platf_cluster_cbarg_t cluster) ", see the documentation for more information"); } for (size_t i = 0; i < tmp.size(); i++) { - this->lowerLevelPortsNumber_.push_back(xbt_str_parse_int(tmp[i].c_str(), "Invalid lower level node number: %s")); + try { + this->lowerLevelPortsNumber_.push_back(std::stoi(tmp[i])); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Invalid lower level port number:") + tmp[i]); + } } this->cluster_ = cluster; } diff --git a/src/kernel/routing/FatTreeZone.hpp b/src/kernel/routing/FatTreeZone.hpp index 805032913a..40b439aa96 100644 --- a/src/kernel/routing/FatTreeZone.hpp +++ b/src/kernel/routing/FatTreeZone.hpp @@ -119,7 +119,7 @@ public: private: // description of a PGFT (TODO : better doc) - unsigned int levels_ = 0; + unsigned long levels_ = 0; std::vector lowerLevelNodesNumber_; // number of children by node std::vector upperLevelNodesNumber_; // number of parents by node std::vector lowerLevelPortsNumber_; // ports between each level l and l-1 diff --git a/src/surf/network_ib.cpp b/src/surf/network_ib.cpp index e3f1898673..eea85e82a4 100644 --- a/src/surf/network_ib.cpp +++ b/src/surf/network_ib.cpp @@ -22,13 +22,11 @@ static void IB_create_host_callback(simgrid::s4u::Host& host){ static int id=0; // pour t->id -> rajouter une nouvelle struct dans le dict, pour stocker les comms actives - if(((NetworkIBModel*)surf_network_model)->active_nodes==nullptr) - ((NetworkIBModel*)surf_network_model)->active_nodes = xbt_dict_new_homogeneous(nullptr); IBNode* act = new IBNode(id); id++; - xbt_dict_set(((NetworkIBModel*)surf_network_model)->active_nodes, host.getCname(), act, nullptr); + ((NetworkIBModel*)surf_network_model)->active_nodes.insert({host.getName(), act}); } static void IB_action_state_changed_callback(simgrid::surf::NetworkAction* action) @@ -51,12 +49,20 @@ static void IB_action_init_callback(simgrid::surf::NetworkAction* action, simgri simgrid::s4u::Host* dst) { simgrid::surf::NetworkIBModel* ibModel = (simgrid::surf::NetworkIBModel*)surf_network_model; + simgrid::surf::IBNode* act_src; + simgrid::surf::IBNode* act_dst; - simgrid::surf::IBNode* act_src = (simgrid::surf::IBNode*)xbt_dict_get_or_null(ibModel->active_nodes, src->getCname()); - xbt_assert(act_src, "could not find src node active comms !"); + try { + act_src = ibModel->active_nodes.at(src->getName()); + } catch (std::out_of_range& unfound) { + throw std::out_of_range(std::string("Could not find '") + src->getName() + "' active comms !"); + } - simgrid::surf::IBNode* act_dst = (simgrid::surf::IBNode*)xbt_dict_get_or_null(ibModel->active_nodes, dst->getCname()); - xbt_assert(act_dst, "could not find dst node active comms !"); + try { + act_dst = ibModel->active_nodes.at(dst->getName()); + } catch (std::out_of_range& unfound) { + throw std::out_of_range(std::string("Could not find '") + dst->getName() + "' active comms !"); + } ibModel->active_comms[action]=std::make_pair(act_src, act_dst); @@ -92,142 +98,145 @@ void surf_network_model_init_IB() } namespace simgrid { - namespace surf { - - NetworkIBModel::NetworkIBModel() - : NetworkSmpiModel() { - haveGap_=false; - active_nodes=nullptr; - - const char* IB_factors_string=xbt_cfg_get_string("smpi/IB-penalty-factors"); - std::vector radical_elements; - boost::split(radical_elements, IB_factors_string, boost::is_any_of(";")); - - surf_parse_assert(radical_elements.size() == 3, "smpi/IB-penalty-factors should be provided and contain 3 " - "elements, semi-colon separated. Example: 0.965;0.925;1.35"); - - Be = xbt_str_parse_double(radical_elements.front().c_str(), - "First part of smpi/IB-penalty-factors is not numerical: %s"); - Bs = xbt_str_parse_double((radical_elements.at(1)).c_str(), - "Second part of smpi/IB-penalty-factors is not numerical: %s"); - ys = xbt_str_parse_double(radical_elements.back().c_str(), - "Third part of smpi/IB-penalty-factors is not numerical: %s"); - } - - NetworkIBModel::~NetworkIBModel() - { - xbt_dict_cursor_t cursor = nullptr; - IBNode* instance = nullptr; - char *name = nullptr; - xbt_dict_foreach(active_nodes, cursor, name, instance) - delete instance; - xbt_dict_free(&active_nodes); - } - - void NetworkIBModel::computeIBfactors(IBNode *root) { - double num_comm_out = (double) root->ActiveCommsUp.size(); - double max_penalty_out=0.0; - //first, compute all outbound penalties to get their max - for (std::vector::iterator it= root->ActiveCommsUp.begin(); it != root->ActiveCommsUp.end(); ++it) { - double my_penalty_out = 1.0; - - if(num_comm_out!=1){ - if((*it)->destination->nbActiveCommsDown > 2)//number of comms sent to the receiving node - my_penalty_out = num_comm_out * Bs * ys; - else - my_penalty_out = num_comm_out * Bs; - } - - max_penalty_out = std::max(max_penalty_out,my_penalty_out); - } +namespace surf { - for (std::vector::iterator it= root->ActiveCommsUp.begin(); it != root->ActiveCommsUp.end(); ++it) { +NetworkIBModel::NetworkIBModel() : NetworkSmpiModel() +{ + haveGap_ = false; + const char* IB_factors_string = xbt_cfg_get_string("smpi/IB-penalty-factors"); + std::vector radical_elements; + boost::split(radical_elements, IB_factors_string, boost::is_any_of(";")); + + surf_parse_assert(radical_elements.size() == 3, "smpi/IB-penalty-factors should be provided and contain 3 " + "elements, semi-colon separated. Example: 0.965;0.925;1.35"); + + try { + Be = std::stod(radical_elements.front()); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("First part of smpi/IB-penalty-factors is not numerical:") + ia.what()); + } - //compute inbound penalty - double my_penalty_in = 1.0; - int nb_comms = (*it)->destination->nbActiveCommsDown;//total number of incoming comms - if(nb_comms!=1) - my_penalty_in = ((*it)->destination->ActiveCommsDown)[root] //number of comm sent to dest by root node - * Be - * (*it)->destination->ActiveCommsDown.size();//number of different nodes sending to dest + try { + Bs = std::stod(radical_elements.at(1)); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Second part of smpi/IB-penalty-factors is not numerical:") + ia.what()); + } - double penalty = std::max(my_penalty_in,max_penalty_out); + try { + ys = std::stod(radical_elements.back()); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Third part of smpi/IB-penalty-factors is not numerical:") + ia.what()); + } +} - double rate_before_update = (*it)->action->getBound(); - //save initial rate of the action - if((*it)->init_rate==-1) - (*it)->init_rate= rate_before_update; +NetworkIBModel::~NetworkIBModel() +{ + for (auto instance : active_nodes) + delete instance.second; +} - double penalized_bw = num_comm_out ? (*it)->init_rate / penalty : (*it)->init_rate; +void NetworkIBModel::computeIBfactors(IBNode* root) +{ + double num_comm_out = static_cast(root->ActiveCommsUp.size()); + double max_penalty_out = 0.0; + // first, compute all outbound penalties to get their max + for (std::vector::iterator it = root->ActiveCommsUp.begin(); it != root->ActiveCommsUp.end(); ++it) { + double my_penalty_out = 1.0; + + if (num_comm_out != 1) { + if ((*it)->destination->nbActiveCommsDown > 2) // number of comms sent to the receiving node + my_penalty_out = num_comm_out * Bs * ys; + else + my_penalty_out = num_comm_out * Bs; + } - if (not double_equals(penalized_bw, rate_before_update, sg_surf_precision)) { - XBT_DEBUG("%d->%d action %p penalty updated : bw now %f, before %f , initial rate %f", root->id,(*it)->destination->id,(*it)->action,penalized_bw, (*it)->action->getBound(), (*it)->init_rate ); - lmm_update_variable_bound(maxminSystem_, (*it)->action->getVariable(), penalized_bw); - }else{ - XBT_DEBUG("%d->%d action %p penalty not updated : bw %f, initial rate %f", root->id,(*it)->destination->id,(*it)->action,penalized_bw, (*it)->init_rate ); - } + max_penalty_out = std::max(max_penalty_out, my_penalty_out); + } - } - XBT_DEBUG("Finished computing IB penalties"); + for (std::vector::iterator it = root->ActiveCommsUp.begin(); it != root->ActiveCommsUp.end(); ++it) { + // compute inbound penalty + double my_penalty_in = 1.0; + int nb_comms = (*it)->destination->nbActiveCommsDown; // total number of incoming comms + if (nb_comms != 1) + my_penalty_in = ((*it)->destination->ActiveCommsDown)[root] // number of comm sent to dest by root node + * Be * (*it)->destination->ActiveCommsDown.size(); // number of different nodes sending to dest + + double penalty = std::max(my_penalty_in, max_penalty_out); + + double rate_before_update = (*it)->action->getBound(); + // save initial rate of the action + if ((*it)->init_rate == -1) + (*it)->init_rate = rate_before_update; + + double penalized_bw = num_comm_out ? (*it)->init_rate / penalty : (*it)->init_rate; + + if (not double_equals(penalized_bw, rate_before_update, sg_surf_precision)) { + XBT_DEBUG("%d->%d action %p penalty updated : bw now %f, before %f , initial rate %f", root->id, + (*it)->destination->id, (*it)->action, penalized_bw, (*it)->action->getBound(), (*it)->init_rate); + lmm_update_variable_bound(maxminSystem_, (*it)->action->getVariable(), penalized_bw); + } else { + XBT_DEBUG("%d->%d action %p penalty not updated : bw %f, initial rate %f", root->id, (*it)->destination->id, + (*it)->action, penalized_bw, (*it)->init_rate); } + } + XBT_DEBUG("Finished computing IB penalties"); +} - void NetworkIBModel::updateIBfactors_rec(IBNode *root, bool* updatedlist) { - if(updatedlist[root->id]==0){ - XBT_DEBUG("IB - Updating rec %d", root->id); - computeIBfactors(root); - updatedlist[root->id]=1; - for (std::vector::iterator it= root->ActiveCommsUp.begin(); it != root->ActiveCommsUp.end(); ++it) { - if(updatedlist[(*it)->destination->id]!=1) - updateIBfactors_rec((*it)->destination, updatedlist); - } - for (std::map::iterator it= root->ActiveCommsDown.begin(); it != root->ActiveCommsDown.end(); ++it) { - if(updatedlist[it->first->id]!=1) - updateIBfactors_rec(it->first, updatedlist); - } - } +void NetworkIBModel::updateIBfactors_rec(IBNode* root, bool* updatedlist) +{ + if (updatedlist[root->id] == 0) { + XBT_DEBUG("IB - Updating rec %d", root->id); + computeIBfactors(root); + updatedlist[root->id] = 1; + for (std::vector::iterator it = root->ActiveCommsUp.begin(); it != root->ActiveCommsUp.end(); ++it) { + if (updatedlist[(*it)->destination->id] != 1) + updateIBfactors_rec((*it)->destination, updatedlist); + } + for (std::map::iterator it = root->ActiveCommsDown.begin(); it != root->ActiveCommsDown.end(); ++it) { + if (updatedlist[it->first->id] != 1) + updateIBfactors_rec(it->first, updatedlist); } + } +} +void NetworkIBModel::updateIBfactors(NetworkAction* action, IBNode* from, IBNode* to, int remove) +{ + if (from == to) // disregard local comms (should use loopback) + return; - void NetworkIBModel::updateIBfactors(NetworkAction *action, IBNode *from, IBNode * to, int remove) { - if (from == to)//disregard local comms (should use loopback) - return; - - bool* updated=(bool*)xbt_malloc0(xbt_dict_size(active_nodes)*sizeof(bool)); - ActiveComm* comm=nullptr; - if(remove){ - if(to->ActiveCommsDown[from]==1) - to->ActiveCommsDown.erase(from); - else - to->ActiveCommsDown[from]-=1; - - to->nbActiveCommsDown--; - for (std::vector::iterator it= from->ActiveCommsUp.begin(); - it != from->ActiveCommsUp.end(); ++it) { - if((*it)->action==action){ - comm=(*it); - from->ActiveCommsUp.erase(it); - break; - } - } - action->unref(); - - }else{ - action->ref(); - ActiveComm* comm=new ActiveComm(); - comm->action=action; - comm->destination=to; - from->ActiveCommsUp.push_back(comm); - - to->ActiveCommsDown[from]+=1; - to->nbActiveCommsDown++; + bool* updated = (bool*)xbt_malloc0(active_nodes.size() * sizeof(bool)); + ActiveComm* comm = nullptr; + if (remove) { + if (to->ActiveCommsDown[from] == 1) + to->ActiveCommsDown.erase(from); + else + to->ActiveCommsDown[from] -= 1; + + to->nbActiveCommsDown--; + for (std::vector::iterator it = from->ActiveCommsUp.begin(); it != from->ActiveCommsUp.end(); ++it) { + if ((*it)->action == action) { + comm = (*it); + from->ActiveCommsUp.erase(it); + break; } - XBT_DEBUG("IB - Updating %d", from->id); - updateIBfactors_rec(from, updated); - XBT_DEBUG("IB - Finished updating %d", from->id); - if(comm) - delete comm; - xbt_free(updated); } - + action->unref(); + } else { + action->ref(); + ActiveComm* comm = new ActiveComm(); + comm->action = action; + comm->destination = to; + from->ActiveCommsUp.push_back(comm); + + to->ActiveCommsDown[from] += 1; + to->nbActiveCommsDown++; } + XBT_DEBUG("IB - Updating %d", from->id); + updateIBfactors_rec(from, updated); + XBT_DEBUG("IB - Finished updating %d", from->id); + if (comm) + delete comm; + xbt_free(updated); +} +} } diff --git a/src/surf/network_ib.hpp b/src/surf/network_ib.hpp index f132f83f84..ceab7b9d08 100644 --- a/src/surf/network_ib.hpp +++ b/src/surf/network_ib.hpp @@ -10,7 +10,7 @@ #include "src/surf/network_smpi.hpp" #include "xbt/base.h" -#include +#include namespace simgrid { namespace surf { @@ -50,8 +50,8 @@ namespace simgrid { ~NetworkIBModel() override; void updateIBfactors(NetworkAction *action, IBNode *from, IBNode * to, int remove); - xbt_dict_t active_nodes; - std::map > active_comms; + std::unordered_map active_nodes; + std::unordered_map> active_comms; double Bs; double Be;