Improving performance data gathering & recording for control point framework.
[charm.git] / src / ck-perf / trace-controlPoints.h
1 #ifndef _VERBOSE_H
2 #define _VERBOSE_H
3
4 #include <stdio.h>
5 #include <errno.h>
6
7 #include "trace.h"
8 #include "envelope.h"
9 #include "register.h"
10 #include "trace-common.h"
11
12 /**
13  *   \addtogroup ControlPointFramework
14  *   @{
15  */
16
17
18 /**
19  *    An instrumentation module making use of
20  *    the tracing framework hooks provided in Charm++. It is used 
21  *    by the control point framework to monitor idle time.
22  *
23  *  Only the more common hooks are listened to in this module.
24  */
25 class TraceControlPoints : public Trace {
26  private:
27
28   double lastBeginExecuteTime;
29   int lastbeginMessageSize;
30
31   /** The start of the idle region */
32   double lastBeginIdle;
33   
34   /** The amount of time spent executing entry methods since we last reset the counters */
35   double totalEntryMethodTime;
36
37   /** The amount of time spent idle since we last reset the counters */
38   double totalIdleTime;
39
40   /** The highest seen memory usage  since we last reset the counters */
41   double memUsage;
42
43   /** The number of entry method invocations since we last reset the counters */
44   long totalEntryMethodInvocations;
45
46     
47   /** The time we last rest the counters */
48   double lastResetTime;
49
50  public: 
51   int b1, b2, b3;
52   long b2mlen;
53   long b3mlen;
54
55  public:
56   TraceControlPoints(char **argv);
57   
58   // a user event has just occured
59   void userEvent(int eventID);
60   // a pair of begin/end user event has just occured
61   void userBracketEvent(int eventID, double bt, double et);
62   
63   // "creation" of message(s) - message Sends
64   void creation(envelope *, int epIdx, int num=1);
65   void creationMulticast(envelope *, int epIdx, int num=1, int *pelist=NULL);
66   void creationDone(int num=1);
67   
68   void messageRecv(char *env, int pe);
69   
70   // **************************************************************
71   // begin/end execution of a Charm++ entry point
72   // NOTE: begin/endPack and begin/endUnpack can be called in between
73   //       a beginExecute and its corresponding endExecute.
74   void beginExecute(envelope *);
75   void beginExecute(CmiObjId *tid);
76   void beginExecute(
77                     int event,   // event type defined in trace-common.h
78                     int msgType, // message type
79                     int ep,      // Charm++ entry point id
80                     int srcPe,   // Which PE originated the call
81                     int ml,      // message size
82                     CmiObjId* idx);    // index
83   void endExecute(void);
84   
85   // begin/end idle time for this pe
86   void beginIdle(double curWallTime);
87   void endIdle(double curWallTime);
88   
89   // begin/end of execution
90   void beginComputation(void);
91   void endComputation(void);
92   
93   /* Memory tracing */
94   void malloc(void *where, int size, void **stack, int stackSize);
95   void free(void *where, int size);
96   
97   // do any clean-up necessary for tracing
98   void traceClose();
99
100
101   // ==================================================================
102   // The following methods are not required for a tracing module
103
104   /** reset the idle time and entry method execution time accumulators */
105   void resetTimings();
106
107   /** Reset the idle, overhead, and memory measurements */
108   void resetAll();
109
110   /** Fraction of the time spent idle since resetting the counters */
111   double idleRatio(){
112     double t = CmiWallTimer() - lastResetTime;
113     return (totalIdleTime) / t;
114   }
115
116   /** Fraction of time spent as overhead since resetting the counters */
117   double overheadRatio(){
118     double t = CmiWallTimer() - lastResetTime;
119     return (t - totalIdleTime - totalEntryMethodTime) / t;
120   }
121
122   /** Highest memory usage (in MB) value we've seen since resetting the counters */
123   double memoryUsageMB(){
124     return ((double)memUsage) / 1024.0 / 1024.0;
125   }
126
127   /** Determine the average grain size since last reset of counters */
128   double grainSize(){
129     return (double)totalEntryMethodTime / totalEntryMethodInvocations;
130   }
131
132   double bytesPerEntry() {
133     return (double)(b2mlen + b3mlen) / (double)(b2+b3);
134   }
135
136
137 };
138
139
140 TraceControlPoints *localControlPointTracingInstance();
141
142
143 /*! @} */
144 #endif
145