Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge s4u wait_any
[simgrid.git] / src / surf / cpu_ti.hpp
1 /* Copyright (c) 2013-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 <boost/intrusive/list.hpp>
8
9 #include <xbt/base.h>
10
11 #include "src/surf/cpu_interface.hpp"
12 #include "src/surf/trace_mgr.hpp"
13 #include "surf/surf_routing.h"
14
15 /* Epsilon */
16 #define EPSILON 0.000000001
17
18 namespace simgrid {
19 namespace surf {
20
21 /***********
22  * Classes *
23  ***********/
24 class XBT_PRIVATE CpuTiTrace;
25 class XBT_PRIVATE CpuTiTgmr;
26 class XBT_PRIVATE CpuTiModel;
27 class XBT_PRIVATE CpuTi;
28 class XBT_PRIVATE CpuTiAction;
29
30 struct tiTag;
31
32 /*********
33  * Trace *
34  *********/
35 class CpuTiTrace {
36 public:
37   explicit CpuTiTrace(tmgr_trace_t speedTrace);
38   ~CpuTiTrace();
39
40   double integrateSimple(double a, double b);
41   double integrateSimplePoint(double a);
42   double solveSimple(double a, double amount);
43
44   double *timePoints_;
45   double *integral_;
46   int nbPoints_;
47   int binarySearch(double *array, double a, int low, int high);
48 };
49
50 enum trace_type {
51
52   TRACE_FIXED,                /*< Trace fixed, no availability file */
53   TRACE_DYNAMIC               /*< Dynamic, have an availability file */
54 };
55
56 class CpuTiTgmr {
57 public:
58   CpuTiTgmr(trace_type type, double value)
59     : type_(type), value_(value)
60   {};
61   CpuTiTgmr(tmgr_trace_t speedTrace, double value);
62   ~CpuTiTgmr();
63
64   double integrate(double a, double b);
65   double solve(double a, double amount);
66   double solveSomewhatSimple(double a, double amount);
67   double getPowerScale(double a);
68
69   trace_type type_;
70   double value_;                 /*< Percentage of cpu speed available. Value fixed between 0 and 1 */
71
72   /* Dynamic */
73   double lastTime_ = 0.0;             /*< Integral interval last point (discrete time) */
74   double total_    = 0.0;             /*< Integral total between 0 and last_pointn */
75
76   CpuTiTrace *trace_ = nullptr;
77   tmgr_trace_t speedTrace_ = nullptr;
78 };
79
80 /**********
81  * Action *
82  **********/
83
84 class CpuTiAction: public CpuAction {
85   friend class CpuTi;
86 public:
87   CpuTiAction(CpuTiModel *model, double cost, bool failed, CpuTi *cpu);
88
89   void setState(simgrid::surf::Action::State state) override;
90   int unref() override;
91   void cancel() override;
92   void updateIndexHeap(int i);
93   void suspend() override;
94   void resume() override;
95   void setMaxDuration(double duration) override;
96   void setPriority(double priority) override;
97   double getRemains() override;
98   void setAffinity(Cpu * /*cpu*/, unsigned long /*mask*/) override {};
99
100   CpuTi *cpu_;
101   int indexHeap_;
102   int suspended_ = 0;
103 public:
104   boost::intrusive::list_member_hook<> action_ti_hook;
105 };
106
107 typedef boost::intrusive::member_hook<CpuTiAction, boost::intrusive::list_member_hook<>, &CpuTiAction::action_ti_hook> ActionTiListOptions;
108 typedef boost::intrusive::list<CpuTiAction, ActionTiListOptions > ActionTiList;
109
110 /************
111  * Resource *
112  ************/
113 class CpuTi : public Cpu {
114 public:
115   CpuTi(CpuTiModel *model, simgrid::s4u::Host *host, xbt_dynar_t speedPerPstate, int core);
116   ~CpuTi() override;
117
118   void setSpeedTrace(tmgr_trace_t trace) override;
119
120   void apply_event(tmgr_trace_iterator_t event, double value) override;
121   void updateActionsFinishTime(double now);
122   void updateRemainingAmount(double now);
123
124   bool isUsed() override;
125   CpuAction *execution_start(double size) override;
126   CpuAction *sleep(double duration) override;
127   double getAvailableSpeed() override;
128
129   void modified(bool modified);
130
131   CpuTiTgmr *speedIntegratedTrace_ = nullptr;/*< Structure with data needed to integrate trace file */
132   ActionTiList *actionSet_ = nullptr;        /*< set with all actions running on cpu */
133   double sumPriority_ = 0; /*< the sum of actions' priority that are running on cpu */
134   double lastUpdate_ = 0;  /*< last update of actions' remaining amount done */
135
136   double currentFrequency_;
137
138 public:
139   boost::intrusive::list_member_hook<> cpu_ti_hook;
140 };
141
142 typedef boost::intrusive::member_hook<CpuTi, boost::intrusive::list_member_hook<>, &CpuTi::cpu_ti_hook> CpuTiListOptions;
143 typedef boost::intrusive::list<CpuTi, CpuTiListOptions> CpuTiList;
144
145 /*********
146  * Model *
147  *********/
148 class CpuTiModel : public CpuModel {
149 public:
150   CpuTiModel();
151   ~CpuTiModel() override;
152   Cpu *createCpu(simgrid::s4u::Host *host,  xbt_dynar_t speedPerPstate, int core) override;
153   double next_occuring_event(double now) override;
154   void updateActionsState(double now, double delta) override;
155
156   ActionList *runningActionSetThatDoesNotNeedBeingChecked_;
157   CpuTiList *modifiedCpu_;
158   xbt_heap_t tiActionHeap_;
159
160 protected:
161   void NotifyResourceTurnedOn(simgrid::surf::Resource*){};
162   void NotifyResourceTurnedOff(simgrid::surf::Resource*){};
163
164   void NotifyActionCancel(Action*){};
165   void NotifyActionResume(Action*){};
166   void NotifyActionSuspend(Action*){};
167 };
168
169 }
170 }