Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
New functions getWattMinAt and getWattMaxAt
authorMartin Quinson <martin.quinson@loria.fr>
Wed, 10 Jun 2015 15:16:19 +0000 (17:16 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Wed, 10 Jun 2015 15:16:19 +0000 (17:16 +0200)
16 files changed:
ChangeLog
include/simgrid/msg.h
include/simgrid/simix.h
src/include/surf/surf.h
src/msg/msg_host.c
src/simix/libsmx.c
src/simix/popping_accessors.h
src/simix/popping_bodies.c
src/simix/popping_enum.h
src/simix/popping_generated.c
src/simix/simcalls.in
src/simix/smx_host.c
src/simix/smx_host_private.h
src/surf/plugins/energy.cpp
src/surf/plugins/energy.hpp
src/surf/surf_c_bindings.cpp

index 565fe29..310c4af 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -80,6 +80,8 @@ SimGrid (3.12) NOT RELEASED; urgency=low
   * 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 
index e2d19de..7064424 100644 (file)
@@ -322,6 +322,9 @@ XBT_PUBLIC(int) MSG_host_get_core_number(msg_host_t h);
 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);
 
index 099966d..c2b0ea0 100644 (file)
@@ -322,6 +322,8 @@ XBT_PUBLIC(int) simcall_host_get_nb_pstates(smx_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,
index 0ddc491..e8cbccb 100644 (file)
@@ -622,6 +622,8 @@ XBT_PUBLIC(int) surf_workstation_get_nb_pstates(surf_resource_t host);
 
 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
index f745ee8..074ed17 100644 (file)
@@ -425,6 +425,26 @@ double MSG_host_get_consumed_energy(msg_host_t host) {
          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.
index 36f75fd..0e63140 100644 (file)
@@ -224,6 +224,19 @@ double simcall_host_get_consumed_energy(smx_host_t 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);
+}
+
 
 
 /**
index f520b3c..e16c91f 100644 (file)
@@ -177,6 +177,44 @@ static inline void simcall_host_get_nb_pstates__set__result(smx_simcall_t simcal
     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;
 }
index 0f233fe..6f0afee 100644 (file)
@@ -291,6 +291,50 @@ inline static int simcall_BODY_host_get_nb_pstates(smx_host_t host) {
     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();
 
index e662c5e..a025c25 100644 (file)
@@ -31,6 +31,8 @@ typedef enum {
   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,
index ba0638a..d7eb366 100644 (file)
@@ -35,6 +35,8 @@ const char* simcall_names[] = {
   [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",
@@ -231,6 +233,16 @@ case SIMCALL_HOST_GET_NB_PSTATES:
       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);
index 09ed723..44465ba 100644 (file)
@@ -59,6 +59,8 @@ Func - host_get_state (int) (host, void*, smx_host_t)
 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)
index ad2874c..c11c704 100644 (file)
@@ -245,6 +245,12 @@ double SIMIX_host_get_consumed_energy(smx_host_t host) {
          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)");
index 63a2f81..ecd0d25 100644 (file)
@@ -51,6 +51,8 @@ double SIMIX_host_get_current_power_peak(smx_host_t host);
 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,
index 7023723..627ad9b 100644 (file)
@@ -168,6 +168,22 @@ CpuEnergy::~CpuEnergy(){
   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
  *
@@ -175,15 +191,7 @@ CpuEnergy::~CpuEnergy(){
 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);
index 682ae46..9b776be 100644 (file)
@@ -22,6 +22,8 @@ public:
 
   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 */
index 2d7b613..5ab27f2 100644 (file)
@@ -362,9 +362,19 @@ void surf_workstation_set_pstate(surf_resource_t resource, int pstate_index){
 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();
 }