*
* X/(X+Y)*W_idle + Y/(X+Y)*W_burn
*
- * where X is the amount of ideling cores, and Y the amount of computing cores.
+ * where X is the amount of idling cores, and Y the amount of computing cores.
*/
double previous_energy = this->total_energy;
XBT_DEBUG(
"[update_energy of %s] period=[%.2f-%.2f]; current power peak=%.0E flop/s; consumption change: %.2f J -> %.2f J",
- host->name().c_str(), start_time, finish_time, host->pimpl_cpu->speed_.peak, previous_energy, energy_this_step);
+ host->cname(), start_time, finish_time, host->pimpl_cpu->speed_.peak, previous_energy, energy_this_step);
}
HostEnergy::HostEnergy(simgrid::s4u::Host *ptr) : host(ptr), last_updated(surf_get_clock())
{
initWattsRangeList();
- if (host->properties() != nullptr) {
- char* off_power_str = (char*)xbt_dict_get_or_null(host->properties(), "watt_off");
- if (off_power_str != nullptr) {
- char *msg = bprintf("Invalid value for property watt_off of host %s: %%s",host->name().c_str());
- watts_off = xbt_str_parse_double(off_power_str, msg);
- xbt_free(msg);
- }
- else
- watts_off = 0;
+ const char* off_power_str = host->property("watt_off");
+ if (off_power_str != nullptr) {
+ char* msg = bprintf("Invalid value for property watt_off of host %s: %%s", host->cname());
+ this->watts_off = xbt_str_parse_double(off_power_str, msg);
+ xbt_free(msg);
}
+ /* watts_off is 0 by default */
}
HostEnergy::~HostEnergy()=default;
double HostEnergy::getWattMinAt(int pstate)
{
- xbt_assert(!power_range_watts_list.empty(), "No power range properties specified for host %s", host->name().c_str());
+ xbt_assert(!power_range_watts_list.empty(), "No power range properties specified for host %s", host->cname());
return power_range_watts_list[pstate].min;
}
double HostEnergy::getWattMaxAt(int pstate)
{
- xbt_assert(!power_range_watts_list.empty(), "No power range properties specified for host %s", host->name().c_str());
+ xbt_assert(!power_range_watts_list.empty(), "No power range properties specified for host %s", host->cname());
return power_range_watts_list[pstate].max;
}
/** @brief Computes the power consumed by the host according to the current pstate and processor load */
double HostEnergy::getCurrentWattsValue(double cpu_load)
{
- xbt_assert(!power_range_watts_list.empty(), "No power range properties specified for host %s", host->name().c_str());
+ xbt_assert(!power_range_watts_list.empty(), "No power range properties specified for host %s", host->cname());
/* min_power corresponds to the idle power (cpu load = 0) */
/* max_power is the power consumed at 100% cpu load */
void HostEnergy::initWattsRangeList()
{
- if (host->properties() == nullptr)
- return;
- char* all_power_values_str = static_cast<char*>(xbt_dict_get_or_null(host->properties(), "watt_per_state"));
+ const char* all_power_values_str = host->property("watt_per_state");
if (all_power_values_str == nullptr)
return;
for (int i=0; i< pstate_nb; i++) {
/* retrieve the power values associated with the current pstate */
xbt_dynar_t current_power_values = xbt_str_split(xbt_dynar_get_as(all_power_values, i, char*), ":");
- xbt_assert(xbt_dynar_length(current_power_values) > 1,
- "Power properties incorrectly defined - could not retrieve min and max power values for host %s",
- host->name().c_str());
+ xbt_assert(xbt_dynar_length(current_power_values) == 3,
+ "Power properties incorrectly defined - could not retrieve idle, min and max power values for host %s",
+ host->cname());
/* min_power corresponds to the idle power (cpu load = 0) */
/* max_power is the power consumed at 100% cpu load */
- char *msg_idle = bprintf("Invalid idle value for pstate %d on host %s: %%s", i, host->name().c_str());
- char *msg_min = bprintf("Invalid min value for pstate %d on host %s: %%s", i, host->name().c_str());
- char *msg_max = bprintf("Invalid max value for pstate %d on host %s: %%s", i, host->name().c_str());
+ char* msg_idle = bprintf("Invalid idle value for pstate %d on host %s: %%s", i, host->cname());
+ char* msg_min = bprintf("Invalid min value for pstate %d on host %s: %%s", i, host->cname());
+ char* msg_max = bprintf("Invalid max value for pstate %d on host %s: %%s", i, host->cname());
PowerRange range(
xbt_str_parse_double(xbt_dynar_get_as(current_power_values, 0, char*), msg_idle),
xbt_str_parse_double(xbt_dynar_get_as(current_power_values, 1, char*), msg_min),
xbt_str_parse_double(xbt_dynar_get_as(current_power_values, 2, char*), msg_max)
);
power_range_watts_list.push_back(range);
+ xbt_free(msg_idle);
xbt_free(msg_min);
xbt_free(msg_max);
}
static void onActionStateChange(simgrid::surf::CpuAction *action, simgrid::surf::Action::State previous) {
- for(simgrid::surf::Cpu* cpu : action->cpus()) {
- const char *name = cpu->getName();
- sg_host_t sghost = sg_host_by_name(name);
- if(sghost == nullptr)
+ for (simgrid::surf::Cpu* cpu : action->cpus()) {
+ simgrid::s4u::Host* host = cpu->getHost();
+ if (host == nullptr)
continue;
- simgrid::surf::HostImpl* host = sghost->pimpl_;
- simgrid::s4u::VirtualMachine* vm = dynamic_cast<simgrid::s4u::VirtualMachine*>(sghost);
+
+ // If it's a VM, take the corresponding PM
+ simgrid::s4u::VirtualMachine* vm = dynamic_cast<simgrid::s4u::VirtualMachine*>(host);
if (vm) // If it's a VM, take the corresponding PM
- host = vm->pimpl_vm_->getPm()->pimpl_;
+ host = vm->pimpl_vm_->getPm();
- HostEnergy *host_energy = host->piface_->extension<HostEnergy>();
+ // Get the host_energy extension for the relevant host
+ HostEnergy* host_energy = host->extension<HostEnergy>();
- if(host_energy->last_updated < surf_get_clock())
+ if (host_energy->last_updated < surf_get_clock())
host_energy->update();
}
}
}
static void onHostDestruction(simgrid::s4u::Host& host) {
- // Ignore virtual machines
- if (dynamic_cast<simgrid::s4u::VirtualMachine*>(&host))
+ if (dynamic_cast<simgrid::s4u::VirtualMachine*>(&host)) // Ignore virtual machines
return;
+
HostEnergy *host_energy = host.extension<HostEnergy>();
host_energy->update();
- XBT_INFO("Total energy of host %s: %f Joules", host.name().c_str(), host_energy->getConsumedEnergy());
+ XBT_INFO("Total energy of host %s: %f Joules", host.cname(), host_energy->getConsumedEnergy());
}
/* **************************** Public interface *************************** */