00001 #include "charm++.h"
00002 #include "cktiming.h"
00003 #include <stdio.h>
00004 #include <stdarg.h>
00005 #include <vector>
00006
00007
00008
00009
00010
00011
00012
00013
00014 #undef WITH_MAMBO
00015 #undef SPLIT_APART_CYCLE_ACCURATE
00016
00017
00018 #if WITH_MAMBO
00019 #include "mambo.h"
00020 static uint64_t start_time, end_time;
00021 #else
00022 CkpvStaticDeclare(double, start_time);
00023 CkpvStaticDeclare(double, end_time);
00024 #endif
00025
00026 CkpvDeclare(FILE*, bgfp);
00027
00028 CkpvDeclare(int, outputParameters);
00029
00030
00031
00032
00033
00034
00035 #ifdef BIG_SIM_PAPI
00036 #include <papi.h>
00037 #define NUM_PAPI_EVENTS 9
00038 #define BIGSIM_PAPI
00039
00040 int errorcode;
00041 int events[NUM_PAPI_EVENTS];
00042 long long values[NUM_PAPI_EVENTS];
00043 char errorstring[PAPI_MAX_STR_LEN+1];
00044 #endif
00045
00046 unsigned long bgTraceCounter;
00047 double startTime;
00048
00049 CkpvStaticDeclare(bool, insideTraceBracket);
00050
00051 class StringPool {
00052 std::vector<char *> events;
00053 int dumped;
00054 public:
00055 StringPool(): dumped(0) {}
00056 void dump() {
00057 char fname[128];
00058 const char *subdir = "params";
00059 if (dumped) return;
00060 CmiMkdir(subdir);
00061 sprintf(fname, "%s/param.%d", subdir, CkMyPe());
00062 FILE *fp = fopen(fname, "w");
00063 if (fp == NULL)
00064 CmiAbort("Failed to generated trace param file!");
00065
00066 for (int i=0; i<events.size(); i++)
00067 fprintf(fp, "%s", events[i]);
00068 fclose(fp);
00069 dumped = 1;
00070 }
00071 void insert(char *e) {
00072 events.push_back(strdup(e));
00073 }
00074 };
00075
00076 CkpvStaticDeclare(StringPool, eventsPool);
00077
00078 #ifdef CMK_BIGSIM_CHARM
00079 static int outputTiming = 0;
00080 #endif
00081
00082
00083 extern "C"
00084 void initBigSimTrace(int outputParams, int _outputTiming)
00085 {
00086 CkpvInitialize(int, outputParameters);
00087 CkpvAccess(outputParameters) = outputParams;
00088
00089 bgTraceCounter = 0;
00090 #ifdef CMK_BIGSIM_CHARM
00091 if (!BgIsReplay()) outputTiming = 0;
00092 outputTiming = _outputTiming;
00093 #endif
00094 CkpvInitialize(bool, insideTraceBracket);
00095 CkpvAccess(insideTraceBracket) = false;
00096
00097 CkpvInitialize(double, start_time);
00098 CkpvInitialize(double, end_time);
00099
00100 CkpvInitialize(FILE*, bgfp);
00101 CkpvAccess(bgfp) = NULL;
00102 #ifdef CMK_BIGSIM_CHARM
00103
00104
00105 if (!outputTiming) {
00106 char fname[128];
00107 const char *subdir = "params";
00108 CmiMkdir(subdir);
00109 sprintf(fname, "%s/param.%d", subdir, CkMyPe());
00110 CkpvAccess(bgfp) = fopen(fname, "w");
00111 if (CkpvAccess(bgfp) == NULL)
00112 CmiAbort("Failed to generated trace param file!");
00113 }
00114 #endif
00115
00116
00117 if (CkpvAccess(outputParameters)) {
00118 CkpvInitialize(StringPool, eventsPool);
00119 if (CkMyPe()==0) CmiPrintf("outputParameters enabled!\n");
00120 #ifdef CMK_BIGSIM_CHARM
00121 BgRegisterUserTracingFunction(finalizeBigSimTrace);
00122 #endif
00123 }
00124
00125
00126 #ifdef BIG_SIM_PAPI
00127 CkPrintf("PAPI: number of available counters: %d\n", PAPI_num_counters());
00128 CkAssert(PAPI_num_counters() >= 0);
00129 #endif
00130
00131 }
00132
00133 extern "C"
00134 void finalizeBigSimTrace()
00135 {
00136 if (CkpvAccess(bgfp) != NULL) {
00137 fclose(CkpvAccess(bgfp));
00138 CkpvAccess(bgfp) = NULL;
00139 CkpvAccess(outputParameters) = 0;
00140 }
00141 else {
00142 if (CkpvAccess(outputParameters))
00143 CkpvAccess(eventsPool).dump();
00144 }
00145 }
00146
00147 extern "C"
00148 void startTraceBigSim(){
00149
00150 CkAssert(CkpvAccess(insideTraceBracket) == false);
00151 CkpvAccess(insideTraceBracket) = true;
00152
00153 #if SPLIT_APART_CYCLE_ACCURATE
00154 SimParameters *simParams = Node::Object()->simParameters;
00155 if(simParams->bgSplitNumProcs != -1 && simParams->bgSplitMyProc!=-1){
00156 (bgTraceCounter) ++;
00157 if( ((bgTraceCounter) % simParams->bgSplitNumProcs) == simParams->bgSplitMyProc){
00158
00159
00160 start_time = begin();
00161 }
00162 }
00163 #endif
00164
00165
00166 #ifdef BIGSIM_PAPI
00167
00168 for(int i=0;i<NUM_PAPI_EVENTS;i++)
00169 values[i] = 0;
00170
00171 events[0] = PAPI_FP_OPS;
00172 events[1] = PAPI_TOT_INS;
00173 events[2] = PAPI_L1_ICM;
00174 events[3] = PAPI_L2_TCM;
00175 events[4] = PAPI_L3_TCM;
00176 events[5] = PAPI_TLB_TL;
00177 events[6] = PAPI_LD_INS;
00178 events[7] = PAPI_SR_INS;
00179 events[8] = PAPI_RES_STL;
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196 CkAssert(PAPI_start_counters(events, NUM_PAPI_EVENTS) == PAPI_OK);
00197
00198 #endif
00199
00200
00201 #ifdef CMK_BIGSIM_CHARM
00202 BgMark("startTraceBigSim %f\n");
00203 #endif
00204
00205 #if WITH_MAMBO
00206
00207 start_time = begin();
00208 #else
00209 CkpvAccess(start_time) = CmiWallTimer();
00210 #endif
00211
00212 }
00213
00214
00215 extern "C"
00216 void endTraceBigSim_20param(char * eventname, int stepno, 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 ) {
00217
00218 #if WITH_MAMBO
00219 end_time=end();
00220
00221 #else
00222 CkpvAccess(end_time) = CmiWallTimer();
00223 #endif
00224
00225 CkAssert(CkpvAccess(insideTraceBracket) == true);
00226 CkpvAccess(insideTraceBracket) = false;
00227 #ifdef CMK_BIGSIM_CHARM
00228 char perfCountString[1024];
00229 perfCountString[0] = 0;
00230 #endif
00231 char params[2048];
00232
00233 if(num_params==0) sprintf(params, "");
00234 if(num_params==1) sprintf(params, "%f", p1);
00235 if(num_params==2) sprintf(params, "%f %f", p1, p2);
00236 if(num_params==3) sprintf(params, "%f %f %f", p1, p2, p3);
00237 if(num_params==4) sprintf(params, "%f %f %f %f", p1, p2, p3, p4);
00238 if(num_params==5) sprintf(params, "%f %f %f %f %f", p1, p2, p3, p4, p5);
00239 if(num_params==6) sprintf(params, "%f %f %f %f %f %f", p1, p2, p3, p4, p5, p6);
00240 if(num_params==7) sprintf(params, "%f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7);
00241 if(num_params==8) sprintf(params, "%f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8);
00242 if(num_params==9) sprintf(params, "%f %f %f %f %f %f %f %f %f", p1, p2, p3, p4, p5, p6, p7, p8, p9);
00243 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);
00244 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);
00245 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);
00246 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);
00247 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);
00248 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);
00249 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);
00250 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);
00251 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);
00252 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);
00253 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);
00254
00255 char paramString[2048];
00256 sprintf(paramString, "params:{ %s }", params);
00257
00258 char eventNameString[1024];
00259 sprintf(eventNameString, "event:{ %s }", eventname);
00260
00261 #ifdef BIGSIM_PAPI
00262 CkAssert(PAPI_stop_counters(values, NUM_PAPI_EVENTS) == PAPI_OK);
00263
00264 sprintf(perfCountString, " PAPI:{ " );
00265
00266 for(int i=0;i<NUM_PAPI_EVENTS;i++){
00267 sprintf(perfCountString+strlen(perfCountString), " %lld ", values[i] );
00268 }
00269
00270
00271 printf("value=%lld\n", values[0]);
00272
00273 sprintf(perfCountString+strlen(perfCountString), " }");
00274
00275 #endif
00276
00277
00278 char timeString[512];
00279 timeString[0] = 0;
00280 char stepString[128];
00281 stepString[0] = 0;
00282 sprintf(stepString, "step:{ %d }", stepno);
00283
00284 #if ! CMK_BIGSIM_CHARM
00285 #if WITH_MAMBO
00286
00287 sprintf(timeString, "time_in_cycles:{ %llu }", end_time-start_time);
00288 #endif
00289 #endif
00290
00291 if (CkpvAccess(bgfp) == NULL) {
00292 if (CkpvAccess(outputParameters)) {
00293 double t = CkpvAccess(end_time)-CkpvAccess(start_time);
00294 if (t<0.0) {
00295 CmiPrintf("time: %f\n", t);
00296 t = 0.0;
00297 }
00298 CmiAssert(t >= 0.0);
00299
00300 sprintf(timeString, "time_in_us:{ %lf } %s %s %s\n", t*1e6, eventNameString, stepString, paramString);
00301 CkpvAccess(eventsPool).insert(timeString);
00302 }
00303 }
00304
00305
00306 #if SPLIT_APART_CYCLE_ACCURATE
00307 SimParameters *simParams = Node::Object()->simParameters;
00308 if(simParams->bgSplitNumProcs != -1 && simParams->bgSplitMyProc!=-1){
00309 if( ((bgTraceCounter) % simParams->bgSplitNumProcs) == simParams->bgSplitMyProc){
00310
00311
00312 }
00313 }
00314 #endif
00315 #ifdef CMK_BIGSIM_CHARM
00316
00317 char sequenceString[128];
00318 sequenceString[0] = 0;
00319
00320 BgMark("endTraceBigSim %f\n");
00321 if (CkpvAccess(bgfp) != NULL) {
00322
00323 int seqno = tTIMELINEREC.length()-1;
00324 if (seqno<0) CkAbort("Traces are not generated. Please run emulation with +bglog");
00325 fprintf(CkpvAccess(bgfp),"%d ",seqno);
00326 sprintf(sequenceString, "seqno:{ %d } ",seqno);
00327
00328 fprintf(CkpvAccess(bgfp), "TRACEBIGSIM: %s %s %s %s %s %s\n", eventNameString, stepString, sequenceString, timeString, perfCountString, paramString);
00329 }
00330 #else
00331
00332
00333
00334
00335
00336
00337 #endif
00338
00339
00340 }
00341
00342
00343
00344
00345
00351 void endTraceBigSim( char * eventName, int stepno ){endTraceBigSim_20param( eventName, stepno, 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 );}
00352 void endTraceBigSim( char * eventName , int stepno, double p1 ){endTraceBigSim_20param( eventName, stepno, 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 );}
00353 void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 ){endTraceBigSim_20param( eventName, stepno, 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 );}
00354 void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 ){endTraceBigSim_20param( eventName, stepno, 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 );}
00355 void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 ){endTraceBigSim_20param( eventName, stepno, 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 );}
00356 void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 ){endTraceBigSim_20param( eventName, stepno, 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 );}
00357 void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 ){endTraceBigSim_20param( eventName, stepno, 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 );}
00358 void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 ){endTraceBigSim_20param( eventName, stepno, 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 );}
00359 void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 ){endTraceBigSim_20param( eventName, stepno, 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 );}
00360 void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 ){endTraceBigSim_20param( eventName, stepno, 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 );}
00361 void endTraceBigSim( char * eventName , int stepno, double p1 , double p2 , double p3 , double p4 , double p5 , double p6 , double p7 , double p8 , double p9 , double p10 ){endTraceBigSim_20param( eventName, stepno, 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 );}
00362 void endTraceBigSim( char * eventName , int stepno, 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, stepno, 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 );}
00363 void endTraceBigSim( char * eventName , int stepno, 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, stepno, 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 );}
00364 void endTraceBigSim( char * eventName , int stepno, 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, stepno, 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 );}
00365 void endTraceBigSim( char * eventName , int stepno, 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, stepno, 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 );}
00366 void endTraceBigSim( char * eventName , int stepno, 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, stepno, 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 );}
00367 void endTraceBigSim( char * eventName , int stepno, 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, stepno, 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 );}
00368 void endTraceBigSim( char * eventName , int stepno, 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, stepno, 17 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , 0.0 , 0.0 , 0.0 );}
00369 void endTraceBigSim( char * eventName , int stepno, 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, stepno, 18 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , p18 , 0.0 , 0.0 );}
00370 void endTraceBigSim( char * eventName , int stepno, 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, stepno, 19 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , p18 , p19 , 0.0 );}
00371 void endTraceBigSim( char * eventName , int stepno, 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, stepno, 20 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 , p10 , p11 , p12 , p13 , p14 , p15 , p16 , p17 , p18 , p19 , p20 );}