X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/aef2ec7abdfe053c3d76f3e496c38224192142d4..e3b7b40594af0c6cae13e79ace27da724740fcf6:/src/surf/plugins/host_dvfs.cpp diff --git a/src/surf/plugins/host_dvfs.cpp b/src/surf/plugins/host_dvfs.cpp index 7df4784c25..5ff2dcb1ee 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 { @@ -140,6 +143,24 @@ public: } }; +/** + * Add this to your host tag: + * - + * + * Valid values as of now are: performance, powersave, ondemand, conservative + * It doesn't matter if you use uppercase or lowercase. + * + * For the sampling rate, use this: + * + * - + * + * This will run the update() method of the specified governor every 2 seconds + * on that host. + * + * These properties can also be used within the tag to configure + * these values globally. Using them within the will overwrite this + * global configuration + */ class HostDvfs { public: static simgrid::xbt::Extension EXTENSION_ID; @@ -177,29 +198,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 +263,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?"); } }