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 inherit from CpuCas01Model
211 => Question: not sure which one is really useful :( 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
224 /** @brief Specify the physical CPU of the current CPU (which is a vCPU) */
225 void setPhysicalCPU(Cpu *physCpu);
227 /** @brief Get the physical if the current one is a vCPU, or NULL if it's already a physical CPU */
228 Cpu* getPhysicalCPU(void);
230 // Adrien - Oct 2015. End of additional code related to VM energy extensions
238 /** @ingroup SURF_cpu_interface
239 * @brief SURF Cpu action interface class
240 * @details A CpuAction represent the execution of code on a Cpu
242 XBT_PUBLIC_CLASS CpuAction : public Action {
243 friend XBT_PUBLIC(Cpu*) getActionCpu(CpuAction *action);
246 * @brief CpuAction constructor
248 * @param model The CpuModel associated to this CpuAction
250 * @param failed [TODO]
252 CpuAction(Model *model, double cost, bool failed)
253 : Action(model, cost, failed) {} //FIXME:REMOVE
256 * @brief CpuAction constructor
258 * @param model The CpuModel associated to this CpuAction
260 * @param failed [TODO]
261 * @param var The lmm variable associated to this CpuAction if it is part of a LMM component
263 CpuAction(Model *model, double cost, bool failed, lmm_variable_t var)
264 : Action(model, cost, failed, var) {}
267 * @brief Set the affinity of the current CpuAction
273 virtual void setAffinity(Cpu *cpu, unsigned long mask);
275 void setState(e_surf_action_state_t state);
277 void updateRemainingLazy(double now);
281 #endif /* SURF_CPU_INTERFACE_HPP_ */