added +sumonly which will combine summary bin data from all pes to pe0 and write...
authorGengbin Zheng <gzheng@illinois.edu>
Wed, 7 Aug 2002 21:02:39 +0000 (21:02 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Wed, 7 Aug 2002 21:02:39 +0000 (21:02 +0000)
src/ck-perf/trace-summary.C
src/ck-perf/trace-summary.ci [new file with mode: 0644]
src/ck-perf/trace-summary.h
src/ck-perf/trace-summaryBOC.h [new file with mode: 0644]

index 33ebbe01e0fbd6972e1c2965d203b523a83a9a6f..58f43ba446d6b536ee305db5b07f8d9fc5d0a25c 100644 (file)
@@ -11,6 +11,7 @@
 /*@{*/
 
 #include "trace-summary.h"
+#include "trace-summaryBOC.h"
 
 #define DEBUGF(x)  // CmiPrintf x
 
@@ -26,6 +27,8 @@ static int _unpackMsg, _unpackChare, _unpackEP;
 CkpvDeclare(double, binSize);
 CkpvDeclare(double, version);
 
+int sumonly = 0;
+
 /**
   For each TraceFoo module, _createTraceFoo() must be defined.
   This function is called in _createTraces() generated in moduleInit.C
@@ -66,8 +69,10 @@ PhaseEntry::PhaseEntry()
 
 SumLogPool::~SumLogPool() 
 {
+  if (!sumonly) {
   write();
   fclose(fp);
+  }
   // free memory for mark
   if (markcount > 0)
   for (int i=0; i<MAX_MARKS; i++) {
@@ -106,12 +111,14 @@ SumLogPool::SumLogPool(char *pgm) : phaseTab(MAX_PHASES)
    sprintf(fname, "%s.%s.sum", pgm, pestr);
    fp = NULL;
    //CmiPrintf("TRACE: %s:%d\n", fname, errno);
-   do {
-    fp = fopen(fname, "w+");
+   if (!sumonly) {
+    do {
+      fp = fopen(fname, "w+");
     } while (!fp && errno == EINTR);
     delete[] fname;
     if(!fp) {
       CmiAbort("Cannot open Summary Trace File for writing...\n");
+    }
    }
 
    epSize = MAX_ENTRIES;
@@ -137,6 +144,7 @@ void SumLogPool::write(void)
 {
   int i;
   unsigned int j;
+
   fprintf(fp, "ver:%3.1f %d/%d count:%d ep:%d interval:%e", CkpvAccess(version), CkMyPe(), CkNumPes(), numEntries, _numEntries, CkpvAccess(binSize));
   if (CkpvAccess(version)>=3.0)
   {
@@ -284,8 +292,6 @@ TraceSummary::TraceSummary(char **argv):curevent(0),binStart(0.0),bin(0.0),msgNu
        sscanf(tmpStr,"%lf",&CkpvAccess(binSize));
   if (CmiGetArgString(argv,"+version",&tmpStr))
        sscanf(tmpStr,"%lf",&CkpvAccess(version));
-  _logPool = new SumLogPool(CkpvAccess(traceRoot));
-  execEp=INVALIDEP;
 
   epThreshold = 0.001; 
   if (CmiGetArgString(argv,"+epThreshold",&tmpStr))
@@ -293,6 +299,11 @@ TraceSummary::TraceSummary(char **argv):curevent(0),binStart(0.0),bin(0.0),msgNu
   epInterval = 0.001; 
   if (CmiGetArgString(argv,"+epInterval",&tmpStr))
        sscanf(tmpStr,"%lf",&epInterval);
+
+  sumonly = CmiGetArgFlag(argv, "+sumonly");
+
+  _logPool = new SumLogPool(CkpvAccess(traceRoot));
+  execEp=INVALIDEP;
 }
 
 void TraceSummary::traceClearEps(void)
@@ -446,5 +457,122 @@ void TraceSummary::startPhase(int phase)
 }
 
 
+/// for TraceSummaryBOC
+
+CkGroupID traceSummaryGID;
+
+void TraceSummaryBOC::askSummary()
+{
+  if (CkpvAccess(_trace) == NULL) return;
+
+#if 0
+#if CMK_TRACE_IN_CHARM
+  TRACE_CHARM_PE() = 0;
+#endif
+#endif
+
+  int n = CkpvAccess(_trace)->pool()->getNumEntries();
+  BinEntry *bins = CkpvAccess(_trace)->pool()->bins();
+#if 1
+CmiPrintf("askSummary on [%d] numEntried=%d\n", CkMyPe(), n);
+for (int i=0; i<n; i++) 
+  CmiPrintf("%4d", bins[i].getU());
+CmiPrintf("\n");
+#endif
+  CProxy_TraceSummaryBOC p(traceSummaryGID);
+  p[0].sendSummaryBOC(n, bins);
+}
+
+extern "C" void _CkExit();
+
+void TraceSummaryBOC::sendSummaryBOC(int n, BinEntry *b)
+{
+  int i;
+  if (CkpvAccess(_trace) == NULL) return;
+
+  CkAssert(CkMyPe() == 0);
+
+#if 0
+#if CMK_TRACE_IN_CHARM
+  TRACE_CHARM_PE() = 0;
+#endif
+#endif
+
+  count ++;
+  if (bins == NULL) {
+    nBins = CkpvAccess(_trace)->pool()->getNumEntries();
+    bins = new BinEntry[nBins];
+  }
+  if (n>nBins) n = nBins;
+  for (i=0; i<n; i++) {
+    bins[i].Time() += b[i].Time();
+  }
+  if (count == CkNumPes()) {
+    write();
+    _CkExit();
+  }
+}
+
+void TraceSummaryBOC::write(void) 
+{
+  int i;
+  unsigned int j;
+
+  char *fname = new char[strlen(CkpvAccess(traceRoot))+strlen(".sum")+1];
+  sprintf(fname, "%s.sum", CkpvAccess(traceRoot));
+  FILE *sumfp = fopen(fname, "w+");
+  //CmiPrintf("File: %s \n", fname);
+  if(sumfp == 0)
+      CmiAbort("Cannot open summary sts file for writing.\n");
+  delete[] fname;
+
+  fprintf(sumfp, "ver:%3.1f %d/%d count:%d ep:%d interval:%e", CkpvAccess(version), CkMyPe(), CkNumPes(), nBins, _numEntries, CkpvAccess(binSize));
+  fprintf(sumfp, "\n");
+
+  // write bin time
+#if 0
+  int last=pool[0].getU();
+  pool[0].writeU(fp, last);
+  int count=1;
+  for(j=1; j<numEntries; j++) {
+    int u = pool[j].getU();
+    if (last == u) {
+      count++;
+    }
+    else {
+      if (count > 1) fprintf(fp, "+%d", count);
+      pool[j].writeU(fp, u);
+      last = u;
+      count = 1;
+    }
+  }
+  if (count > 1) fprintf(fp, "+%d", count);
+#else
+  for(j=0; j<nBins; j++) {
+    bins[j].Time() /= CkNumPes();
+    bins[j].write(sumfp);
+  }
+#endif
+  fprintf(sumfp, "\n");
+  fclose(sumfp);
+
+}
+
+extern "C" void CombineSummary()
+{
+CmiPrintf("[%d] CombineSummary called!\n", CkMyPe());
+  if (sumonly) CProxy_TraceSummaryBOC(traceSummaryGID).askSummary();
+  else CkExit();
+}
+
+void initTraceSummaryBOC()
+{
+  if (CkMyRank() == 0) {
+    registerExitFn(CombineSummary);
+  }
+}
+
+#include "TraceSummary.def.h"
+
 
 /*@}*/
diff --git a/src/ck-perf/trace-summary.ci b/src/ck-perf/trace-summary.ci
new file mode 100644 (file)
index 0000000..4bb66f5
--- /dev/null
@@ -0,0 +1,19 @@
+
+module TraceSummary {
+
+  mainchare TraceSummaryInit {
+    entry TraceSummaryInit();
+  };
+
+  initcall void initTraceSummaryBOC();
+  
+  readonly CkGroupID traceSummaryGID;
+
+  group TraceSummaryBOC {
+    entry TraceSummaryBOC(void);
+    entry void askSummary();
+    entry void sendSummaryBOC(int n, BinEntry s[n]);
+  };
+
+};
+
index 44990c038300defe6d69a2d04c4c2f5cd7255d41..3c5a5d817b1b9d41569d47f2da190107c53a266e 100644 (file)
@@ -37,10 +37,11 @@ class BinEntry {
 #ifdef WIN32
     void operator delete(void *, void *) { }
 #endif
-    BinEntry() {}
+    BinEntry(): time(0.) {}
     BinEntry(double t): time(t) {}
     inline double getTime() { return time; }
     void setTime(double t) { time = t; }
+    double &Time() { return time; }
     void write(FILE *fp);
     void writeU(FILE *fp, int u);
     int  getU();
@@ -197,6 +198,8 @@ class SumLogPool {
     void shrink(void) ;
     void addEventType(int eventType, double time);
     void startPhase(int phase) { phaseTab.startPhase(phase); }
+    BinEntry *bins() { return pool; }
+    int getNumEntries() { return numEntries; }
 };
 
 /// class for recording trace summary events 
@@ -239,6 +242,11 @@ class TraceSummary : public Trace {
        for starting a new phase
     */
     void startPhase(int phase);
+
+    /**
+       query utilities
+    */
+    SumLogPool *pool() { return _logPool; }
 };
 
 #endif
diff --git a/src/ck-perf/trace-summaryBOC.h b/src/ck-perf/trace-summaryBOC.h
new file mode 100644 (file)
index 0000000..c88ab40
--- /dev/null
@@ -0,0 +1,28 @@
+
+#include "TraceSummary.decl.h"
+
+extern CkGroupID traceSummaryGID;
+
+class TraceSummaryInit : public Chare {
+  public:
+  TraceSummaryInit(CkArgMsg*) {
+    traceSummaryGID = CProxy_TraceSummaryBOC::ckNew();
+  }
+  TraceSummaryInit(CkMigrateMessage *m) {}
+};
+
+class TraceSummaryBOC : public CBase_TraceSummaryBOC {
+private:
+  int count;
+  BinEntry *bins;
+  int  nBins;
+public:
+  TraceSummaryBOC(void): count(0), bins(NULL), nBins(0) {};
+  TraceSummaryBOC(CkMigrateMessage *m) {};
+  void askSummary();
+  void sendSummaryBOC(int n, BinEntry *b);
+private:
+  void write();
+};
+
+