Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
continue to fluentify Cpu creation. Fix FG37 on the way
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Mon, 8 Mar 2021 16:08:13 +0000 (17:08 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Mon, 8 Mar 2021 16:08:22 +0000 (17:08 +0100)
ChangeLog
src/kernel/routing/NetZoneImpl.cpp
src/plugins/vm/s4u_VirtualMachine.cpp
src/surf/cpu_cas01.cpp
src/surf/cpu_cas01.hpp
src/surf/cpu_interface.cpp
src/surf/cpu_interface.hpp
src/surf/cpu_ti.cpp
src/surf/cpu_ti.hpp
src/surf/ptask_L07.cpp
src/surf/ptask_L07.hpp

index 782c65f..3e1a6ae 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -29,6 +29,10 @@ Documentation:
  - New section: Configuring the logs from the command line.
  - New section: Programming API of logs.
 
+Fixed bugs (FG#.. -> FramaGit bugs; FG!.. -> FG merge requests)
+ (FG: issues on Framagit; GF: issues on GForge; GH: issues on GitHub)
+- FG#37: Parallel tasks are limited to 1 core per host
+
 ----------------------------------------------------------------------------
 
 SimGrid (3.26) December 15. 2020
index deddfa2..9c6f3c0 100644 (file)
@@ -82,7 +82,7 @@ s4u::Host* NetZoneImpl::create_host(const std::string& name, const std::vector<d
   auto* res = new s4u::Host(name);
   res->set_netpoint(new NetPoint(name, NetPoint::Type::Host, this));
 
-  surf_cpu_model_pm->create_cpu(res, speed_per_pstate, core_amount);
+  surf_cpu_model_pm->create_cpu(res, speed_per_pstate)->set_core_count(core_amount)->seal();
 
   return res;
 }
index 8ddf31b..c8046e0 100644 (file)
@@ -41,7 +41,7 @@ VirtualMachine::VirtualMachine(const std::string& name, s4u::Host* physical_host
   for (int i = 0; i < physical_host->get_pstate_count(); i++)
     speeds.push_back(physical_host->get_pstate_speed(i));
 
-  surf_cpu_model_vm->create_cpu(this, speeds, core_amount);
+  surf_cpu_model_vm->create_cpu(this, speeds)->set_core_count(core_amount)->seal();
   if (physical_host->get_pstate() != 0)
     set_pstate(physical_host->get_pstate());
 
index a514807..ee3430c 100644 (file)
@@ -78,23 +78,14 @@ CpuCas01Model::~CpuCas01Model()
   surf_cpu_model_pm = nullptr;
 }
 
-Cpu* CpuCas01Model::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
+Cpu* CpuCas01Model::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate)
 {
-  return new CpuCas01(this, host, speed_per_pstate, core);
+  return (new CpuCas01(host, speed_per_pstate))->set_model(this);
 }
 
 /************
  * Resource *
  ************/
-CpuCas01::CpuCas01(CpuCas01Model* model, s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
-    : Cpu(host, speed_per_pstate)
-{
-  this->set_core_count(core)->set_model(model)->set_constraint(
-      model->get_maxmin_system()->constraint_new(this, core * speed_per_pstate.front()));
-}
-
-CpuCas01::~CpuCas01() = default;
-
 bool CpuCas01::is_used() const
 {
   return get_model()->get_maxmin_system()->constraint_used(get_constraint());
index 88d382b..d1c912c 100644 (file)
@@ -32,7 +32,7 @@ public:
   CpuCas01Model& operator=(const CpuCas01Model&) = delete;
   ~CpuCas01Model() override;
 
-  Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core) override;
+  Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate) override;
 };
 
 /************
@@ -41,10 +41,10 @@ public:
 
 class CpuCas01 : public Cpu {
 public:
-  CpuCas01(CpuCas01Model* model, s4u::Host* host, const std::vector<double>& speed_per_pstate, int core);
+  CpuCas01(s4u::Host* host, const std::vector<double>& speed_per_pstate) : Cpu(host, speed_per_pstate) {}
+  ~CpuCas01()               = default;
   CpuCas01(const CpuCas01&) = delete;
   CpuCas01& operator=(const CpuCas01&) = delete;
-  ~CpuCas01() override;
   void apply_event(profile::Event* event, double value) override;
   CpuAction* execution_start(double size) override;
   CpuAction* execution_start(double size, int requested_cores) override;
index a15bc1f..eafa003 100644 (file)
@@ -4,6 +4,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "cpu_interface.hpp"
+#include "cpu_ti.hpp"
 #include "src/kernel/resource/profile/Profile.hpp"
 #include "src/surf/surf_interface.hpp"
 #include "surf/surf.hpp"
@@ -98,6 +99,9 @@ Cpu* Cpu::set_core_count(int core_count)
 {
   xbt_assert(not is_sealed(), "Core count cannot be changed once CPU has been sealed");
   xbt_assert(core_count > 0, "Host %s must have at least one core, not 0.", piface_->get_cname());
+  if (dynamic_cast<CpuTiModel*>(get_model()) != nullptr)
+    xbt_assert(core_count == 1, "Multi-core not handled by this model yet");
+
   core_count_ = core_count;
   return this;
 }
@@ -116,6 +120,9 @@ void Cpu::set_speed_profile(kernel::profile::Profile* profile)
 
 void Cpu::seal()
 {
+  lmm::System* lmm = get_model()->get_maxmin_system();
+  if (dynamic_cast<CpuTiModel*>(get_model()) == nullptr)
+    this->set_constraint(lmm->constraint_new(this, core_count_ * speed_per_pstate_.front()));
   Resource::seal();
 }
 
index 0f3d94f..f96a75d 100644 (file)
@@ -38,7 +38,7 @@ public:
    *                         This ignores any potential external load coming from a trace.
    * @param core The number of core of this Cpu
    */
