X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8a0e2b82a1c0981a84e67f1bb4afb6e16fbf8c3a..2ef59b0adb027b30c217be9b19ee418841aa7885:/src/s4u/s4u_Host.cpp diff --git a/src/s4u/s4u_Host.cpp b/src/s4u/s4u_Host.cpp index af81dcb9a0..4ad611bd3e 100644 --- a/src/s4u/s4u_Host.cpp +++ b/src/s4u/s4u_Host.cpp @@ -28,9 +28,9 @@ simgrid::xbt::signal Host::on_destruction; simgrid::xbt::signal Host::on_state_change; simgrid::xbt::signal Host::on_speed_change; -Host::Host(const char* name) : name_(name) +Host::Host(std::string name) : name_(name) { - xbt_assert(Host::by_name_or_null(name) == nullptr, "Refusing to create a second host named '%s'.", name); + xbt_assert(Host::by_name_or_null(name) == nullptr, "Refusing to create a second host named '%s'.", name.c_str()); Engine::get_instance()->host_register(std::string(name_), this); new simgrid::surf::HostImpl(this); } @@ -68,14 +68,6 @@ Host* Host::by_name(std::string name) { return Engine::get_instance()->host_by_name(name); } -Host* Host::by_name(const char* name) -{ - return Engine::get_instance()->host_by_name(std::string(name)); -} -Host* Host::by_name_or_null(const char* name) -{ - return Engine::get_instance()->host_by_name_or_null(std::string(name)); -} Host* Host::by_name_or_null(std::string name) { return Engine::get_instance()->host_by_name_or_null(name); @@ -86,14 +78,14 @@ Host* Host::current() smx_actor_t smx_proc = SIMIX_process_self(); if (smx_proc == nullptr) xbt_die("Cannot call Host::current() from the maestro context"); - return smx_proc->host; + return smx_proc->host_; } void Host::turn_on() { if (is_off()) { simgrid::simix::simcall([this] { - this->extension()->turnOn(); + this->pimpl_->turn_on(); this->pimpl_cpu->turn_on(); on_state_change(*this); }); @@ -104,29 +96,16 @@ void Host::turn_on() void Host::turn_off() { if (is_on()) { - smx_actor_t self = SIMIX_process_self(); - simgrid::simix::simcall([this, self] { - simgrid::simix::Host* host = this->extension(); - - xbt_assert((host != nullptr), "Invalid parameters"); - + simgrid::simix::simcall([this] { this->pimpl_cpu->turn_off(); - - /* Clean Simulator data */ - if (not host->process_list.empty()) { - for (auto& process : host->process_list) { - SIMIX_process_kill(&process, self); - XBT_DEBUG("Killing %s@%s on behalf of %s which turned off that host.", process.get_cname(), - process.host->get_cname(), self->get_cname()); - } - } + this->pimpl_->turn_off(); on_state_change(*this); }); } } -bool Host::is_on() +bool Host::is_on() const { return this->pimpl_cpu->is_on(); } @@ -143,32 +122,29 @@ int Host::get_pstate_count() const */ std::vector Host::get_all_actors() { - std::vector res; - for (auto& actor : this->extension()->process_list) - res.push_back(actor.ciface()); - return res; + return pimpl_->get_all_actors(); } /** @brief Returns how many actors (daemonized or not) have been launched on this host */ int Host::get_actor_count() { - return this->extension()->process_list.size(); + return pimpl_->get_actor_count(); } /** @deprecated */ void Host::getProcesses(std::vector* list) { - for (auto& actor : this->extension()->process_list) { - list->push_back(actor.iface()); - } + auto actors = get_all_actors(); + for (auto& actor : actors) + list->push_back(actor); } /** @deprecated */ void Host::actorList(std::vector* whereto) { - for (auto& actor : this->extension()->process_list) { - whereto->push_back(actor.ciface()); - } + auto actors = get_all_actors(); + for (auto& actor : actors) + whereto->push_back(actor); } /** @@ -210,7 +186,7 @@ std::unordered_map* Host::get_properties() } /** Retrieve the property value (or nullptr if not set) */ -const char* Host::get_property(const char* key) +const char* Host::get_property(std::string key) const { return this->pimpl_->get_property(key); } @@ -221,30 +197,48 @@ void Host::set_property(std::string key, std::string value) } /** @brief Get the peak processor speed (in flops/s), at the specified pstate */ -double Host::getPstateSpeed(int pstate_index) +double Host::get_pstate_speed(int pstate_index) const { return simgrid::simix::simcall([this, pstate_index] { return this->pimpl_cpu->get_pstate_peak_speed(pstate_index); }); } -/** @brief Get the peak processor speed in flops/s, (under full load (=1.0), at the current pstate) +/** @brief Get the peak computing speed in flops/s at the current pstate, taking the external load into account. + * + * The amount of flops per second available for computing depends on several things: + * - The current pstate determines the maximal peak computing speed (use @ref get_pstate_speed() to retrieve the + * computing speed you would get at another pstate) + * - If you declared an external load, then this reduces the available computing speed + * (see @ref simgrid::surf::Cpu::set_speed_trace()) * - * The result also takes the external load into account. + * The remaining speed is then shared between the executions located on this host. + * You can retrieve the amount of tasks currently running on this host with @ref get_load(). + * + * The host may have multiple cores, and your executions may be able to use more than a single core. + * + * Finally, executions of priority 2 get twice the amount of flops than executions of priority 1. */ -double Host::getSpeed() +double Host::get_speed() const { return this->pimpl_cpu->get_speed(1.0); } +/** @brief Returns the current computation load (in flops per second) + * The external load (coming from an availability trace) is not taken in account. + */ +double Host::get_load() const +{ + return this->pimpl_cpu->get_load(); +} /** @brief Get the available speed ratio, between 0 and 1. * - * This accounts for external load (see @ref set_speed_trace()). + * This accounts for external load (see @ref simgrid::surf::Cpu::set_speed_trace()). */ -double Host::get_available_speed() +double Host::get_available_speed() const { return this->pimpl_cpu->get_speed_ratio(); } /** @brief Returns the number of core of the processor. */ -int Host::get_core_count() +int Host::get_core_count() const { return this->pimpl_cpu->get_core_count(); } @@ -255,7 +249,7 @@ void Host::set_pstate(int pstate_index) simgrid::simix::simcall([this, pstate_index] { this->pimpl_cpu->set_pstate(pstate_index); }); } /** @brief Retrieve the pstate at which the host is currently running */ -int Host::get_pstate() +int Host::get_pstate() const { return this->pimpl_cpu->get_pstate(); } @@ -265,7 +259,7 @@ int Host::get_pstate() * \brief Returns the list of storages attached to an host. * \return a vector containing all storages attached to the host */ -std::vector Host::get_attached_storages() +std::vector Host::get_attached_storages() const { return simgrid::simix::simcall([this] { return this->pimpl_->get_attached_storages(); }); } @@ -278,7 +272,7 @@ void Host::getAttachedStorages(std::vector* storages) storages->push_back(elm); } -std::unordered_map const& Host::getMountedStorages() +std::unordered_map const& Host::get_mounted_storages() { if (mounts_ == nullptr) { mounts_ = new std::unordered_map(); @@ -295,15 +289,10 @@ void Host::execute(double flops) } void Host::execute(double flops, double priority) { - smx_activity_t s = simcall_execution_start(nullptr, flops, 1 / priority /*priority*/, 0. /*bound*/, this); + smx_activity_t s = simcall_execution_start("", flops, 1 / priority /*priority*/, 0. /*bound*/, this); simcall_execution_wait(s); } -double Host::getLoad() -{ - return this->pimpl_cpu->get_load(); -} - } // namespace s4u } // namespace simgrid @@ -394,7 +383,7 @@ xbt_dict_t sg_host_get_mounted_storage_list(sg_host_t host) { xbt_assert((host != nullptr), "Invalid parameters"); xbt_dict_t res = xbt_dict_new_homogeneous(nullptr); - for (auto const& elm : host->getMountedStorages()) { + for (auto const& elm : host->get_mounted_storages()) { const char* mount_name = elm.first.c_str(); sg_storage_t storage = elm.second; xbt_dict_set(res, mount_name, (void*)storage->get_cname(), nullptr); @@ -417,7 +406,7 @@ xbt_dynar_t sg_host_get_attached_storage_list(sg_host_t host) /** @brief Returns the total speed of a host */ double sg_host_speed(sg_host_t host) { - return host->getSpeed(); + return host->get_speed(); } /** \brief Return the speed of the processor (in flop/s) at a given pstate. See also @ref plugin_energy. @@ -428,7 +417,7 @@ double sg_host_speed(sg_host_t host) */ double sg_host_get_pstate_speed(sg_host_t host, int pstate_index) { - return host->getPstateSpeed(pstate_index); + return host->get_pstate_speed(pstate_index); } /** \ingroup m_host_management @@ -603,7 +592,7 @@ double sg_host_route_bandwidth(sg_host_t from, sg_host_t to) void sg_host_dump(sg_host_t host) { XBT_INFO("Displaying host %s", host->get_cname()); - XBT_INFO(" - speed: %.0f", host->getSpeed()); + XBT_INFO(" - speed: %.0f", host->get_speed()); XBT_INFO(" - available speed: %.2f", sg_host_get_available_speed(host)); std::unordered_map* props = host->get_properties(); @@ -622,14 +611,13 @@ void sg_host_dump(sg_host_t host) */ void sg_host_get_actor_list(sg_host_t host, xbt_dynar_t whereto) { - for (auto& actor : host->extension()->process_list) { - s4u_Actor* p = actor.ciface(); - xbt_dynar_push(whereto, &p); - } + auto actors = host->get_all_actors(); + for (auto& actor : actors) + xbt_dynar_push(whereto, &actor); } sg_host_t sg_host_self() { smx_actor_t process = SIMIX_process_self(); - return (process == nullptr) ? nullptr : process->host; + return (process == nullptr) ? nullptr : process->host_; }