Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Tue, 25 Jul 2017 10:36:35 +0000 (12:36 +0200)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Tue, 25 Jul 2017 10:36:35 +0000 (12:36 +0200)
examples/s4u/app-token-ring/s4u_app-token-ring.cpp
src/kernel/routing/DragonflyZone.cpp
src/kernel/routing/FatTreeZone.cpp
src/kernel/routing/FatTreeZone.hpp
src/surf/network_ib.cpp
src/surf/network_ib.hpp

index 05fa909..ead05bf 100644 (file)
@@ -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 */
index 827aa98..a89ff4b 100644 (file)
@@ -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;
 }
 
index a364180..9031a4f 100644 (file)
@@ -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;
 }
index 8050329..40b439a 100644 (file)
@@ -119,7 +119,7 @@ public:
 
 private:
   // description of a PGFT (TODO : better doc)
-  unsigned int levels_ = 0;
+  unsigned long levels_ = 0;
   std::vector<unsigned int> lowerLevelNodesNumber_; // number of children by node
   std::vector<unsigned int> upperLevelNodesNumber_; // number of parents by node
   std::vector<unsigned int> lowerLevelPortsNumber_; // ports between each level l and l-1
index e3f1898..eea85e8 100644 (file)
@@ -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<std::string> 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<ActiveComm*>::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<ActiveComm*>::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<std::string> 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<double>(root->ActiveCommsUp.size());
+  double max_penalty_out = 0.0;
+  // first, compute all outbound penalties to get their max
+  for (std::vector<ActiveComm*>::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<ActiveComm*>::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<ActiveComm*>::iterator it= root->ActiveCommsUp.begin(); it != root->ActiveCommsUp.end(); ++it) {
-          if(updatedlist[(*it)->destination->id]!=1)
-            updateIBfactors_rec((*it)->destination, updatedlist);
-        }
-        for (std::map<IBNode*, int>::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<ActiveComm*>::iterator it = root->ActiveCommsUp.begin(); it != root->ActiveCommsUp.end(); ++it) {
+      if (updatedlist[(*it)->destination->id] != 1)
+        updateIBfactors_rec((*it)->destination, updatedlist);
+    }
+    for (std::map<IBNode*, int>::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<ActiveComm*>::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<ActiveComm*>::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);
+}
+}
 }
index f132f83..ceab7b9 100644 (file)
@@ -10,7 +10,7 @@
 #include "src/surf/network_smpi.hpp"
 #include "xbt/base.h"
 
-#include <map>
+#include <unordered_map>
 
 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<NetworkAction *, std::pair<IBNode*,IBNode*> > active_comms;
+      std::unordered_map<std::string, IBNode*> active_nodes;
+      std::unordered_map<NetworkAction*, std::pair<IBNode*, IBNode*>> active_comms;
 
       double Bs;
       double Be;