Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Modify iteration over models in surf_solve
authorBruno Donassolo <bruno.donassolo@inria.fr>
Mon, 1 Mar 2021 19:42:46 +0000 (20:42 +0100)
committerBruno Donassolo <bruno.donassolo@inria.fr>
Tue, 9 Mar 2021 14:17:12 +0000 (15:17 +0100)
Added a map with the different models initialized to iterate in
surf_solve function.

Extra: clang-format

12 files changed:
include/simgrid/kernel/resource/Model.hpp
src/plugins/vm/VirtualMachineImpl.cpp
src/surf/cpu_cas01.cpp
src/surf/cpu_ti.cpp
src/surf/disk_s19.cpp
src/surf/host_clm03.cpp
src/surf/network_cm02.cpp
src/surf/network_constant.cpp
src/surf/network_ns3.cpp
src/surf/ptask_L07.cpp
src/surf/surf_c_bindings.cpp
src/surf/surf_interface.cpp

index 39a7cc6..48e1175 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <memory>
 #include <simgrid/kernel/resource/Action.hpp>
+#include <unordered_map>
 
 namespace simgrid {
 namespace kernel {
@@ -19,6 +20,15 @@ namespace resource {
  */
 class XBT_PUBLIC Model {
 public:
+  /** @brief Possible model types */
+  enum class Type {
+    HOST,    /**< Host models: see surf_host_model_description for more details */
+    NETWORK, /**< Network models: see surf_network_model_description for more details */
+    CPU,     /**< CPU models: see surf_cpu_model_description for more details */
+    DISK,    /**< Disk models: see surf_disk_model_description for more details */
+    VM       /**< VM model */
+  };
+
   /** @brief Possible update mechanisms */
   enum class UpdateAlgo {
     FULL, /**< Full update mechanism: the remaining time of every action is recomputed at each step */
@@ -144,5 +154,11 @@ private:
  *  @brief List of initialized models
  */
 XBT_PUBLIC_DATA std::vector<simgrid::kernel::resource::Model*> all_existing_models;
+/** @ingroup SURF_models
+ *  @brief Map of initialized models by category
+ */
+XBT_PUBLIC_DATA
+std::unordered_map<simgrid::kernel::resource::Model::Type, std::vector<simgrid::kernel::resource::Model*>>
+    models_by_type;
 
 #endif
index 6de255d..4fde708 100644 (file)
@@ -104,6 +104,7 @@ static void remove_active_activity(kernel::activity::ActivityImpl const& act)
 VMModel::VMModel()
 {
   all_existing_models.push_back(this);
+  models_by_type[simgrid::kernel::resource::Model::Type::VM].push_back(this);
   s4u::Host::on_state_change.connect(host_state_change);
   s4u::Exec::on_start.connect(add_active_exec);
   s4u::Exec::on_completion.connect(remove_active_exec);
index 3d0122e..7841e71 100644 (file)
@@ -61,6 +61,7 @@ namespace resource {
 CpuCas01Model::CpuCas01Model(Model::UpdateAlgo algo) : CpuModel(algo)
 {
   all_existing_models.push_back(this);
+  models_by_type[simgrid::kernel::resource::Model::Type::CPU].push_back(this);
 
   bool select = config::get_value<bool>("cpu/maxmin-selective-update");
 
index 564bbfb..3dca750 100644 (file)
@@ -279,6 +279,7 @@ void CpuTiModel::create_pm_vm_models()
 CpuTiModel::CpuTiModel() : CpuModel(Model::UpdateAlgo::FULL)
 {
   all_existing_models.push_back(this);
+  models_by_type[simgrid::kernel::resource::Model::Type::CPU].push_back(this);
 }
 
 CpuTiModel::~CpuTiModel()
index 11eb89f..0b12cab 100644 (file)
@@ -29,6 +29,7 @@ namespace resource {
 DiskS19Model::DiskS19Model()
 {
   all_existing_models.push_back(this);
+  models_by_type[simgrid::kernel::resource::Model::Type::DISK].push_back(this);
 }
 
 DiskImpl* DiskS19Model::create_disk(const std::string& name, double read_bandwidth, double write_bandwidth)
index 3b4cf2a..bb784a0 100644 (file)
@@ -29,6 +29,7 @@ namespace surf {
 HostCLM03Model::HostCLM03Model()
 {
   all_existing_models.push_back(this);
+  models_by_type[simgrid::kernel::resource::Model::Type::HOST].push_back(this);
 }
 
 double HostCLM03Model::next_occurring_event(double now)
index 54c5b92..aa1a9c0 100644 (file)
@@ -76,6 +76,7 @@ NetworkCm02Model::NetworkCm02Model()
                                                                              : Model::UpdateAlgo::LAZY)
 {
   all_existing_models.push_back(this);
+  models_by_type[simgrid::kernel::resource::Model::Type::NETWORK].push_back(this);
 
   std::string optim = config::get_value<std::string>("network/optim");
   bool select       = config::get_value<bool>("network/maxmin-selective-update");
index 37dc9be..7c07560 100644 (file)
@@ -25,6 +25,7 @@ namespace resource {
 NetworkConstantModel::NetworkConstantModel() : NetworkModel(Model::UpdateAlgo::FULL)
 {
   all_existing_models.push_back(this);
+  models_by_type[simgrid::kernel::resource::Model::Type::NETWORK].push_back(this);
 }
 
 LinkImpl* NetworkConstantModel::create_link(const std::string& name, const std::vector<double>& /*bandwidth*/,
index 5bf5dbf..38c3c37 100644 (file)
@@ -293,6 +293,7 @@ NetworkNS3Model::NetworkNS3Model() : NetworkModel(Model::UpdateAlgo::FULL)
              "LinkEnergy plugin and ns-3 network models are not compatible. Are you looking for Ecofen, maybe?");
 
   all_existing_models.push_back(this);
+  models_by_type[simgrid::kernel::resource::Model::Type::NETWORK].push_back(this);
 
   NetPointNs3::EXTENSION_ID = routing::NetPoint::extension_create<NetPointNs3>();
 
index 5a82bd1..1c45a5d 100644 (file)
@@ -24,6 +24,7 @@ void surf_host_model_init_ptask_L07()
 
   surf_host_model = new simgrid::surf::HostL07Model();
   all_existing_models.push_back(surf_host_model);
+  models_by_type[simgrid::kernel::resource::Model::Type::HOST].push_back(surf_host_model);
 }
 
 namespace simgrid {
index c2bab84..a33793b 100644 (file)
@@ -42,6 +42,16 @@ void surf_presolve()
     model->update_actions_state(NOW, 0.0);
 }
 
+static void surf_update_next_event(std::vector<simgrid::kernel::resource::Model*> const& models, double& time_delta)
+{
+  for (auto* model : models) {
+    double next_event = model->next_occurring_event(NOW);
+    if ((time_delta < 0.0 || next_event < time_delta) && next_event >= 0.0) {
+      time_delta = next_event;
+    }
+  }
+}
+
 double surf_solve(double max_date)
 {
   double time_delta                             = -1.0; /* duration */
@@ -57,24 +67,12 @@ double surf_solve(double max_date)
 
   /* Physical models MUST be resolved first */
   XBT_DEBUG("Looking for next event in physical models");
-  double next_event_phy = surf_host_model->next_occurring_event(NOW);
-  if ((time_delta < 0.0 || next_event_phy < time_delta) && next_event_phy >= 0.0) {
-    time_delta = next_event_phy;
-  }
-  if (surf_vm_model != nullptr) {
-    XBT_DEBUG("Looking for next event in virtual models");
-    double next_event_virt = surf_vm_model->next_occurring_event(NOW);
-    if ((time_delta < 0.0 || next_event_virt < time_delta) && next_event_virt >= 0.0)
-      time_delta = next_event_virt;
-  }
+  surf_update_next_event(models_by_type[simgrid::kernel::resource::Model::Type::HOST], time_delta);
+  XBT_DEBUG("Looking for next event in virtual models");
+  surf_update_next_event(models_by_type[simgrid::kernel::resource::Model::Type::VM], time_delta);
 
-  for (auto const& model : all_existing_models) {
-    if (model != surf_host_model && model != surf_vm_model && model != surf_network_model && model != surf_disk_model) {
-      double next_event_model = model->next_occurring_event(NOW);
-      if ((time_delta < 0.0 || next_event_model < time_delta) && next_event_model >= 0.0)
-        time_delta = next_event_model;
-    }
-  }
+  XBT_DEBUG("Looking for next event in CPU models");
+  surf_update_next_event(models_by_type[simgrid::kernel::resource::Model::Type::CPU], time_delta);
 
   XBT_DEBUG("Min for resources (remember that NS3 don't update that value): %f", time_delta);
 
index 4180682..5a9fd87 100644 (file)
@@ -30,6 +30,8 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_kernel, surf, "Logging specific to SURF (ke
  *********/
 
 std::vector<simgrid::kernel::resource::Model*> all_existing_models; /* to destroy models correctly */
+std::unordered_map<simgrid::kernel::resource::Model::Type, std::vector<simgrid::kernel::resource::Model*>>
+    models_by_type;
 
 simgrid::kernel::profile::FutureEvtSet future_evt_set;
 std::vector<std::string> surf_path;