Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
properly split init/start for Exec activities
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Sat, 2 Feb 2019 10:17:15 +0000 (11:17 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Sat, 2 Feb 2019 10:17:15 +0000 (11:17 +0100)
examples/s4u/exec-monitor/s4u-exec-monitor.tesh
include/simgrid/s4u/Exec.hpp
src/kernel/activity/ActivityImpl.hpp
src/kernel/activity/ExecImpl.cpp
src/kernel/activity/ExecImpl.hpp
src/s4u/s4u_Actor.cpp
src/s4u/s4u_Exec.cpp
src/s4u/s4u_Host.cpp
src/s4u/s4u_Storage.cpp
src/simix/smx_host.cpp

index 45de5dd..eb63d1e 100644 (file)
@@ -9,8 +9,8 @@ $ $SG_TEST_EXENV ${bindir:=.}/s4u-exec-monitor$EXEEXT ${platfdir}/small_platform
 > [Tremblay:monitor 1:(2) 10.000000] [s4u_test/INFO] activity remaining duration: 2.3704e+08 (24%)
 > [Fafard:executor:(1) 13.106847] [s4u_test/INFO] The monitored task is over. Let's start 3 of them now.
 > [Jupiter:monitor 2:(3) 13.106847] [s4u_test/INFO] activity remaining duration: 1e+09 (100%)
 > [Tremblay:monitor 1:(2) 10.000000] [s4u_test/INFO] activity remaining duration: 2.3704e+08 (24%)
 > [Fafard:executor:(1) 13.106847] [s4u_test/INFO] The monitored task is over. Let's start 3 of them now.
 > [Jupiter:monitor 2:(3) 13.106847] [s4u_test/INFO] activity remaining duration: 1e+09 (100%)
-> [Fafard:executor:(1) 13.106847] [s4u_test/INFO] All activities are started; finish now
 > [Ginette:monitor 3:(4) 13.106847] [s4u_test/INFO] activity remaining duration: 1e+09 (100%)
 > [Ginette:monitor 3:(4) 13.106847] [s4u_test/INFO] activity remaining duration: 1e+09 (100%)
+> [Fafard:executor:(1) 13.106847] [s4u_test/INFO] All activities are started; finish now
 > [Bourassa:monitor 4:(5) 13.106847] [s4u_test/INFO] activity remaining duration: 1e+09 (100%)
 > [Tremblay:monitor 1:(2) 15.000000] [s4u_test/INFO] My task is over.
 > [Bourassa:monitor 4:(5) 18.106847] [s4u_test/INFO] activity remaining duration: 8.7284e+08 (87%)
 > [Bourassa:monitor 4:(5) 13.106847] [s4u_test/INFO] activity remaining duration: 1e+09 (100%)
 > [Tremblay:monitor 1:(2) 15.000000] [s4u_test/INFO] My task is over.
 > [Bourassa:monitor 4:(5) 18.106847] [s4u_test/INFO] activity remaining duration: 8.7284e+08 (87%)
index 6848e78..0fdf8e3 100644 (file)
@@ -21,7 +21,8 @@ namespace s4u {
  */
 
 class XBT_PUBLIC Exec : public Activity {
  */
 
 class XBT_PUBLIC Exec : public Activity {
-  Exec() : Activity() {}
+  explicit Exec(sg_host_t host, double flops_amount);
+
 public:
   friend XBT_PUBLIC void intrusive_ptr_release(simgrid::s4u::Exec * e);
   friend XBT_PUBLIC void intrusive_ptr_add_ref(simgrid::s4u::Exec * e);
 public:
   friend XBT_PUBLIC void intrusive_ptr_release(simgrid::s4u::Exec * e);
   friend XBT_PUBLIC void intrusive_ptr_add_ref(simgrid::s4u::Exec * e);
index 8f1267f..5668b7a 100644 (file)
@@ -23,7 +23,6 @@ class XBT_PUBLIC ActivityImpl {
 public:
   ActivityImpl() = default;
   explicit ActivityImpl(std::string name) : name_(name) {}
 public:
   ActivityImpl() = default;
   explicit ActivityImpl(std::string name) : name_(name) {}
-  explicit ActivityImpl(std::string name, resource::Action* surf_action) : name_(name), surf_action_(surf_action) {}
   virtual ~ActivityImpl() = default;
   e_smx_state_t state_ = SIMIX_WAITING; /* State of the activity */
   std::string name_;                    /* Activity name if any */
   virtual ~ActivityImpl() = default;
   e_smx_state_t state_ = SIMIX_WAITING; /* State of the activity */
   std::string name_;                    /* Activity name if any */
index 0edc385..3cd26b0 100644 (file)
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_process);
 
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_process);
 
-simgrid::kernel::activity::ExecImpl::ExecImpl(std::string name, resource::Action* surf_action,
+simgrid::kernel::activity::ExecImpl::ExecImpl(std::string name, std::string tracing_category,
                                               resource::Action* timeout_detector, s4u::Host* host)
                                               resource::Action* timeout_detector, s4u::Host* host)
-    : ActivityImpl(name, surf_action), host_(host), timeout_detector_(timeout_detector)
+    : ActivityImpl(name), host_(host), timeout_detector_(timeout_detector)
 {
   this->state_ = SIMIX_RUNNING;
 {
   this->state_ = SIMIX_RUNNING;
+  this->set_category(tracing_category);
 
 
-  surf_action_->set_data(this);
   if (timeout_detector != nullptr)
   if (timeout_detector != nullptr)
-    timeout_detector->set_data(this);
+    timeout_detector_->set_data(this);
 
   XBT_DEBUG("Create exec %p", this);
 }
 
   XBT_DEBUG("Create exec %p", this);
 }
@@ -37,6 +37,20 @@ simgrid::kernel::activity::ExecImpl::~ExecImpl()
   XBT_DEBUG("Destroy exec %p", this);
 }
 
   XBT_DEBUG("Destroy exec %p", this);
 }
 
+void simgrid::kernel::activity::ExecImpl::start(double flops_amount, double priority, double bound)
+{
+  if (not MC_is_active() && not MC_record_replay_is_active()) {
+    surf_action_ = host_->pimpl_cpu->execution_start(flops_amount);
+    surf_action_->set_data(this);
+    surf_action_->set_priority(priority);
+    if (bound > 0)
+      surf_action_->set_bound(bound);
+  }
+
+  XBT_DEBUG("Create execute synchro %p: %s", this, name_.c_str());
+  simgrid::kernel::activity::ExecImpl::on_creation(this);
+}
+
 void simgrid::kernel::activity::ExecImpl::suspend()
 {
   XBT_VERB("This exec is suspended (remain: %f)", surf_action_->get_remains());
 void simgrid::kernel::activity::ExecImpl::suspend()
 {
   XBT_VERB("This exec is suspended (remain: %f)", surf_action_->get_remains());
index 9ad4b5e..6ea0231 100644 (file)
@@ -17,8 +17,9 @@ class XBT_PUBLIC ExecImpl : public ActivityImpl {
   ~ExecImpl() override;
 
 public:
   ~ExecImpl() override;
 
 public:
-  explicit ExecImpl(std::string name, resource::Action* surf_action, resource::Action* timeout_detector,
+  explicit ExecImpl(std::string name, std::string tracing_category, resource::Action* timeout_detector,
                     s4u::Host* host);
                     s4u::Host* host);
+  void start(double flops_amount, double priority, double bound);
   void suspend() override;
   void resume() override;
   void cancel();
   void suspend() override;
   void resume() override;
   void cancel();
index f5c00f3..5e2988b 100644 (file)
@@ -338,11 +338,7 @@ void parallel_execute(int host_nb, sg_host_t* host_list, double* flops_amount, d
 
 ExecPtr exec_init(double flops_amount)
 {
 
 ExecPtr exec_init(double flops_amount)
 {
-  ExecPtr res        = ExecPtr(new Exec());
-  res->host_         = get_host();
-  res->flops_amount_ = flops_amount;
-  res->set_remaining(flops_amount);
-  return res;
+  return ExecPtr(new Exec(get_host(), flops_amount));
 }
 
 ExecPtr exec_async(double flops)
 }
 
 ExecPtr exec_async(double flops)
index 60ba49a..047c786 100644 (file)
@@ -15,9 +15,20 @@ namespace s4u {
 simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> s4u::Exec::on_start;
 simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> s4u::Exec::on_completion;
 
 simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> s4u::Exec::on_start;
 simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> s4u::Exec::on_completion;
 
+Exec::Exec(sg_host_t host, double flops_amount) : Activity(), host_(host), flops_amount_(flops_amount)
+{
+  Activity::set_remaining(flops_amount_);
+  pimpl_ = simix::simcall([this] {
+    return kernel::activity::ExecImplPtr(new kernel::activity::ExecImpl(name_, tracing_category_,
+                                                                        /*timeout_detector*/ nullptr, host_));
+  });
+}
+
 Exec* Exec::start()
 {
 Exec* Exec::start()
 {
-  pimpl_ = simcall_execution_start(name_, tracing_category_, flops_amount_, 1. / priority_, bound_, host_);
+  simix::simcall([this] {
+    dynamic_cast<kernel::activity::ExecImpl*>(pimpl_.get())->start(flops_amount_, 1. / priority_, bound_);
+  });
   state_ = State::STARTED;
   on_start(Actor::self());
   return this;
   state_ = State::STARTED;
   on_start(Actor::self());
   return this;
@@ -99,6 +110,7 @@ ExecPtr Exec::set_host(Host* host)
   if (state_ == State::STARTED)
     boost::static_pointer_cast<simgrid::kernel::activity::ExecImpl>(pimpl_)->migrate(host);
   host_ = host;
   if (state_ == State::STARTED)
     boost::static_pointer_cast<simgrid::kernel::activity::ExecImpl>(pimpl_)->migrate(host);
   host_ = host;
+  boost::static_pointer_cast<simgrid::kernel::activity::ExecImpl>(pimpl_)->host_ = host;
   return this;
 }
 
   return this;
 }
 
index 24163be..8000060 100644 (file)
@@ -295,6 +295,7 @@ void Host::execute(double flops)
 {
   execute(flops, 1.0 /* priority */);
 }
 {
   execute(flops, 1.0 /* priority */);
 }
+
 void Host::execute(double flops, double priority)
 {
   this_actor::exec_init(flops)->set_host(this)->set_priority(1 / priority)->start()->wait();
 void Host::execute(double flops, double priority)
 {
   this_actor::exec_init(flops)->set_host(this)->set_priority(1 / priority)->start()->wait();
index 5ee855b..f0bd686 100644 (file)
@@ -58,8 +58,7 @@ void Storage::set_property(std::string key, std::string value)
 
 IoPtr Storage::io_init(sg_size_t size, Io::OpType type)
 {
 
 IoPtr Storage::io_init(sg_size_t size, Io::OpType type)
 {
-  IoPtr res = IoPtr(new Io(this, size, type));
-  return res;
+  return IoPtr(new Io(this, size, type));
 }
 
 IoPtr Storage::read_async(sg_size_t size)
 }
 
 IoPtr Storage::read_async(sg_size_t size)
index 7196bdc..df906bb 100644 (file)
@@ -38,9 +38,11 @@ simgrid::kernel::activity::ExecImplPtr SIMIX_execution_start(std::string name, s
   }
 
   simgrid::kernel::activity::ExecImplPtr exec = simgrid::kernel::activity::ExecImplPtr(
   }
 
   simgrid::kernel::activity::ExecImplPtr exec = simgrid::kernel::activity::ExecImplPtr(
-      new simgrid::kernel::activity::ExecImpl(name, surf_action, /*timeout_detector*/ nullptr, host));
+      new simgrid::kernel::activity::ExecImpl(name, category, /*timeout_detector*/ nullptr, host));
+
+  exec->surf_action_ = surf_action;
+  exec->surf_action_->set_data(exec.get());
 
 
-  exec->set_category(category);
   XBT_DEBUG("Create execute synchro %p: %s", exec.get(), exec->name_.c_str());
   simgrid::kernel::activity::ExecImpl::on_creation(exec);
 
   XBT_DEBUG("Create execute synchro %p: %s", exec.get(), exec->name_.c_str());
   simgrid::kernel::activity::ExecImpl::on_creation(exec);
 
@@ -70,7 +72,9 @@ simgrid::kernel::activity::ExecImplPtr SIMIX_execution_parallel_start(std::strin
   }
 
   simgrid::kernel::activity::ExecImplPtr exec = simgrid::kernel::activity::ExecImplPtr(
   }
 
   simgrid::kernel::activity::ExecImplPtr exec = simgrid::kernel::activity::ExecImplPtr(
-      new simgrid::kernel::activity::ExecImpl(name, surf_action, timeout_detector, nullptr));
+      new simgrid::kernel::activity::ExecImpl(name, "", timeout_detector, nullptr));
+  exec->surf_action_ = surf_action;
+  exec->surf_action_->set_data(exec.get());
 
   XBT_DEBUG("Create parallel execute synchro %p", exec.get());
 
 
   XBT_DEBUG("Create parallel execute synchro %p", exec.get());