Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
mv NetworkAction::rate_ to Action::user_bound_
[simgrid.git] / src / surf / ptask_L07.cpp
index d8757a0..c55755f 100644 (file)
@@ -187,9 +187,16 @@ L07Action::L07Action(kernel::resource::Model* model, const std::vector<s4u::Host
 
   /* Expand it for the CPUs even if there is nothing to compute, to make sure that it gets expended even if there is no
    * communication either */
-  for (size_t i = 0; i < host_list.size(); i++)
+  double bound = std::numeric_limits<double>::max();
+  for (size_t i = 0; i < host_list.size(); i++) {
     model->get_maxmin_system()->expand(host_list[i]->pimpl_cpu->get_constraint(), get_variable(),
                                        (flops_amount == nullptr ? 0.0 : flops_amount[i]));
+    if (flops_amount && flops_amount[i] > 0)
+      bound = std::min(bound, host_list[i]->pimpl_cpu->get_speed(1.0) * host_list[i]->pimpl_cpu->get_speed_ratio() /
+                                  flops_amount[i]);
+  }
+  if (bound < std::numeric_limits<double>::max())
+    model->get_maxmin_system()->update_variable_bound(get_variable(), bound);
 
   if (bytes_amount != nullptr) {
     for (size_t k = 0; k < host_list.size() * host_list.size(); k++) {
@@ -222,42 +229,25 @@ kernel::resource::Action* NetworkL07Model::communicate(s4u::Host* src, s4u::Host
   return res;
 }
 
-kernel::resource::Cpu* CpuL07Model::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
+kernel::resource::Cpu* CpuL07Model::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate)
 {
-  return new CpuL07(this, host, speed_per_pstate, core);
+  return (new CpuL07(host, speed_per_pstate))->set_model(this);
 }
 
 kernel::resource::LinkImpl* NetworkL07Model::create_link(const std::string& name, const std::vector<double>& bandwidths,
                                                          s4u::Link::SharingPolicy policy)
 {
   xbt_assert(bandwidths.size() == 1, "Non WIFI link must have only 1 bandwidth.");
-  return new LinkL07(this, name, bandwidths[0], policy);
+  return new LinkL07(name, bandwidths[0], policy, get_maxmin_system());
 }
 
 /************
  * Resource *
  ************/
 
-CpuL07::CpuL07(CpuL07Model* model, simgrid::s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
-    : Cpu(model, host, model->get_maxmin_system()->constraint_new(this, speed_per_pstate.front()), speed_per_pstate,
-          core)
-{
-}
-
-CpuL07::~CpuL07()=default;
-
-LinkL07::LinkL07(NetworkL07Model* model, const std::string& name, double bandwidth, s4u::Link::SharingPolicy policy)
-    : LinkImpl(model, name, model->get_maxmin_system()->constraint_new(this, bandwidth))
-{
-  bandwidth_.peak = bandwidth;
-
-  if (policy == s4u::Link::SharingPolicy::FATPIPE)
-    get_constraint()->unshare();
-}
-
 kernel::resource::CpuAction* CpuL07::execution_start(double size)
 {
-  std::vector<s4u::Host*> host_list = {get_host()};
+  std::vector<s4u::Host*> host_list = {get_iface()};
 
   auto* flops_amount = new double[host_list.size()]();
   flops_amount[0] = size;
@@ -299,6 +289,17 @@ void CpuL07::on_speed_change()
   Cpu::on_speed_change();
 }
 
+LinkL07::LinkL07(const std::string& name, double bandwidth, s4u::Link::SharingPolicy policy,
+                 kernel::lmm::System* system)
+    : LinkImpl(name)
+{
+  this->set_constraint(system->constraint_new(this, bandwidth));
+  bandwidth_.peak = bandwidth;
+
+  if (policy == s4u::Link::SharingPolicy::FATPIPE)
+    get_constraint()->unshare();
+}
+
 bool LinkL07::is_used() const
 {
   return get_model()->get_maxmin_system()->constraint_used(get_constraint());
@@ -315,11 +316,11 @@ void CpuL07::apply_event(kernel::profile::Event* triggered, double value)
   } else if (triggered == state_event_) {
     if (value > 0) {
       if (not is_on()) {
-        XBT_VERB("Restart actors on host %s", get_host()->get_cname());
-        get_host()->turn_on();
+        XBT_VERB("Restart actors on host %s", get_iface()->get_cname());
+        get_iface()->turn_on();
       }
     } else
-      get_host()->turn_off();
+      get_iface()->turn_off();
     tmgr_trace_event_unref(&state_event_);
 
   } else {
@@ -415,5 +416,5 @@ void L07Action::updateBound()
   }
 }
 
-}
-}
+} // namespace surf
+} // namespace simgrid