Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
API format unification
[simgrid.git] / src / surf / cpu_interface.hpp
1 /* Copyright (c) 2004-2015. The SimGrid Team.
2  * All rights reserved.                                                     */
3
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. */
6
7 #include <list>
8
9 #include <xbt/base.h>
10 #include <xbt/signal.hpp>
11
12 #include <simgrid/forward.h>
13 #include <simgrid/s4u/host.hpp>
14
15 #include "surf/datatypes.h"
16 #include "surf_interface.hpp"
17 #include "maxmin_private.hpp"
18 #include "trace_mgr.hpp"
19
20 #ifndef SURF_CPU_INTERFACE_HPP_
21 #define SURF_CPU_INTERFACE_HPP_
22
23 /***********
24  * Classes *
25  ***********/
26
27 namespace simgrid {
28 namespace surf {
29
30 class CpuModel;
31 class Cpu;
32 class CpuAction;
33
34  /** @ingroup SURF_cpu_interface
35  * @brief SURF cpu model interface class
36  * @details A model is an object which handle the interactions between its Resources and its Actions
37  */
38 XBT_PUBLIC_CLASS CpuModel : public Model {
39 public:
40   CpuModel() : Model() {};
41   ~CpuModel() = default;
42
43   /**
44    * @brief Create a Cpu
45    *
46    * @param host The host that will have this CPU
47    * @param speedPerPstate Processor speed (in Flops) of each pstate. This ignores any potential external load coming from a trace.
48    * @param core The number of core of this Cpu
49    */
50   virtual Cpu *createCpu(simgrid::s4u::Host *host, std::vector<double> *speedPerPstate, int core)=0;
51
52   void updateActionsStateLazy(double now, double delta) override;
53   void updateActionsStateFull(double now, double delta) override;
54 };
55
56 /************
57  * Resource *
58  ************/
59
60 /** @ingroup SURF_cpu_interface
61 * @brief SURF cpu resource interface class
62 * @details A Cpu represent a cpu associated to a host
63 */
64 XBT_PUBLIC_CLASS Cpu : public simgrid::surf::Resource {
65 public:
66   /**
67    * @brief Cpu constructor
68    *
69    * @param model The CpuModel associated to this Cpu
70    * @param host The host in which this Cpu should be plugged
71    * @param constraint The lmm constraint associated to this Cpu if it is part of a LMM component
72    * @param speedPerPstate Processor speed (in flop per second) for each pstate
73    * @param core The number of core of this Cpu
74    */
75   Cpu(simgrid::surf::Model *model, simgrid::s4u::Host *host, lmm_constraint_t constraint,
76       std::vector<double> *speedPerPstate, int core);
77
78   /**
79    * @brief Cpu constructor
80    *
81    * @param model The CpuModel associated to this Cpu
82    * @param host The host in which this Cpu should be plugged
83    * @param speedPerPstate Processor speed (in flop per second) for each pstate
84    * @param core The number of core of this Cpu
85    */
86   Cpu(simgrid::surf::Model *model, simgrid::s4u::Host *host, std::vector<double> *speedPerPstate, int core);
87
88   ~Cpu();
89
90   /**
91    * @brief Execute some quantity of computation
92    *
93    * @param size The value of the processing amount (in flop) needed to process
94    * @return The CpuAction corresponding to the processing
95    */
96   virtual simgrid::surf::Action *execution_start(double size)=0;
97
98   /**
99    * @brief Make a process sleep for duration (in seconds)
100    *
101    * @param duration The number of seconds to sleep
102    * @return The CpuAction corresponding to the sleeping
103    */
104   virtual simgrid::surf::Action *sleep(double duration)=0;
105
106   /** @brief Get the amount of cores */
107   virtual int coreCount();
108
109   /** @brief Get the speed, accounting for the trace load and provided process load instead of the real current one */
110   virtual double getSpeed(double load);
111
112 protected:
113   /** @brief Take speed changes (either load or max) into account */
114   virtual void onSpeedChange();
115
116 public:
117   /** @brief Get the available speed of the current Cpu */
118   virtual double getAvailableSpeed();
119
120   /** @brief Get the current Cpu computational speed */
121   virtual double getPstateSpeedCurrent();
122   virtual double getPstateSpeed(int pstate_index);
123
124   virtual int getNbPStates();
125   virtual void setPState(int pstate_index);
126   virtual int  getPState();
127
128   simgrid::s4u::Host* getHost() { return host_; }
129
130 public:
131   int coresAmount_ = 1;
132   simgrid::s4u::Host* host_;
133
134   std::vector<double> speedPerPstate_; /*< List of supported CPU capacities (pstate related) */
135   int pstate_ = 0;                     /*< Current pstate (index in the speedPeakList)*/
136
137 public:
138   virtual void setStateTrace(tmgr_trace_t trace); /*< setup the trace file with states events (ON or OFF). Trace must contain boolean values (0 or 1). */
139   virtual void setSpeedTrace(tmgr_trace_t trace); /*< setup the trace file with availability events (peak speed changes due to external load). Trace must contain relative values (ratio between 0 and 1) */
140
141   tmgr_trace_iterator_t stateEvent_ = nullptr;
142   s_surf_metric_t speed_ = {1.0, 0, nullptr};
143 };
144
145 /**********
146  * Action *
147  **********/
148
149  /** @ingroup SURF_cpu_interface
150  * @brief A CpuAction represents the execution of code on one or several Cpus
151  */
152 XBT_PUBLIC_CLASS CpuAction : public simgrid::surf::Action {
153 friend XBT_PUBLIC(Cpu*) getActionCpu(CpuAction *action);
154 public:
155 /** @brief Signal emitted when the action state changes (ready/running/done, etc)
156  *  Signature: `void(CpuAction *action, simgrid::surf::Action::State previous)`
157  */
158 static simgrid::xbt::signal<void(simgrid::surf::CpuAction*, simgrid::surf::Action::State)> onStateChange;
159 /** @brief Signal emitted when the action share changes (amount of flops it gets)
160  *  Signature: `void(CpuAction *action)`
161  */
162 static simgrid::xbt::signal<void(simgrid::surf::CpuAction*)> onShareChange;
163
164   CpuAction(simgrid::surf::Model *model, double cost, bool failed)
165   : Action(model, cost, failed) {}
166   CpuAction(simgrid::surf::Model *model, double cost, bool failed, lmm_variable_t var)
167   : Action(model, cost, failed, var) {}
168
169   void setState(simgrid::surf::Action::State state) override;
170
171   void updateRemainingLazy(double now) override;
172   std::list<Cpu*> cpus();
173 };
174
175 }
176 }
177
178 #endif /* SURF_CPU_INTERFACE_HPP_ */