From: Frederic Suter Date: Sat, 2 Feb 2019 10:17:15 +0000 (+0100) Subject: properly split init/start for Exec activities X-Git-Tag: v3_22~416 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/66e4277badef8f22852720b79a78e1f091c3b679 properly split init/start for Exec activities --- diff --git a/examples/s4u/exec-monitor/s4u-exec-monitor.tesh b/examples/s4u/exec-monitor/s4u-exec-monitor.tesh index 45de5dd098..eb63d1e91e 100644 --- a/examples/s4u/exec-monitor/s4u-exec-monitor.tesh +++ b/examples/s4u/exec-monitor/s4u-exec-monitor.tesh @@ -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%) -> [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%) +> [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%) diff --git a/include/simgrid/s4u/Exec.hpp b/include/simgrid/s4u/Exec.hpp index 6848e7838d..0fdf8e38ea 100644 --- a/include/simgrid/s4u/Exec.hpp +++ b/include/simgrid/s4u/Exec.hpp @@ -21,7 +21,8 @@ namespace s4u { */ 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); diff --git a/src/kernel/activity/ActivityImpl.hpp b/src/kernel/activity/ActivityImpl.hpp index 8f1267fb8e..5668b7ae0a 100644 --- a/src/kernel/activity/ActivityImpl.hpp +++ b/src/kernel/activity/ActivityImpl.hpp @@ -23,7 +23,6 @@ class XBT_PUBLIC ActivityImpl { 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 */ diff --git a/src/kernel/activity/ExecImpl.cpp b/src/kernel/activity/ExecImpl.cpp index 0edc38596b..3cd26b0bbb 100644 --- a/src/kernel/activity/ExecImpl.cpp +++ b/src/kernel/activity/ExecImpl.cpp @@ -15,15 +15,15 @@ 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) - : ActivityImpl(name, surf_action), host_(host), timeout_detector_(timeout_detector) + : ActivityImpl(name), host_(host), timeout_detector_(timeout_detector) { this->state_ = SIMIX_RUNNING; + this->set_category(tracing_category); - surf_action_->set_data(this); if (timeout_detector != nullptr) - timeout_detector->set_data(this); + timeout_detector_->set_data(this); XBT_DEBUG("Create exec %p", this); } @@ -37,6 +37,20 @@ simgrid::kernel::activity::ExecImpl::~ExecImpl() 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()); diff --git a/src/kernel/activity/ExecImpl.hpp b/src/kernel/activity/ExecImpl.hpp index 9ad4b5ed60..6ea0231356 100644 --- a/src/kernel/activity/ExecImpl.hpp +++ b/src/kernel/activity/ExecImpl.hpp @@ -17,8 +17,9 @@ class XBT_PUBLIC ExecImpl : public ActivityImpl { ~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); + void start(double flops_amount, double priority, double bound); void suspend() override; void resume() override; void cancel(); diff --git a/src/s4u/s4u_Actor.cpp b/src/s4u/s4u_Actor.cpp index f5c00f3e8a..5e2988b6e8 100644 --- a/src/s4u/s4u_Actor.cpp +++ b/src/s4u/s4u_Actor.cpp @@ -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 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) diff --git a/src/s4u/s4u_Exec.cpp b/src/s4u/s4u_Exec.cpp index 60ba49aced..047c786681 100644 --- a/src/s4u/s4u_Exec.cpp +++ b/src/s4u/s4u_Exec.cpp @@ -15,9 +15,20 @@ namespace s4u { simgrid::xbt::signal s4u::Exec::on_start; simgrid::xbt::signal 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() { - pimpl_ = simcall_execution_start(name_, tracing_category_, flops_amount_, 1. / priority_, bound_, host_); + simix::simcall([this] { + dynamic_cast(pimpl_.get())->start(flops_amount_, 1. / priority_, bound_); + }); 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(pimpl_)->migrate(host); host_ = host; + boost::static_pointer_cast(pimpl_)->host_ = host; return this; } diff --git a/src/s4u/s4u_Host.cpp b/src/s4u/s4u_Host.cpp index 24163be788..80000607cb 100644 --- a/src/s4u/s4u_Host.cpp +++ b/src/s4u/s4u_Host.cpp @@ -295,6 +295,7 @@ void Host::execute(double flops) { 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(); diff --git a/src/s4u/s4u_Storage.cpp b/src/s4u/s4u_Storage.cpp index 5ee855b0da..f0bd686d3e 100644 --- a/src/s4u/s4u_Storage.cpp +++ b/src/s4u/s4u_Storage.cpp @@ -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 res = IoPtr(new Io(this, size, type)); - return res; + return IoPtr(new Io(this, size, type)); } IoPtr Storage::read_async(sg_size_t size) diff --git a/src/simix/smx_host.cpp b/src/simix/smx_host.cpp index 7196bdc390..df906bb256 100644 --- a/src/simix/smx_host.cpp +++ b/src/simix/smx_host.cpp @@ -38,9 +38,11 @@ simgrid::kernel::activity::ExecImplPtr SIMIX_execution_start(std::string name, s } 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); @@ -70,7 +72,9 @@ simgrid::kernel::activity::ExecImplPtr SIMIX_execution_parallel_start(std::strin } 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());