Moved function definitions to C file. Now we won't have linker problems when these...
[charm.git] / examples / bigsim / tools / rewritelog / traceBigSim / traceBigSim.C
1 #include "charm++.h"
2 #include "traceBigSim.h"
3 #include <stdio.h>
4 #include <stdarg.h>
5
6
7 //======================PAPI======================= 
8 //#define BIG_SIM_PAPI
9 #ifdef BIG_SIM_PAPI
10 #include <papi.h>
11 #define NUM_PAPI_EVENTS 9
12 #define BIGSIM_PAPI
13 #endif
14
15
16 FILE* bgfp;
17 unsigned long bgTraceCounter;
18 int errorcode; 
19 int events[NUM_PAPI_EVENTS];
20 long long values[NUM_PAPI_EVENTS]; 
21 char errorstring[PAPI_MAX_STR_LEN+1]; 
22 double startTime;
23 bool insideTraceBracket;
24
25 CkpvDeclare(bool, insideTraceBracket);
26
27 void initBigSimTrace()
28 {
29   bgTraceCounter = 0;
30   insideTraceBracket = false;
31
32 #ifdef CMK_BLUEGENE_CHARM
33   //   for bigsim emulation, write to files, one for each processor
34   char fname[128];
35   sprintf(fname, "param.%d", CkMyPe());
36   CkpvAccess(bgfp) = fopen(fname, "w");
37   if ((bgfp) == NULL) 
38     CmiAbort("Failed to generated trace param file!");
39 #else
40   //   for Mambo simulation, write to screen for now
41   (bgfp) = stdout;
42 #endif
43
44
45 #ifdef BIG_SIM_PAPI
46         CkPrintf("PAPI: number of available counters: %d\n", PAPI_num_counters());
47         CkAssert(PAPI_num_counters() >= 0);
48 #endif
49
50 }
51
52 void finalizeBigSimTrace()
53 {
54 #ifdef CMK_BLUEGENE_CHARM
55   fclose((bgfp));
56 #endif  
57 }
58
59
60
61
62
63
64 void startTraceBigSim(){
65
66   CkAssert((insideTraceBracket) == false);
67   (insideTraceBracket) = true;
68
69 #if SPLIT_APART_CYCLE_ACCURATE
70   SimParameters *simParams = Node::Object()->simParameters;
71   if(simParams->bgSplitNumProcs != -1 && simParams->bgSplitMyProc!=-1){
72         if( ((bgTraceCounter) % simParams->bgSplitNumProcs) == simParams->bgSplitMyProc){
73           // Do slow mambo simulation for this case!
74           CkPrintf("TRACEBIGSIM: Doing cycle accurate simulation for interesting event #%lu\n", (bgTraceCounter) );
75         }
76         (bgTraceCounter) ++;
77   }
78 #endif  
79
80         startTime = CmiWallTimer();
81
82 #ifdef BIGSIM_PAPI
83
84         for(int i=0;i<NUM_PAPI_EVENTS;i++)
85                 values[i] = 0;
86
87         events[0] = PAPI_FP_OPS;
88         events[1] = PAPI_TOT_INS;
89         events[2] = PAPI_L1_ICM;
90         events[3] = PAPI_L2_TCM;
91         events[4] = PAPI_L3_TCM;
92         events[5] = PAPI_TLB_TL;
93         events[6] = PAPI_LD_INS;
94         events[7] = PAPI_SR_INS; // store instructions
95         events[8] = PAPI_RES_STL; // resource stalls
96
97 /* Other available events:
98                                         PAPI_BR_INS,
99                                         PAPI_BR_MSP,
100                                         PAPI_FP_INS,
101                                         PAPI_TOT_INS,
102                                         PAPI_TOT_IIS,
103                                         PAPI_L1_DCM,
104                                         PAPI_L1_LDM,
105                                         PAPI_L2_TCM,
106                                         PAPI_L3_LDM,
107                                         PAPI_RES_STL,
108                                         PAPI_LD_INS,
109                                         PAPI_TLB_TL  
110 */
111
112         CkAssert(PAPI_start_counters(events, NUM_PAPI_EVENTS) == PAPI_OK);
113
114 #endif
115   
116 }
117   
118
119
120 void endTraceBigSim_20param(char * eventname, int num_params, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 , double p18 , double p19 , double p20 ) {
121
122     CkAssert((insideTraceBracket) == true);
123     (insideTraceBracket) = false;
124
125     char perfCountString[1024]; 
126     perfCountString[0] = 0; 
127  
128         char params[2048];
129
130 if(num_params==0) sprintf(params, "");
131 if(num_params==1) sprintf(params, "%f", p1);
132 if(num_params==2) sprintf(params, "%f %f", p1, p2);
133 if(num_params==3) sprintf(params, "%f %f %f", p1, p2, p3);
134 if(num_params==4) sprintf(params, "%f %f %f %f", p1, p2, p3, p4);
135 if(num_params==5) sprintf(params, "%f %f %f %f %f", p1, p2, p3, p4, p5);
136 if(num_params==6) sprintf(params, "%f %f %f %f %f %f", p1, p2, p3, p4, p5, p6);
137 if(num_params==7) sprintf(params, "%f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7);
138 if(num_params==8) sprintf(params, "%f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8);
139 if(num_params==9) sprintf(params, "%f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9);
140 if(num_params==10) sprintf(params, "%f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
141 if(num_params==11) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
142 if(num_params==12) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);
143 if(num_params==13) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13);
144 if(num_params==14) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14);
145 if(num_params==15) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15);
146 if(num_params==16) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16);
147 if(num_params==17) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17);
148 if(num_params==18) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18);
149 if(num_params==19) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19);
150 if(num_params==20) sprintf(params, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20);
151
152         char paramString[2048];
153         
154         sprintf(paramString, "params:{ %s }", params);
155         
156
157  
158 #ifdef BIGSIM_PAPI
159         CkAssert(PAPI_stop_counters(values, NUM_PAPI_EVENTS) == PAPI_OK); 
160
161         sprintf(perfCountString, " PAPI:{ " ); 
162
163         for(int i=0;i<NUM_PAPI_EVENTS;i++){
164                 sprintf(perfCountString+strlen(perfCountString), " %lld ", values[i] );
165         }
166
167
168          printf("value=%lld\n", values[0]);
169
170          sprintf(perfCountString+strlen(perfCountString), " }");
171         
172
173 #endif
174         double endTime = CmiWallTimer();
175  
176   char timeString[256];
177   sprintf(timeString, "time:{ %f }", endTime-startTime);
178
179
180 #if SPLIT_APART_CYCLE_ACCURATE
181   SimParameters *simParams = Node::Object()->simParameters;
182           if(simParams->bgSplitNumProcs != -1 && simParams->bgSplitMyProc!=-1){
183         if( ((bgTraceCounter) % simParams->bgSplitNumProcs) == simParams->bgSplitMyProc){
184           // Do slow mambo simulation for this case!
185           // Counter is incremented only in startTraceBigSim()
186         }
187   }
188 #endif
189
190
191
192   char sequenceString[1024];
193   sequenceString[0] = 0;
194 #ifdef CMK_BLUEGENE_CHARM
195   sprintf();
196
197   BgPrint("endTraceBigSim %f\n");
198   // write event ID
199   int seqno = tTIMELINEREC.length()-1;
200   //  fprintf((bgfp),"%d ",seqno);
201   sprintf(sequenceString, "seqno: { %d } ",seqno);
202
203 #endif
204 //  fprintf((bgfp),"%s\n",params);
205
206   
207 #ifdef CMK_BLUEGENE_CHARM
208   printf((bgfp), "TRACEBIGSIM: event:{ %s } %s %s %s %s\n", eventname, sequenceString, timeString, perfCountString, paramString);
209 #else
210   printf("TRACEBIGSIM: event:{ %s } %s %s %s %s\n", eventname, sequenceString, timeString, perfCountString, paramString);  
211 #endif
212
213
214 }
215
216
217
218
219
220 /** 
221         startTraceBigSim() begins tracing an event with a specified set of parameters. These are convenience
222         aliases so that a user can easily add/remove parameters while testing their application.
223         Up to 20 parameters can be specified. These just call through to startTraceBigSim_20param().
224 */
225 void endTraceBigSim( char * eventName ){endTraceBigSim_20param( eventName, 0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
226 void endTraceBigSim( char * eventName , double p1 ){endTraceBigSim_20param( eventName, 1 , p1 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
227 void endTraceBigSim( char * eventName , double p1 , double p2 ){endTraceBigSim_20param( eventName, 2 , p1 , p2 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
228 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 ){endTraceBigSim_20param( eventName, 3 , p1 , p2 , p3 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
229 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 ){endTraceBigSim_20param( eventName, 4 , p1 , p2 , p3 , p4 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
230 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 ){endTraceBigSim_20param( eventName, 5 , p1 , p2 , p3 , p4 , p5 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
231 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 ){endTraceBigSim_20param( eventName, 6 , p1 , p2 , p3 , p4 , p5 , p6 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
232 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 ){endTraceBigSim_20param( eventName, 7 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
233 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 ){endTraceBigSim_20param( eventName, 8 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
234 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 ){endTraceBigSim_20param( eventName, 9 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
235 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 ){endTraceBigSim_20param( eventName, 10 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
236 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 ){endTraceBigSim_20param( eventName, 11 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
237 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 ){endTraceBigSim_20param( eventName, 12 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
238 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 ){endTraceBigSim_20param( eventName, 13 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
239 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 ){endTraceBigSim_20param( eventName, 14 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
240 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 ){endTraceBigSim_20param( eventName, 15 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 );}
241 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 ){endTraceBigSim_20param( eventName, 16 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , 0.0 , 0.0 , 0.0 , 0.0 );}
242 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 ){endTraceBigSim_20param( eventName, 17 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , 0.0 , 0.0 , 0.0 );}
243 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 , double p18 ){endTraceBigSim_20param( eventName, 18 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , p18 , 0.0 , 0.0 );}
244 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 , double p18 , double p19 ){endTraceBigSim_20param( eventName, 19 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , p18 , p19 , 0.0 );}
245 void endTraceBigSim( char * eventName , double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 , double p11 , double p12 , double p13 , double p14 , double p15 , double p16 , double p17 , double p18 , double p19 , double p20 ){endTraceBigSim_20param( eventName, 20 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , p18 , p19 , p20 );}