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 {
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 {
}
};
+/**
+ * Add this to your host tag:
+ * - <prop id="plugin/dvfs/governor" value="performance" />
+ *
+ * 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:
+ *
+ * - <prop id="plugin/dvfs/sampling_rate" value="2" />
+ *
+ * This will run the update() method of the specified governor every 2 seconds
+ * on that host.
+ *
+ * These properties can also be used within the <config> tag to configure
+ * these values globally. Using them within the <host> will overwrite this
+ * global configuration
+ */
class HostDvfs {
public:
static simgrid::xbt::Extension<simgrid::s4u::Host, HostDvfs> EXTENSION_ID;
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<simgrid::plugin::dvfs::Governor>(
+ new simgrid::plugin::dvfs::Conservative(daemonProc->getHost()));
+ } else if (dvfs_governor == "ondemand") {
+ return std::unique_ptr<simgrid::plugin::dvfs::Governor>(
+ new simgrid::plugin::dvfs::OnDemand(daemonProc->getHost()));
+ } else if (dvfs_governor == "performance") {
+ return std::unique_ptr<simgrid::plugin::dvfs::Governor>(
+ new simgrid::plugin::dvfs::Performance(daemonProc->getHost()));
+ } else if (dvfs_governor == "powersave") {
+ return std::unique_ptr<simgrid::plugin::dvfs::Governor>(
+ 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<simgrid::plugin::dvfs::Governor>(
+ new simgrid::plugin::dvfs::Performance(daemonProc->getHost()));
+ }
+ }();
while (1) {
// Sleep *before* updating; important for startup (i.e., t = 0).
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?");
}
}