1 #ifndef TRACE__AUTOPERF__H__
2 #define TRACE__AUTOPERF__H__
5 #include "picstreenode.h"
6 #include "picsdecisiontree.h"
7 #include "picsautoperfAPI.h"
13 #include "trace-common.h"
14 #include "TraceAutoPerf.decl.h"
15 #include "trace-projections.h"
24 CkpvExtern(int, numOfPhases
);
25 class SavedPerfDatabase
;
26 CkpvExtern(SavedPerfDatabase
*, perfDatabase
);
27 CkpvExtern(DecisionTree
*, learnTree
);
28 CkpvExtern(int, perfGoal
);
30 //scalable tree analysis
31 CkpvExtern(int, myParent
);
32 CkpvExtern(int, myInterGroupParent
);
33 CkpvExtern(int, numChildren
);
36 extern CkGroupID traceAutoPerfGID
;
37 extern CProxy_TraceAutoPerfBOC autoPerfProxy
;
38 extern int treeBranchFactor
;
40 extern int treeGroupSize
;
43 * raw performance summary data
47 double data
[NUM_NODES
];
50 double utilPercentage
;
51 double overheadPercentage
;
52 double idlePercentage
;
57 PerfData(double step
, double util
, double idle
, double overhead
)
60 idlePercentage
= idle
;
61 overheadPercentage
= overhead
;
62 utilPercentage
= util
;
65 void copy(PerfData
*src
)
67 timeStep
= src
->timeStep
;
69 utilPercentage
= src
->utilPercentage
;
70 overheadPercentage
= src
->overheadPercentage
;
71 idlePercentage
= src
->idlePercentage
;
72 userMetrics
= src
->userMetrics
;
75 void printMe(FILE *fp
, const char *str
) {
76 for(int i
=0; i
<NUM_NODES
; i
++)
78 if (i
== AVG_IdlePercentage
|| i
== AVG_OverheadPercentage
||
79 i
==AVG_UtilizationPercentage
|| i
==AVG_AppPercentage
||
80 i
== MAX_IdlePercentage
|| i
== MAX_OverheadPercentage
||
81 i
== MAX_UtilizationPercentage
|| i
== MAX_AppPercentage
||
82 i
== MIN_IdlePercentage
|| i
== MIN_OverheadPercentage
||
83 i
== MIN_UtilizationPercentage
)
84 fprintf(fp
, "%d %s %.1f\n", i
, FieldName
[i
], 100*data
[i
]);
86 fprintf(fp
, "%d %s %f\n", i
, FieldName
[i
], data
[i
]);
92 * a set of history performance summary data
94 template <class DataType
> class Database
{
96 std::vector
<DataType
> array
;
102 prevIdx
= curIdx
= -1;
104 for(int i
=0; i
<array
.size(); i
++)
109 prevIdx
= curIdx
= -1;
113 DataType
add(DataType source
) {
116 curIdx
= (curIdx
+1)%array
.size();
117 oldData
= array
[curIdx
];
118 array
[curIdx
] = source
;
125 DataType
getCurrent() {
126 return array
[curIdx
];
129 DataType
getPrevious() {
130 return array
[prevIdx
];
133 //relative position index
134 DataType
getData(int index
) {
135 int i
= (curIdx
+index
+array
.size())%array
.size();
141 CkpvExtern(Database
<CkReductionMsg
*>*, summaryPerfDatabase
);
142 #define ENTRIES_SAVED 10
143 class SavedPerfDatabase
{
145 PerfData
*perfList
[ENTRIES_SAVED
];
146 PerfData
*best
, *secondbest
;
149 int curIdx
; //current available
153 SavedPerfDatabase(void) ;
154 ~SavedPerfDatabase(void);
155 void advanceStep(void);
156 PerfData
* getCurrentPerfData(void);
157 PerfData
* getPrevPerfData(void);
159 void setUserDefinedMetrics(double v
) { perfList
[curIdx
]->userMetrics
= v
; }
160 void setPhase(int phaseId
) { currentPhase
= phaseId
; }
161 void endCurrent(void) ;
162 void copyData(PerfData
*source
, int num
); //copy data from source
163 void setData(PerfData
*source
);
164 bool timeStepLonger() { return true;}
165 double getCurrentTimestepDuration() { return perfList
[curIdx
]->timeStep
; }
166 double getTimestepRatio() { return perfList
[curIdx
]->timeStep
/perfList
[prevIdx
]->timeStep
; }
167 double getUtilRatio() { return perfList
[curIdx
]->utilPercentage
/perfList
[prevIdx
]->utilPercentage
; }
168 double getEnergyRatio() { return 0; }
169 double getCurrentIdlePercentage() { return perfList
[curIdx
]->idlePercentage
; }
170 double getPreviousIdlePercentage() { return perfList
[prevIdx
]->idlePercentage
; }
171 double getIdleRatio() { return perfList
[curIdx
]->idlePercentage
/perfList
[prevIdx
]->idlePercentage
; }
172 double getCurrentOverheadPercentage() { return perfList
[curIdx
]->overheadPercentage
; }
173 double getPreviousOverheadPercentage() { return perfList
[prevIdx
]->overheadPercentage
; }
174 double getOverheadRatio() { return perfList
[curIdx
]->overheadPercentage
/perfList
[prevIdx
]->overheadPercentage
; }
177 class TraceAutoPerfInit
: public Chare
{
179 TraceAutoPerfInit(CkArgMsg
*);
180 TraceAutoPerfInit(CkMigrateMessage
*m
):Chare(m
) {}
184 * class to perform collection, analysis
186 class TraceAutoPerfBOC
: public CBase_TraceAutoPerfBOC
{
188 int numPesCollection
;
191 CkReductionMsg
*redMsg
;
197 double currentTimeStep
;
203 double lastCriticalPathLength
;
204 double lastAnalyzeTimer
;
206 std::vector
<IntDoubleMap
> solutions
;
207 std::vector
<Condition
*> perfProblems
;
208 std::vector
<int> problemProcList
;
209 DecisionTree
* priorityTree
;
210 DecisionTree
* fuzzyTree
;
216 double startLdbTimer
;
221 TraceAutoPerfBOC(CkMigrateMessage
*m
) : CBase_TraceAutoPerfBOC(m
) {};
224 void pup(PUP::er
&p
) {
225 CBase_TraceAutoPerfBOC::pup(p
);
227 void registerPerfGoal(int goalIndex
);
228 void setUserDefinedGoal(double value
);
229 void setAutoPerfDoneCallback(CkCallback cb
);
230 static void staticAtSync(void *data
);
233 void resume(CkCallback cb
);
234 void startPhase(int phaseId
);
237 void endStep(bool fromGlobal
, int pe
, int incSteps
);
238 void endPhaseAndStep(bool fromGlobal
, int pe
);
239 void endStepResumeCb(bool fromGlobal
, int pe
, CkCallback cb
);
240 void getPerfData(int reductionPE
, CkCallback cb
);
241 void run(bool fromGlobal
, int fromPE
);
242 void setCbAndRun(bool fromGlobal
, int fromPE
, CkCallback cb
) ;
243 void PICS_markLDBStart(int appStep
) ;
244 void PICS_markLDBEnd() ;
246 void setNumOfPhases(int num
, const char names
[]);
247 void setProjectionsOutput();
248 void recvGlobalSummary(CkReductionMsg
*msg
);
252 //scalable analysis, global decision making
253 void globalDecision(double metrics
, int source
);
254 void analyzeAndTune();
255 void startTimeNextStep();
256 void gatherSummary(CkReductionMsg
*msg
);
257 void globalPerfAnalyze(CkReductionMsg
*msg
);
259 void formatPerfData(PerfData
*data
, int step
, int phase
);
260 void analyzePerfData(PerfData
*data
, int step
, int phase
);
262 void comparePerfData(PerfData
*prevData
, PerfData
*data
, int step
, int phase
);
264 double getModelNetworkTime(int msgs
, long bytes
) ;
266 inline bool isCurrentBest() {
270 inline void setCurrentBest(bool b
) {
274 inline double getCurrentBestRatio() {
275 return currentTimeStep
/bestTimeStep
;
279 class ObjIdentifier
{
283 ObjIdentifier(void *p
) {
287 ObjIdentifier(int a
, int i
, void *p
) {
299 ObjInfo(double e
, long mc
, long ms
) {
308 bool operator () (const void *x
, const void *y
) const {
313 typedef std::map
<void*, ObjInfo
*, compare
> ObjectLoadMap_t
;
316 void setCollectionMode(int m
) ;
317 void setEvaluationMode(int m
) ;
318 void setConfigMode(int m
) ;