From: Martin Quinson Date: Tue, 9 Jun 2015 15:04:58 +0000 (+0200) Subject: New: MSG_host_get_pstate() and smpi_get_host_pstate() X-Git-Tag: v3_12~635 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/9072f634ac2f4bdece800197ad4ad73ec96fd1d8?hp=d59d27482febdeebb55fcc3e116f5b9305771bb9 New: MSG_host_get_pstate() and smpi_get_host_pstate() --- diff --git a/ChangeLog b/ChangeLog index 61dbb2d538..ceb1e4d462 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,7 @@ SimGrid (3.12) NOT RELEASED; urgency=low get_data_size(t) -> get_bytes_amount(t) - Massive cleanups in the functions related to the energy - MSG_host_get_pstate_number() -> MSG_host_get_nb_pstates() + - New: MSG_host_get_pstate() jMSG: * Interface improvement: - Rename Host.isAvail() to Host.isOn() @@ -65,8 +66,9 @@ SimGrid (3.12) NOT RELEASED; urgency=low - [#17799] : have mpi_group_range_incl and mpi_group_range_excl better test some corner cases - Correctly use loopback on fat-tree clusters - Asynchronous small messages shouldn't trigger deadlocks anymore - * Interface cleanup - - smpi_set_host_power_peak_at -> smpi_set_host_pstate + * Energy/DVFS cleanup and improvement + - smpi_set_host_power_peak_at() -> smpi_set_host_pstate() + - new: smpi_get_host_pstate() SURF * Bug fixes - "Full" network optimization flag was broken since Surf++ diff --git a/include/simgrid/msg.h b/include/simgrid/msg.h index de58a7ca5d..e2d19deab4 100644 --- a/include/simgrid/msg.h +++ b/include/simgrid/msg.h @@ -329,6 +329,8 @@ XBT_PUBLIC(double) MSG_host_get_power_peak_at(msg_host_t h, int pstate); XBT_PUBLIC(double) MSG_host_get_current_power_peak(msg_host_t h); XBT_PUBLIC(int) MSG_host_get_nb_pstates(msg_host_t h); XBT_PUBLIC(void) MSG_host_set_pstate(msg_host_t h, int pstate); +XBT_PUBLIC(int) MSG_host_get_pstate(msg_host_t host); + XBT_PUBLIC(double) MSG_host_get_consumed_energy(msg_host_t h); /*property handlers*/ diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index 1cb3fd643a..099966d18e 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -320,6 +320,7 @@ XBT_PUBLIC(double) simcall_host_get_current_power_peak(smx_host_t host); XBT_PUBLIC(double) simcall_host_get_power_peak_at(smx_host_t host, int pstate_index); 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(smx_synchro_t) simcall_host_execute(const char *name, smx_host_t host, diff --git a/include/smpi/smpi.h b/include/smpi/smpi.h index ef0e55b948..5eaf7acc17 100644 --- a/include/smpi/smpi.h +++ b/include/smpi/smpi.h @@ -835,6 +835,8 @@ XBT_PUBLIC(double) smpi_get_host_power_peak_at(int pstate_index); XBT_PUBLIC(double) smpi_get_host_current_power_peak(void); XBT_PUBLIC(int) smpi_get_host_nb_pstates(void); XBT_PUBLIC(void) smpi_set_host_pstate(int pstate_index); +XBT_PUBLIC(int) smpi_get_host_pstate(void); + XBT_PUBLIC(double) smpi_get_host_consumed_energy(void); XBT_PUBLIC(int) smpi_usleep(useconds_t usecs); diff --git a/src/bindings/java/org/simgrid/surf/Cpu.java b/src/bindings/java/org/simgrid/surf/Cpu.java index 3ddad07692..0fec4c4617 100644 --- a/src/bindings/java/org/simgrid/surf/Cpu.java +++ b/src/bindings/java/org/simgrid/surf/Cpu.java @@ -162,6 +162,10 @@ public class Cpu extends Resource { SurfJNI.Cpu_setPstate(swigCPtr, this, pstate_index); } + public int getPstate() { + return SurfJNI.Cpu_getPstate(swigCPtr, this); + } + /** * @param state The new state of the cpu diff --git a/src/bindings/java/org/simgrid/surf/SurfJNI.java b/src/bindings/java/org/simgrid/surf/SurfJNI.java index 08169d647d..3502cf5a82 100644 --- a/src/bindings/java/org/simgrid/surf/SurfJNI.java +++ b/src/bindings/java/org/simgrid/surf/SurfJNI.java @@ -111,6 +111,7 @@ public class SurfJNI { public final static native double Cpu_getPowerPeakAt(long jarg1, Cpu jarg1_, int jarg2); public final static native int Cpu_getNbPstates(long jarg1, Cpu jarg1_); public final static native void Cpu_setPstate(long jarg1, Cpu jarg1_, int jarg2); + public final static native int Cpu_getPstate(long jarg1, Cpu jarg1_); public final static native void Cpu_setState(long jarg1, Cpu jarg1_, int jarg2); public final static native void Cpu_director_connect(Cpu obj, long cptr, boolean mem_own, boolean weak_global); public final static native void Cpu_change_ownership(Cpu obj, long cptr, boolean take_or_release); @@ -250,6 +251,9 @@ public class SurfJNI { public static void SwigDirector_Cpu_setPstate(Cpu self, int pstate_index) { self.setPstate(pstate_index); } + public static int SwigDirector_Cpu_getPstate(Cpu self) { + return self.getPstate(); + } public static double SwigDirector_CpuAction_getRemains(CpuAction self) { return self.getRemains(); } diff --git a/src/bindings/java/surf.i b/src/bindings/java/surf.i index e35cff6117..660d85bfab 100644 --- a/src/bindings/java/surf.i +++ b/src/bindings/java/surf.i @@ -294,6 +294,7 @@ public: virtual double getPowerPeakAt(int pstate_index)=0; virtual int getNbPstates()=0; virtual void setPstate(int pstate_index)=0; + virtual int getPstate()=0; void setState(e_surf_resource_state_t state); }; diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 6aadfc3cf2..0ddc49158b 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -620,14 +620,8 @@ XBT_PUBLIC(double) surf_workstation_get_power_peak_at(surf_resource_t host, int */ XBT_PUBLIC(int) surf_workstation_get_nb_pstates(surf_resource_t host); -/** - * @brief [brief description] - * @details [long description] - * - * @param host [description] - * @param pstate_index [description] - */ 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); /** * @brief Get the consumed energy (in joules) of a workstation diff --git a/src/msg/msg_host.c b/src/msg/msg_host.c index bce361c9b0..21d7ee2eb5 100644 --- a/src/msg/msg_host.c +++ b/src/msg/msg_host.c @@ -394,6 +394,14 @@ void MSG_host_set_pstate(msg_host_t host, int pstate_index) { simcall_host_set_pstate(host, pstate_index); } +/** \ingroup m_host_management + * \brief Gets the pstate at which the given host is currently running. See also @ref SURF_plugin_energy. + * + * \param host host to test + */ +int MSG_host_get_pstate(msg_host_t host) { + return simcall_host_get_pstate(host); +} /** \ingroup m_host_management * \brief Return the total energy consumed by a host (in Joules). See also @ref SURF_plugin_energy. diff --git a/src/simix/libsmx.c b/src/simix/libsmx.c index fb73b7ae01..36f75fd774 100644 --- a/src/simix/libsmx.c +++ b/src/simix/libsmx.c @@ -193,7 +193,7 @@ int simcall_host_get_nb_pstates(smx_host_t host) /** * \ingroup simix_host_management - * \brief Sets a new power peak for a host. + * \brief Sets the pstate at which the host should run * * \param host A SIMIX host * \param pstate_index The pstate to which the CPU power will be set @@ -202,6 +202,16 @@ void simcall_host_set_pstate(smx_host_t host, int pstate_index) { simcall_BODY_host_set_pstate(host, pstate_index); } +/** + * \ingroup simix_host_management + * \brief Gets the pstate at which that host currently runs. + * + * \param host A SIMIX host + */ +int simcall_host_get_pstate(smx_host_t host) +{ + return simcall_BODY_host_get_pstate(host); +} /** * \ingroup simix_host_management diff --git a/src/simix/popping_accessors.h b/src/simix/popping_accessors.h index 5ce83724ad..f520b3c78e 100644 --- a/src/simix/popping_accessors.h +++ b/src/simix/popping_accessors.h @@ -190,6 +190,19 @@ static inline void simcall_host_set_pstate__set__pstate_index(smx_simcall_t simc simcall->args[1].i = arg; } +static inline smx_host_t simcall_host_get_pstate__get__host(smx_simcall_t simcall) { + return (smx_host_t) simcall->args[0].dp; +} +static inline void simcall_host_get_pstate__set__host(smx_simcall_t simcall, void* arg) { + simcall->args[0].dp = arg; +} +static inline int simcall_host_get_pstate__get__result(smx_simcall_t simcall){ + return simcall->result.i; +} +static inline void simcall_host_get_pstate__set__result(smx_simcall_t simcall, int result){ + simcall->result.i = result; +} + static inline smx_host_t simcall_host_get_consumed_energy__get__host(smx_simcall_t simcall) { return (smx_host_t) simcall->args[0].dp; } diff --git a/src/simix/popping_bodies.c b/src/simix/popping_bodies.c index 7c4ea3b39d..0f233fe3d1 100644 --- a/src/simix/popping_bodies.c +++ b/src/simix/popping_bodies.c @@ -313,6 +313,27 @@ inline static void simcall_BODY_host_set_pstate(smx_host_t host, int pstate_inde } +inline static int simcall_BODY_host_get_pstate(smx_host_t host) { + 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_pstate(host); + /* end of the guide intended to the poor programmer wanting to go from MSG to Surf */ + + self->simcall.call = SIMCALL_HOST_GET_PSTATE; + 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; + 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.i; + } + inline static double simcall_BODY_host_get_consumed_energy(smx_host_t host) { smx_process_t self = SIMIX_process_self(); diff --git a/src/simix/popping_enum.h b/src/simix/popping_enum.h index 0225d19cc6..e662c5e44c 100644 --- a/src/simix/popping_enum.h +++ b/src/simix/popping_enum.h @@ -32,6 +32,7 @@ typedef enum { SIMCALL_HOST_GET_POWER_PEAK_AT, SIMCALL_HOST_GET_NB_PSTATES, SIMCALL_HOST_SET_PSTATE, + SIMCALL_HOST_GET_PSTATE, SIMCALL_HOST_GET_CONSUMED_ENERGY, SIMCALL_HOST_EXECUTE, SIMCALL_HOST_PARALLEL_EXECUTE, diff --git a/src/simix/popping_generated.c b/src/simix/popping_generated.c index e34eae3aff..ba0638a849 100644 --- a/src/simix/popping_generated.c +++ b/src/simix/popping_generated.c @@ -36,6 +36,7 @@ const char* simcall_names[] = { [SIMCALL_HOST_GET_POWER_PEAK_AT] = "SIMCALL_HOST_GET_POWER_PEAK_AT", [SIMCALL_HOST_GET_NB_PSTATES] = "SIMCALL_HOST_GET_NB_PSTATES", [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", [SIMCALL_HOST_EXECUTE] = "SIMCALL_HOST_EXECUTE", [SIMCALL_HOST_PARALLEL_EXECUTE] = "SIMCALL_HOST_PARALLEL_EXECUTE", @@ -235,6 +236,11 @@ case SIMCALL_HOST_SET_PSTATE: SIMIX_simcall_answer(simcall); break; +case SIMCALL_HOST_GET_PSTATE: + simcall->result.i = SIMIX_host_get_pstate((smx_host_t) simcall->args[0].dp); + SIMIX_simcall_answer(simcall); + break; + case SIMCALL_HOST_GET_CONSUMED_ENERGY: simcall->result.d = SIMIX_host_get_consumed_energy((smx_host_t) simcall->args[0].dp); SIMIX_simcall_answer(simcall); diff --git a/src/simix/simcalls.in b/src/simix/simcalls.in index 1f4e7b9fc6..09ed723a8c 100644 --- a/src/simix/simcalls.in +++ b/src/simix/simcalls.in @@ -60,6 +60,7 @@ 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) 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) Func - host_execute (void*, smx_synchro_t) (name, const char*) (host, void*, smx_host_t) (flops_amount, double) (priority, double) (bound, double) (affinity_mask, unsigned long) diff --git a/src/simix/smx_host.c b/src/simix/smx_host.c index 5126b2dc28..ad2874c53f 100644 --- a/src/simix/smx_host.c +++ b/src/simix/smx_host.c @@ -237,6 +237,9 @@ void SIMIX_host_set_pstate(smx_host_t host, int pstate_index) { surf_workstation_set_pstate(host, pstate_index); } +int SIMIX_host_get_pstate(smx_host_t host) { + return surf_workstation_get_pstate(host); +} double SIMIX_host_get_consumed_energy(smx_host_t host) { xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)"); diff --git a/src/simix/smx_host_private.h b/src/simix/smx_host_private.h index 9c108af466..63a2f81ccf 100644 --- a/src/simix/smx_host_private.h +++ b/src/simix/smx_host_private.h @@ -52,6 +52,7 @@ 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); 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, smx_host_t host, double flops_amount, double priority, double bound, unsigned long affinity_mask); smx_synchro_t SIMIX_host_parallel_execute(const char *name, diff --git a/src/smpi/smpi_dvfs.c b/src/smpi/smpi_dvfs.c index 395f84e696..a0129f25f1 100644 --- a/src/smpi/smpi_dvfs.c +++ b/src/smpi/smpi_dvfs.c @@ -42,7 +42,7 @@ int smpi_get_host_nb_pstates(void) } /** - * \brief Sets the speed of the processor (in flop/s) at a given pstate + * \brief Sets the pstate at which the processor should run * * \param pstate_index pstate to switch to */ @@ -50,6 +50,15 @@ void smpi_set_host_pstate(int pstate_index) { simcall_host_set_pstate(SIMIX_host_self(), pstate_index); } +/** + * \brief Gets the pstate at which the processor currently running + * + * \param pstate_index pstate to switch to + */ +int smpi_get_host_pstate() +{ + return simcall_host_get_pstate(SIMIX_host_self()); +} /** * \brief Return the total energy consumed by a host (in Joules) diff --git a/src/surf/cpu_cas01.cpp b/src/surf/cpu_cas01.cpp index f5182c3e54..d5fb35574b 100644 --- a/src/surf/cpu_cas01.cpp +++ b/src/surf/cpu_cas01.cpp @@ -351,6 +351,11 @@ void CpuCas01::setPstate(int pstate_index) m_powerPeak = new_pstate; } +int CpuCas01::getPstate() +{ + return m_pstate; +} + /********** * Action * **********/ diff --git a/src/surf/cpu_cas01.hpp b/src/surf/cpu_cas01.hpp index 46e9cafbb0..b40cd044fd 100644 --- a/src/surf/cpu_cas01.hpp +++ b/src/surf/cpu_cas01.hpp @@ -59,6 +59,7 @@ public: double getPowerPeakAt(int pstate_index); int getNbPstates(); void setPstate(int pstate_index); + int getPstate(); bool isUsed(); void setStateEvent(tmgr_trace_event_t stateEvent); void setPowerEvent(tmgr_trace_event_t stateEvent); diff --git a/src/surf/cpu_interface.hpp b/src/surf/cpu_interface.hpp index 7e7ff09815..de6859aae9 100644 --- a/src/surf/cpu_interface.hpp +++ b/src/surf/cpu_interface.hpp @@ -200,6 +200,7 @@ public: virtual int getNbPstates()=0; virtual void setPstate(int pstate_index)=0; + virtual int getPstate()=0; void setState(e_surf_resource_state_t state); diff --git a/src/surf/cpu_ti.hpp b/src/surf/cpu_ti.hpp index 3cb11990df..80679ad6f6 100644 --- a/src/surf/cpu_ti.hpp +++ b/src/surf/cpu_ti.hpp @@ -140,6 +140,7 @@ public: double getPowerPeakAt(int /*pstate_index*/) {THROW_UNIMPLEMENTED;}; int getNbPstates() {THROW_UNIMPLEMENTED;}; void setPstate(int /*pstate_index*/) {THROW_UNIMPLEMENTED;}; + int getPstate() { THROW_UNIMPLEMENTED;} void modified(bool modified); CpuTiTgmrPtr p_availTrace; /*< Structure with data needed to integrate trace file */ diff --git a/src/surf/surf_c_bindings.cpp b/src/surf/surf_c_bindings.cpp index 3387974d10..2d7b613530 100644 --- a/src/surf/surf_c_bindings.cpp +++ b/src/surf/surf_c_bindings.cpp @@ -357,7 +357,10 @@ int surf_workstation_get_nb_pstates(surf_resource_t resource){ } void surf_workstation_set_pstate(surf_resource_t resource, int pstate_index){ - return get_casted_workstation(resource)->setPstate(pstate_index); + get_casted_workstation(resource)->setPstate(pstate_index); +} +int surf_workstation_get_pstate(surf_resource_t resource){ + return get_casted_workstation(resource)->getPstate(); } double surf_workstation_get_consumed_energy(surf_resource_t resource){ diff --git a/src/surf/workstation_interface.cpp b/src/surf/workstation_interface.cpp index 3a5472be10..fc2bcde5e2 100644 --- a/src/surf/workstation_interface.cpp +++ b/src/surf/workstation_interface.cpp @@ -159,6 +159,10 @@ void Workstation::setPstate(int pstate_index) { p_cpu->setPstate(pstate_index); } +int Workstation::getPstate() +{ + return p_cpu->getPstate(); +} xbt_dict_t Workstation::getProperties() { diff --git a/src/surf/workstation_interface.hpp b/src/surf/workstation_interface.hpp index 4c39287b6e..eb6c8dc004 100644 --- a/src/surf/workstation_interface.hpp +++ b/src/surf/workstation_interface.hpp @@ -238,6 +238,7 @@ public: virtual double getPowerPeakAt(int pstate_index); virtual int getNbPstates(); virtual void setPstate(int pstate_index); + virtual int getPstate(); /** * @brief Return the storage of corresponding mount point diff --git a/src/surf/workstation_ptask_L07.cpp b/src/surf/workstation_ptask_L07.cpp index 0904cf574c..4bb17add9f 100644 --- a/src/surf/workstation_ptask_L07.cpp +++ b/src/surf/workstation_ptask_L07.cpp @@ -433,25 +433,27 @@ WorkstationL07::WorkstationL07(WorkstationModelPtr model, const char* name, xbt_ double WorkstationL07::getPowerPeakAt(int /*pstate_index*/) { - XBT_DEBUG("[ws_get_power_peak_at] Not implemented for workstation_ptask_L07"); - return 0.0; + THROW_UNIMPLEMENTED; } int WorkstationL07::getNbPstates() { - XBT_DEBUG("[ws_get_nb_pstates] Not implemented for workstation_ptask_L07"); - return 0.0; + THROW_UNIMPLEMENTED; } void WorkstationL07::setPstate(int /*pstate_index*/) { - XBT_DEBUG("[ws_set_power_peak_at] Not implemented for workstation_ptask_L07"); + THROW_UNIMPLEMENTED; +} + +int WorkstationL07::getPstate() +{ + THROW_UNIMPLEMENTED; } double WorkstationL07::getConsumedEnergy() { - XBT_DEBUG("[ws_get_consumed_energy] Not implemented for workstation_ptask_L07"); - return 0.0; + THROW_UNIMPLEMENTED; } CpuL07::CpuL07(CpuL07ModelPtr model, const char* name, xbt_dict_t props, diff --git a/src/surf/workstation_ptask_L07.hpp b/src/surf/workstation_ptask_L07.hpp index 39cb5fe392..dc94987aaf 100644 --- a/src/surf/workstation_ptask_L07.hpp +++ b/src/surf/workstation_ptask_L07.hpp @@ -111,6 +111,7 @@ public: double getPowerPeakAt(int pstate_index); int getNbPstates(); void setPstate(int pstate_index); + int getPstate(); double getConsumedEnergy(); }; @@ -132,6 +133,7 @@ public: double getPowerPeakAt(int /*pstate_index*/) {THROW_UNIMPLEMENTED;}; int getNbPstates() {THROW_UNIMPLEMENTED;}; void setPstate(int /*pstate_index*/) {THROW_UNIMPLEMENTED;}; + int getPstate() {THROW_UNIMPLEMENTED;}; double getConsumedEnergy() {THROW_UNIMPLEMENTED;}; };