1 /* Copyright (c) 2004-2015. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #include "surf_interface.hpp"
8 #include "maxmin_private.hpp"
10 #ifndef SURF_CPU_INTERFACE_HPP_
11 #define SURF_CPU_INTERFACE_HPP_
24 XBT_PUBLIC(Cpu*) getActionCpu(CpuAction *action);
26 /** @ingroup SURF_callbacks
27 * @brief Callbacks handler which emit the callbacks after Cpu creation *
28 * @details Callback functions have the following signature: `void(CpuPtr)`
30 XBT_PUBLIC_DATA( surf_callback(void, Cpu*)) cpuCreatedCallbacks;
32 /** @ingroup SURF_callbacks
33 * @brief Callbacks handler which emit the callbacks after Cpu destruction *
34 * @details Callback functions have the following signature: `void(CpuPtr)`
36 XBT_PUBLIC_DATA( surf_callback(void, Cpu*)) cpuDestructedCallbacks;
38 /** @ingroup SURF_callbacks
39 * @brief Callbacks handler which emit the callbacks after Cpu State changed *
40 * @details Callback functions have the following signature: `void(CpuAction *action, e_surf_resource_state_t old, e_surf_resource_state_t current)`
42 XBT_PUBLIC_DATA( surf_callback(void, Cpu*, e_surf_resource_state_t, e_surf_resource_state_t)) cpuStateChangedCallbacks;
44 /** @ingroup SURF_callbacks
45 * @brief Callbacks handler which emit the callbacks after CpuAction State changed *
46 * @details Callback functions have the following signature: `void(CpuAction *action, e_surf_action_state_t old, e_surf_action_state_t current)`
48 XBT_PUBLIC_DATA( surf_callback(void, CpuAction*, e_surf_action_state_t, e_surf_action_state_t)) cpuActionStateChangedCallbacks;
50 XBT_PUBLIC(void) cpu_parse_init(sg_platf_host_cbarg_t host);
52 XBT_PUBLIC(void) cpu_add_traces();
58 /** @ingroup SURF_cpu_interface
59 * @brief SURF cpu model interface class
60 * @details A model is an object which handle the interactions between its Resources and its Actions
62 XBT_PUBLIC_CLASS CpuModel : public Model {
64 /** @brief Constructor */
65 CpuModel() : Model() {};
70 * @param name The name of the Cpu
71 * @param power_peak The power peak of this Cpu
72 * @param pstate [TODO]
73 * @param power_scale The power scale of this Cpu
74 * @param power_trace [TODO]
75 * @param core The number of core of this Cpu
76 * @param state_initial [TODO]
77 * @param state_trace [TODO]
78 * @param cpu_properties Dictionary of properties associated to this Cpu
80 virtual Cpu *createCpu(const char *name, xbt_dynar_t power_peak,
81 int pstate, double power_scale,
82 tmgr_trace_t power_trace, int core,
83 e_surf_resource_state_t state_initial,
84 tmgr_trace_t state_trace,
85 xbt_dict_t cpu_properties)=0;
87 void updateActionsStateLazy(double now, double delta);
88 void updateActionsStateFull(double now, double delta);
89 bool shareResourcesIsIdempotent() {return true;}
96 /** @ingroup SURF_cpu_interface
97 * @brief SURF cpu resource interface class
98 * @details A Cpu represent a cpu associated to a host
100 XBT_PUBLIC_CLASS Cpu : public Resource {
103 * @brief Cpu constructor
108 * @brief Cpu constructor
110 * @param model The CpuModel associated to this Cpu
111 * @param name The name of the Cpu
112 * @param props Dictionary of properties associated to this Cpu
113 * @param constraint The lmm constraint associated to this Cpu if it is part of a LMM component
114 * @param core The number of core of this Cpu
115 * @param powerPeak The power peak of this Cpu
116 * @param powerScale The power scale of this Cpu
118 Cpu(Model *model, const char *name, xbt_dict_t props,
119 lmm_constraint_t constraint, int core, double powerPeak, double powerScale);
122 * @brief Cpu constructor
124 * @param model The CpuModel associated to this Cpu
125 * @param name The name of the Cpu
126 * @param props Dictionary of properties associated to this Cpu
127 * @param core The number of core of this Cpu
128 * @param powerPeak The power peak of this Cpu in [TODO]
129 * @param powerScale The power scale of this Cpu in [TODO]
131 Cpu(Model *model, const char *name, xbt_dict_t props,
132 int core, double powerPeak, double powerScale);
135 * @brief Cpu destructor
140 * @brief Execute some quantity of computation
142 * @param size The value of the processing amount (in flop) needed to process
143 * @return The CpuAction corresponding to the processing
145 virtual CpuAction *execute(double size)=0;
148 * @brief Make a process sleep for duration (in seconds)
150 * @param duration The number of seconds to sleep
151 * @return The CpuAction corresponding to the sleeping
153 virtual CpuAction *sleep(double duration)=0;
156 * @brief Get the number of cores of the current Cpu
158 * @return The number of cores of the current Cpu
160 virtual int getCore();
163 * @brief Get the speed of the current Cpu
164 * @details [TODO] load * m_powerPeak
168 * @return The speed of the current Cpu
170 virtual double getSpeed(double load);
173 * @brief Get the available speed of the current Cpu
176 * @return The available speed of the current Cpu
178 virtual double getAvailableSpeed();
181 * @brief Get the current Cpu power peak
183 * @return The current Cpu power peak
185 virtual double getCurrentPowerPeak();
188 virtual double getPowerPeakAt(int pstate_index)=0;
190 virtual int getNbPstates()=0;
192 virtual void setPstate(int pstate_index)=0;
193 virtual int getPstate()=0;
195 void setState(e_surf_resource_state_t state);
197 void addTraces(void);
199 double m_powerPeak; /*< CPU power peak */
200 double m_powerScale; /*< Percentage of CPU disponible */
202 /* Note (hypervisor): */
203 lmm_constraint_t *p_constraintCore;
204 void **p_constraintCoreId;
207 // Adrien - Oct 2015. Additional code related to VM energy extensions
209 1./ create a VirtualCpuModel that inherits from CpuModel or create
210 a VirtualCpuCas01Model that inherist from CpuCas01Model
211 => Question: not sure which one is really usefull :( The objective is to
212 be able to create a VirtualCpu instead of a Cpu (i.e. a CpuCas01 to be exact).
213 2. create VirtualCpu class that inherits from Cpu or create
214 a VirtualCpuCas01 class that inherits from CpuCas01 (same issue as the one described above).
215 Such modifications would enable us to remove the isVirtual method and
216 actually use the polymorphism feature of C++. It will also enable us
217 to overwrite the cpu_energy hashmap in energyCpuCreateCallBack instead of invoking
219 So to make a long story short, it will be cleaner from the software viewpoint
220 and patches welcome ;) - Adrien October 20 2015
225 * @brief Set the current Cpu as virtual or physical
227 * @param isVirtual true to indicate this Cpu is virtual, false otherwise
229 void setVirtual(Cpu *physCpu);
232 * @brief Learn if this Cpu is physical or virtual
234 * @return phys CPU if the current Cpu is a VM, null otherwise
236 Cpu* isVirtual(void);
238 // Adrien - Oct 2015. End of additional code related to VM energy extensions
246 /** @ingroup SURF_cpu_interface
247 * @brief SURF Cpu action interface class
248 * @details A CpuAction represent the execution of code on a Cpu
250 XBT_PUBLIC_CLASS CpuAction : public Action {
251 friend XBT_PUBLIC(Cpu*) getActionCpu(CpuAction *action);
254 * @brief CpuAction constructor
256 * @param model The CpuModel associated to this CpuAction
258 * @param failed [TODO]
260 CpuAction(Model *model, double cost, bool failed)
261 : Action(model, cost, failed) {} //FIXME:REMOVE
264 * @brief CpuAction constructor
266 * @param model The CpuModel associated to this CpuAction
268 * @param failed [TODO]
269 * @param var The lmm variable associated to this CpuAction if it is part of a LMM component
271 CpuAction(Model *model, double cost, bool failed, lmm_variable_t var)
272 : Action(model, cost, failed, var) {}
275 * @brief Set the affinity of the current CpuAction
281 virtual void setAffinity(Cpu *cpu, unsigned long mask);
283 void setState(e_surf_action_state_t state);
285 void updateRemainingLazy(double now);
289 #endif /* SURF_CPU_INTERFACE_HPP_ */