* Improvement of the Energy plugin.
- Always update the consumption before returning that value
- New property: watt_off to denote the disipation when the host is off
+ - New functions getWattMinAt and getWattMaxAt to retrieve the
+ dissipation of pstates that we are not currently at.
XBT
* New functions
- Add a xbt_heap_update function, to avoid costly xbt_heap_remove+xbt_heap_insert use
XBT_PUBLIC(xbt_swag_t) MSG_host_get_process_list(msg_host_t h);
XBT_PUBLIC(int) MSG_host_is_on(msg_host_t h);
XBT_PUBLIC(int) MSG_host_is_off(msg_host_t h);
+XBT_PUBLIC(double) MSG_host_get_wattmin_at(msg_host_t host, int pstate);
+XBT_PUBLIC(double) MSG_host_get_wattmax_at(msg_host_t host, int pstate);
+
XBT_PUBLIC(void) __MSG_host_priv_free(msg_host_priv_t priv);
XBT_PUBLIC(void) __MSG_host_destroy(msg_host_t host);
XBT_PUBLIC(void) simcall_host_set_pstate(smx_host_t host, int pstate_index);
XBT_PUBLIC(int) simcall_host_get_pstate(smx_host_t host);
XBT_PUBLIC(double) simcall_host_get_consumed_energy(smx_host_t host);
+XBT_PUBLIC(double) simcall_host_get_wattmin_at(smx_host_t host, int pstate);
+XBT_PUBLIC(double) simcall_host_get_wattmax_at(smx_host_t host, int pstate);
XBT_PUBLIC(smx_synchro_t) simcall_host_execute(const char *name, smx_host_t host,
double flops_amount,
XBT_PUBLIC(void) surf_workstation_set_pstate(surf_resource_t host, int pstate_index);
XBT_PUBLIC(int) surf_workstation_get_pstate(surf_resource_t host);
+XBT_PUBLIC(double) surf_workstation_get_wattmin_at(surf_resource_t resource, int pstate);
+XBT_PUBLIC(double) surf_workstation_get_wattmax_at(surf_resource_t resource, int pstate);
/**
* @brief Get the consumed energy (in joules) of a workstation
xbt_assert((host != NULL), "Invalid parameters (host is NULL)");
return simcall_host_get_consumed_energy(host);
}
+/** \ingroup m_host_management
+ * \brief Returns the amount of watt dissipated at the given pstate when the host is idling
+ *
+ */
+double MSG_host_get_wattmin_at(msg_host_t host, int pstate){
+ return simcall_host_get_wattmin_at(host, pstate);
+}
+/** \ingroup m_host_management
+ * \brief Returns the amount of watt dissipated at the given pstate when the host burns CPU at 100%
+ *
+ */
+double MSG_host_get_wattmax_at(msg_host_t host, int pstate){
+ return simcall_host_get_wattmax_at(host, pstate);
+}
+/** \ingroup m_host_management
+ * \brief Set the parameters of a given host
+ *
+ * \param host a host
+ * \param params a prameter object
+ */
/** \ingroup m_host_management
* \brief Return the list of mount point names on an host.
{
return simcall_BODY_host_get_consumed_energy(host);
}
+/** \ingroup simix_host_management
+ * \brief Returns the amount of watt dissipated at the given pstate when the host is idling
+ */
+double simcall_host_get_wattmin_at(msg_host_t host, int pstate){
+ return simcall_BODY_host_get_wattmin_at(host, pstate);
+}
+/** \ingroup simix_host_management
+ * \brief Returns the amount of watt dissipated at the given pstate when the host burns CPU at 100%
+ */
+double simcall_host_get_wattmax_at(msg_host_t host, int pstate){
+ return simcall_BODY_host_get_wattmax_at(host, pstate);
+}
+
/**
simcall->result.i = result;
}
+static inline smx_host_t simcall_host_get_wattmin_at__get__host(smx_simcall_t simcall) {
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_wattmin_at__set__host(smx_simcall_t simcall, void* arg) {
+ simcall->args[0].dp = arg;
+}
+static inline int simcall_host_get_wattmin_at__get__pstate_index(smx_simcall_t simcall) {
+ return simcall->args[1].i;
+}
+static inline void simcall_host_get_wattmin_at__set__pstate_index(smx_simcall_t simcall, int arg) {
+ simcall->args[1].i = arg;
+}
+static inline double simcall_host_get_wattmin_at__get__result(smx_simcall_t simcall){
+ return simcall->result.d;
+}
+static inline void simcall_host_get_wattmin_at__set__result(smx_simcall_t simcall, double result){
+ simcall->result.d = result;
+}
+
+static inline smx_host_t simcall_host_get_wattmax_at__get__host(smx_simcall_t simcall) {
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_wattmax_at__set__host(smx_simcall_t simcall, void* arg) {
+ simcall->args[0].dp = arg;
+}
+static inline int simcall_host_get_wattmax_at__get__pstate_index(smx_simcall_t simcall) {
+ return simcall->args[1].i;
+}
+static inline void simcall_host_get_wattmax_at__set__pstate_index(smx_simcall_t simcall, int arg) {
+ simcall->args[1].i = arg;
+}
+static inline double simcall_host_get_wattmax_at__get__result(smx_simcall_t simcall){
+ return simcall->result.d;
+}
+static inline void simcall_host_get_wattmax_at__set__result(smx_simcall_t simcall, double result){
+ simcall->result.d = result;
+}
+
static inline smx_host_t simcall_host_set_pstate__get__host(smx_simcall_t simcall) {
return (smx_host_t) simcall->args[0].dp;
}
return self->simcall.result.i;
}
+inline static double simcall_BODY_host_get_wattmin_at(smx_host_t host, int pstate_index) {
+ smx_process_t self = SIMIX_process_self();
+
+ /* Go to that function to follow the code flow through the simcall barrier */
+ if (0) SIMIX_host_get_wattmin_at(host, pstate_index);
+ /* end of the guide intended to the poor programmer wanting to go from MSG to Surf */
+
+ self->simcall.call = SIMCALL_HOST_GET_WATTMIN_AT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ self->simcall.args[1].i = (int) pstate_index;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_handle(&self->simcall, 0);
+ }
+ return self->simcall.result.d;
+ }
+
+inline static double simcall_BODY_host_get_wattmax_at(smx_host_t host, int pstate_index) {
+ smx_process_t self = SIMIX_process_self();
+
+ /* Go to that function to follow the code flow through the simcall barrier */
+ if (0) SIMIX_host_get_wattmax_at(host, pstate_index);
+ /* end of the guide intended to the poor programmer wanting to go from MSG to Surf */
+
+ self->simcall.call = SIMCALL_HOST_GET_WATTMAX_AT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ self->simcall.args[1].i = (int) pstate_index;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_handle(&self->simcall, 0);
+ }
+ return self->simcall.result.d;
+ }
+
inline static void simcall_BODY_host_set_pstate(smx_host_t host, int pstate_index) {
smx_process_t self = SIMIX_process_self();
SIMCALL_HOST_GET_CURRENT_POWER_PEAK,
SIMCALL_HOST_GET_POWER_PEAK_AT,
SIMCALL_HOST_GET_NB_PSTATES,
+ SIMCALL_HOST_GET_WATTMIN_AT,
+ SIMCALL_HOST_GET_WATTMAX_AT,
SIMCALL_HOST_SET_PSTATE,
SIMCALL_HOST_GET_PSTATE,
SIMCALL_HOST_GET_CONSUMED_ENERGY,
[SIMCALL_HOST_GET_CURRENT_POWER_PEAK] = "SIMCALL_HOST_GET_CURRENT_POWER_PEAK",
[SIMCALL_HOST_GET_POWER_PEAK_AT] = "SIMCALL_HOST_GET_POWER_PEAK_AT",
[SIMCALL_HOST_GET_NB_PSTATES] = "SIMCALL_HOST_GET_NB_PSTATES",
+ [SIMCALL_HOST_GET_WATTMIN_AT] = "SIMCALL_HOST_GET_WATTMIN_AT",
+ [SIMCALL_HOST_GET_WATTMAX_AT] = "SIMCALL_HOST_GET_WATTMAX_AT",
[SIMCALL_HOST_SET_PSTATE] = "SIMCALL_HOST_SET_PSTATE",
[SIMCALL_HOST_GET_PSTATE] = "SIMCALL_HOST_GET_PSTATE",
[SIMCALL_HOST_GET_CONSUMED_ENERGY] = "SIMCALL_HOST_GET_CONSUMED_ENERGY",
SIMIX_simcall_answer(simcall);
break;
+case SIMCALL_HOST_GET_WATTMIN_AT:
+ simcall->result.d = SIMIX_host_get_wattmin_at((smx_host_t) simcall->args[0].dp, simcall->args[1].i);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_WATTMAX_AT:
+ simcall->result.d = SIMIX_host_get_wattmax_at((smx_host_t) simcall->args[0].dp, simcall->args[1].i);
+ SIMIX_simcall_answer(simcall);
+ break;
+
case SIMCALL_HOST_SET_PSTATE:
SIMIX_host_set_pstate((smx_host_t) simcall->args[0].dp, simcall->args[1].i);
SIMIX_simcall_answer(simcall);
Func - host_get_current_power_peak (double) (host, void*, smx_host_t)
Func - host_get_power_peak_at (double) (host, void*, smx_host_t) (pstate_index, int)
Func - host_get_nb_pstates (int) (host, void*, smx_host_t)
+Func - host_get_wattmin_at (double) (host, void*, smx_host_t) (pstate_index, int)
+Func - host_get_wattmax_at (double) (host, void*, smx_host_t) (pstate_index, int)
Proc - host_set_pstate (void) (host, void*, smx_host_t) (pstate_index, int)
Func - host_get_pstate (int) (host, void*, smx_host_t)
Func - host_get_consumed_energy (double) (host, void*, smx_host_t)
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
return surf_workstation_get_consumed_energy(host);
}
+double SIMIX_host_get_wattmin_at(smx_host_t host,int pstate) {
+ return surf_workstation_get_wattmin_at(host,pstate);
+}
+double SIMIX_host_get_wattmax_at(smx_host_t host,int pstate) {
+ return surf_workstation_get_wattmax_at(host,pstate);
+}
int SIMIX_host_get_state(smx_host_t host){
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
double SIMIX_host_get_power_peak_at(smx_host_t host, int pstate_index);
int SIMIX_host_get_nb_pstates(smx_host_t host);
double SIMIX_host_get_consumed_energy(smx_host_t host);
+double SIMIX_host_get_wattmin_at(smx_host_t host,int pstate);
+double SIMIX_host_get_wattmax_at(smx_host_t host,int pstate);
void SIMIX_host_set_pstate(smx_host_t host, int pstate_index);
int SIMIX_host_get_pstate(smx_host_t host);
smx_synchro_t SIMIX_host_execute(const char *name,
xbt_dynar_free(&power_range_watts_list);
}
+
+double CpuEnergy::getWattMinAt(int pstate) {
+ xbt_dynar_t power_range_list = power_range_watts_list;
+ xbt_assert(power_range_watts_list, "No power range properties specified for host %s", cpu->getName());
+ xbt_dynar_t current_power_values = xbt_dynar_get_as(power_range_list, static_cast<CpuCas01Ptr>(cpu)->getPState(), xbt_dynar_t);
+ double min_power = xbt_dynar_get_as(current_power_values, 0, double);
+ return min_power;
+}
+double CpuEnergy::getWattMaxAt(int pstate) {
+ xbt_dynar_t power_range_list = power_range_watts_list;
+ xbt_assert(power_range_watts_list, "No power range properties specified for host %s", cpu->getName());
+ xbt_dynar_t current_power_values = xbt_dynar_get_as(power_range_list, static_cast<CpuCas01Ptr>(cpu)->getPState(), xbt_dynar_t);
+ double max_power = xbt_dynar_get_as(current_power_values, 1, double);
+ return max_power;
+}
+
/**
* Computes the power consumed by the host according to the current pstate and processor load
*
double CpuEnergy::getCurrentWattsValue(double cpu_load)
{
xbt_dynar_t power_range_list = power_range_watts_list;
-
- if (power_range_list == NULL)
- {
- XBT_DEBUG("No power range properties specified for host %s", cpu->getName());
- return 0;
- }
- /*xbt_assert(xbt_dynar_length(power_range_list) == xbt_dynar_length(cpu->p_powerPeakList),
- "The number of power ranges in the properties does not match the number of pstates for host %s",
- cpu->getName());*/
+ xbt_assert(power_range_watts_list, "No power range properties specified for host %s", cpu->getName());
/* retrieve the power values associated with the current pstate */
xbt_dynar_t current_power_values = xbt_dynar_get_as(power_range_list, static_cast<CpuCas01Ptr>(cpu)->getPState(), xbt_dynar_t);
double getCurrentWattsValue(double cpu_load);
double getConsumedEnergy();
+ double getWattMinAt(int pstate);
+ double getWattMaxAt(int pstate);
xbt_dynar_t getWattsRangeList();
xbt_dynar_t power_range_watts_list; /*< List of (min_power,max_power) pairs corresponding to each cpu pstate */
int surf_workstation_get_pstate(surf_resource_t resource){
return get_casted_workstation(resource)->getPstate();
}
+double surf_workstation_get_wattmin_at(surf_resource_t resource, int pstate){
+ xbt_assert(surf_energy!=NULL, "The Energy plugin is not active. Please call sg_energy_plugin_init() during initialization.");
+ std::map<CpuPtr, CpuEnergyPtr>::iterator cpuIt = surf_energy->find(get_casted_workstation(resource)->p_cpu);
+ return cpuIt->second->getWattMinAt(pstate);
+}
+double surf_workstation_get_wattmax_at(surf_resource_t resource, int pstate){
+ xbt_assert(surf_energy!=NULL, "The Energy plugin is not active. Please call sg_energy_plugin_init() during initialization.");
+ std::map<CpuPtr, CpuEnergyPtr>::iterator cpuIt = surf_energy->find(get_casted_workstation(resource)->p_cpu);
+ return cpuIt->second->getWattMaxAt(pstate);
+}
double surf_workstation_get_consumed_energy(surf_resource_t resource){
- xbt_assert(surf_energy!=NULL, "The Energy plugin is not active.");
+ xbt_assert(surf_energy!=NULL, "The Energy plugin is not active. Please call sg_energy_plugin_init() during initialization.");
std::map<CpuPtr, CpuEnergyPtr>::iterator cpuIt = surf_energy->find(get_casted_workstation(resource)->p_cpu);
return cpuIt->second->getConsumedEnergy();
}