X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f3164f15be19f415e96f061c00123abdc7ee5176..4abb5993262c94ae6ec8aab815fcd703764df371:/src/surf/plugins/host_dvfs.cpp diff --git a/src/surf/plugins/host_dvfs.cpp b/src/surf/plugins/host_dvfs.cpp index 7f20af00ae..5d518c7e2e 100644 --- a/src/surf/plugins/host_dvfs.cpp +++ b/src/surf/plugins/host_dvfs.cpp @@ -27,6 +27,9 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_plugin_dvfs, surf, "Logging specific to the SURF HostDvfs plugin"); +static const char* property_sampling_rate = "plugin/dvfs/sampling_rate"; +static const char* property_governor = "plugin/dvfs/governor"; + namespace simgrid { namespace plugin { @@ -44,8 +47,8 @@ public: void init() { - const char* local_sampling_rate_config = host->getProperty("plugin/dvfs/sampling_rate"); - double global_sampling_rate_config = xbt_cfg_get_double("plugin/dvfs/sampling_rate"); + const char* local_sampling_rate_config = host->getProperty(property_sampling_rate); + double global_sampling_rate_config = xbt_cfg_get_double(property_sampling_rate); if (local_sampling_rate_config != nullptr) { sampling_rate = std::stod(local_sampling_rate_config); } else { @@ -88,7 +91,7 @@ public: // FIXME I don't like that we multiply with the getCoreCount() just here... if (load*host->getCoreCount() > freq_up_threshold) { host->setPstate(0); /* Run at max. performance! */ - XBT_INFO("Changed to pstate %f", 0.0); + XBT_INFO("Load: %f > threshold: %f --> changed to pstate %i", load * host->getCoreCount(), freq_up_threshold, 0); } else { /* The actual implementation uses a formula here: (See Kernel file cpufreq_ondemand.c:158) * @@ -139,7 +142,6 @@ public: } } }; -} class HostDvfs { public: @@ -156,8 +158,9 @@ HostDvfs::HostDvfs(simgrid::s4u::Host* ptr) {} HostDvfs::~HostDvfs() = default; } } +} -using simgrid::plugin::HostDvfs; +using simgrid::plugin::dvfs::HostDvfs; /* **************************** events callback *************************** */ static void on_host_added(simgrid::s4u::Host& host) @@ -177,29 +180,35 @@ static void on_host_added(simgrid::s4u::Host& host) XBT_DEBUG("DVFS process on %s is a daemon: %d", daemonProc->getHost()->getName().c_str(), daemonProc->isDaemon()); std::string dvfs_governor; - const char* host_conf = daemonProc->getHost()->getProperty("plugin/dvfs/governor"); + const char* host_conf = daemonProc->getHost()->getProperty(property_governor); if (host_conf != nullptr) { - dvfs_governor = std::string(daemonProc->getHost()->getProperty("plugin/dvfs/governor")); + dvfs_governor = std::string(daemonProc->getHost()->getProperty(property_governor)); boost::algorithm::to_lower(dvfs_governor); } else { - dvfs_governor = xbt_cfg_get_string("plugin/dvfs/governor"); + dvfs_governor = xbt_cfg_get_string(property_governor); boost::algorithm::to_lower(dvfs_governor); } - // FIXME This is really ugly. When do we free the governor? Actually, never, because - // daemons never stop to run - they will be killed when the simulation is over. :( - simgrid::plugin::dvfs::Governor* governor; - if (dvfs_governor == "conservative") { - governor = new simgrid::plugin::dvfs::Conservative(daemonProc->getHost()); - } else if (dvfs_governor == "ondemand") { - governor = new simgrid::plugin::dvfs::OnDemand(daemonProc->getHost()); - } else if (dvfs_governor == "performance") { - governor = new simgrid::plugin::dvfs::Performance(daemonProc->getHost()); - } else if (dvfs_governor == "powersave") { - governor = new simgrid::plugin::dvfs::Powersave(daemonProc->getHost()); - } else { - XBT_CRITICAL("No governor specified for host %s", daemonProc->getHost()->getCname()); - } + auto governor = [&dvfs_governor, &daemonProc]() { + if (dvfs_governor == "conservative") { + return std::unique_ptr( + new simgrid::plugin::dvfs::Conservative(daemonProc->getHost())); + } else if (dvfs_governor == "ondemand") { + return std::unique_ptr( + new simgrid::plugin::dvfs::OnDemand(daemonProc->getHost())); + } else if (dvfs_governor == "performance") { + return std::unique_ptr( + new simgrid::plugin::dvfs::Performance(daemonProc->getHost())); + } else if (dvfs_governor == "powersave") { + return std::unique_ptr( + new simgrid::plugin::dvfs::Powersave(daemonProc->getHost())); + } else { + XBT_CRITICAL("No governor specified for host %s, falling back to Performance", + daemonProc->getHost()->getCname()); + return std::unique_ptr( + new simgrid::plugin::dvfs::Performance(daemonProc->getHost())); + } + }(); while (1) { // Sleep *before* updating; important for startup (i.e., t = 0). @@ -236,9 +245,9 @@ void sg_host_dvfs_plugin_init() sg_host_load_plugin_init(); simgrid::s4u::Host::onCreation.connect(&on_host_added); - xbt_cfg_register_double("plugin/dvfs/sampling_rate", 0.1, nullptr, + xbt_cfg_register_double(property_sampling_rate, 0.1, nullptr, "How often should the dvfs plugin check whether the frequency needs to be changed?"); - xbt_cfg_register_string("plugin/dvfs/governor", "performance", nullptr, + xbt_cfg_register_string(property_governor, "performance", nullptr, "Which Governor should be used that adapts the CPU frequency?"); } }