-  virtual Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core) = 0;
+  virtual Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate) = 0;
 
   void update_actions_state_lazy(double now, double delta) override;
   void update_actions_state_full(double now, double delta) override;
index 91cf686..89cc142 100644 (file)
@@ -284,9 +284,9 @@ CpuTiModel::~CpuTiModel()
   surf_cpu_model_pm = nullptr;
 }
 
-Cpu* CpuTiModel::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
+Cpu* CpuTiModel::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate)
 {
-  return new CpuTi(this, host, speed_per_pstate, core);
+  return (new CpuTi(host, speed_per_pstate))->set_model(this);
 }
 
 double CpuTiModel::next_occurring_event(double now)
@@ -323,12 +323,8 @@ void CpuTiModel::update_actions_state(double now, double /*delta*/)
 /************
  * Resource *
  ************/
-CpuTi::CpuTi(CpuTiModel* model, s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
-    : Cpu(host, speed_per_pstate)
+CpuTi::CpuTi(s4u::Host* host, const std::vector<double>& speed_per_pstate) : Cpu(host, speed_per_pstate)
 {
-  xbt_assert(core == 1, "Multi-core not handled by this model yet");
-  this->set_model(model);
-
   speed_.peak = speed_per_pstate.front();
   XBT_DEBUG("CPU create: peak=%f", speed_.peak);
 
index 0961510..81b5618 100644 (file)
@@ -100,7 +100,7 @@ using ActionTiList = boost::intrusive::list<CpuTiAction, ActionTiListOptions>;
  ************/
 class CpuTi : public Cpu {
 public:
-  CpuTi(CpuTiModel* model, s4u::Host* host, const std::vector<double>& speed_per_pstate, int core);
+  CpuTi(s4u::Host* host, const std::vector<double>& speed_per_pstate);
   CpuTi(const CpuTi&)            = delete;
   CpuTi& operator&(const CpuTi&) = delete;
   ~CpuTi() override;
@@ -146,7 +146,7 @@ public:
   CpuTiModel(const CpuTiModel&) = delete;
   CpuTiModel& operator=(const CpuTiModel&) = delete;
   ~CpuTiModel() override;
-  Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core) override;
+  Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate) override;
   double next_occurring_event(double now) override;
   void update_actions_state(double now, double delta) override;
 
index de2019e..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,9 +229,9 @@ 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,
@@ -238,15 +245,6 @@ kernel::resource::LinkImpl* NetworkL07Model::create_link(const std::string& name
  * Resource *
  ************/
 
-CpuL07::CpuL07(CpuL07Model* model, simgrid::s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
-    : Cpu(host, speed_per_pstate)
-{
-  this->set_core_count(core)->set_model(model)->set_constraint(
-      model->get_maxmin_system()->constraint_new(this, speed_per_pstate.front()));
-}
-
-CpuL07::~CpuL07()=default;
-
 kernel::resource::CpuAction* CpuL07::execution_start(double size)
 {
   std::vector<s4u::Host*> host_list = {get_iface()};
index 2763e4c..8d4aac4 100644 (file)
@@ -53,7 +53,7 @@ public:
   CpuL07Model& operator=(const CpuL07Model&) = delete;
   ~CpuL07Model() override;
 
-  kernel::resource::Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core) override;
+  kernel::resource::Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate) override;
   HostL07Model *hostModel_;
 };
 
@@ -77,10 +77,11 @@ public:
 
 class CpuL07 : public kernel::resource::Cpu {
 public:
-  CpuL07(CpuL07Model* model, s4u::Host* host, const std::vector<double>& speed_per_pstate, int core);
+  CpuL07(s4u::Host* host, const std::vector<double>& speed_per_pstate) : Cpu(host, speed_per_pstate){};
+  ~CpuL07()             = default;
   CpuL07(const CpuL07&) = delete;
   CpuL07& operator=(const CpuL07&) = delete;
-  ~CpuL07() override;
+
   bool is_used() const override;
   void apply_event(kernel::profile::Event* event, double value) override;
   kernel::resource::CpuAction* execution_start(double size) override;