Changed POSE DOP log file writing so it's all done from the localStat object on each...
authorRyan Mokos <mokos@illinois.edu>
Thu, 18 Nov 2010 00:16:22 +0000 (18:16 -0600)
committerRyan Mokos <mokos@illinois.edu>
Thu, 18 Nov 2010 00:16:22 +0000 (18:16 -0600)
examples/pose/PatternGen/Makefile
src/libs/ck-libs/pose/evq.C
src/libs/ck-libs/pose/evq.h
src/libs/ck-libs/pose/stats.C
src/libs/ck-libs/pose/stats.h

index e7a7c3309a3cd40e60c5c3f4b4a9bd5cbec9cce3..026031ad607f7bc8b47acb7b69c37939959bd075 100644 (file)
@@ -123,12 +123,10 @@ Worker_sim.C Worker_sim.h Worker_sim.ci: Worker.C Worker.h Worker.ci
        $(CHARMBIN)/etrans.pl $(ETRANS_OPTS) Worker
 
 test: $(PGM)
-       ./pgm 20 200 MEDIUM -gm 10
+       ./pgm 16 0
 
 partest: $(PGM)
-       ./charmrun +p4 ./pgm 20 200 MEDIUM -gm 1
-       ./charmrun +p4 ./pgm +restart __pose_chkpt_files/
+       ./charmrun +p4 ./pgm 16 0
 
 seqtest: $(PGM).seq
-       ./pgm.seq 20 800 MEDIUM -gm 1
-       ./pgm.seq +restart __pose_chkpt_files/
+       ./pgm.seq 16 0
index 49496fb20e39c221d9bfd2851f98dc32e073e663..f9a2b7ddccf06ef43fe50fa8435cbb7fae34b74f 100644 (file)
@@ -4,15 +4,7 @@
 /// Basic Constructor
 eventQueue::eventQueue()
 {
-  if(pose_config.dop){
-    sprintf(filename, "dop%d.log", CkMyPe());
-    fp = fopen(filename, "a");
-    if (fp == NULL) {
-      CkPrintf("ERROR: unable to open DOP file %s for append\n");
-      CkAbort("Error opening file");
-    }
-    lastLoggedVT = 0;
-  }
+  lastLoggedVT = 0;
   Event *e;
   eqh = new EqHeap();  // create the heap for incoming events
   largest = POSE_UnsetTS;
@@ -153,34 +145,24 @@ void eventQueue::InsertEventDeterministic(Event *e)
 #endif
 }
 
-void eventQueue::CommitStatsHelper(Event *commitPtr)
-{
+void eventQueue::CommitStatsHelper(Event *commitPtr) {
 #ifndef CMK_OPTIMIZE
   localStat *localStats = (localStat *)CkLocalBranch(theLocalStats);
-  if(pose_config.stats){
+  if (pose_config.stats) {
     localStats->Commit();
   }
 
-  if(pose_config.dop)
-    {
-      fpos_t fptr;
-      // if more than one event occurs at the same virtual time on this object, 
-      // only count the first event
-      if (lastLoggedVT >= commitPtr->svt)
-       commitPtr->svt = commitPtr->evt = -1;
-      else lastLoggedVT = commitPtr->evt;
-#if USE_LONG_TIMESTAMPS
-      while (!fprintf(fp, "%f %f %lld %lld\n", commitPtr->srt, commitPtr->ert, 
-                     commitPtr->svt, commitPtr->evt))
-       fsetpos(fp, &fptr);
-#else
-      while (!fprintf(fp, "%f %f %d %d\n", commitPtr->srt, commitPtr->ert, 
-                     commitPtr->svt, commitPtr->evt))
-       fsetpos(fp, &fptr);
-#endif
-      fgetpos(fp, &fptr);
-      localStats->SetMaximums(commitPtr->evt, commitPtr->ert);
+  if (pose_config.dop) {
+    // if more than one event occurs at the same virtual time on this object, 
+    // only count the first event
+    if (lastLoggedVT >= commitPtr->svt) {
+      commitPtr->svt = commitPtr->evt = -1;
+    } else {
+      lastLoggedVT = commitPtr->evt;
     }
+    localStats->WriteDopData(commitPtr->srt, commitPtr->ert, commitPtr->svt, commitPtr->evt);
+    localStats->SetMaximums(commitPtr->evt, commitPtr->ert);
+  }
 #endif
 }
 
index 7cdb054cf1f7968e97149796ce19d0b526d64e6e..110df185afadbd88adfd502883c4040e343bc4d2 100644 (file)
@@ -25,10 +25,6 @@ class eventQueue {
   unsigned int eventCount;
   /// Timestamp of the last event inserted in the queue
   POSE_TimeType tsOfLastInserted;
-  /// Output file name for stats for DOP calculation
-  char filename[20];
-  /// Output file pointer for stats for DOP calculation
-  FILE *fp;
   /// Coarse memory usage
   unsigned int mem_usage;
   /// Keep track of last logged VT for this object so no duplicates are logged
index 83a899f9a0e814fe9e5654dd4df41405c67f938b..732711e09c9ef0b424336b3cba2ef116a478898c 100644 (file)
@@ -11,6 +11,15 @@ extern void POSE_exit();
 /// Send local stats to global collector
 void localStat::SendStats()
 {
+  // This ensures everything is flushed to the file
+  fclose(dopFilePtr);
+  // Right now, SendStats is called only at the end of the
+  // simulation.  This is here in case that changes for some reason.
+  dopFilePtr = fopen(dopFileName, "a");
+  if (dopFilePtr == NULL) {
+    CkPrintf("WARNING: unable to open DOP file %s for append...this probably doesn't matter, though, as long as this is at the end of the simulation\n", 
+            dopFileName);
+  }
   CProxy_globalStat gstat(theGlobalStats);
   localStatSummary *m = new localStatSummary;
   m->doTime = totalTime;
index 4cc57cd79437b5bdfc1a7579c3cc08a9c60bd92f..aaaf2b0080a88ec73aa32a5686bd70ee0204ac11 100644 (file)
@@ -36,7 +36,7 @@ public:
   POSE_TimeType maxGVT;
 };
 
-/// Group to gather stats on each PE separately
+/// Group to gather stats on each PE separately
 class localStat : public Group {
 private:
   /// Current active timer
@@ -54,6 +54,10 @@ private:
   /* For degree of parallelism calculations */
   POSE_TimeType maxGVT;
   double maxGRT;
+  /// Output file name for stats for DOP calculation
+  char dopFileName[20];
+  /// Output file pointer for DOP calculation
+  FILE *dopFilePtr;
 public:
   /// Basic Constructor
   localStat(void) : whichStat(0),rollbacks(0),dos(0),undos(0),commits(0),loops(0),gvts(0),cpBytes(0),chkPts(0),maxChkPts(0),   maxGVT (0),
@@ -64,51 +68,78 @@ public:
 #ifdef VERBOSE_DEBUG
     CkPrintf("[%d] constructing localStat\n",CkMyPe());
 #endif
+    if (pose_config.dop) {
+      sprintf(dopFileName, "dop%d.log", CkMyPe());
+      dopFilePtr = fopen(dopFileName, "w");
+      if (dopFilePtr == NULL) {
+       CkPrintf("ERROR: unable to open DOP file %s for writing\n", dopFileName);
+       CkAbort("Error opening file");
+      }
+    }
   }
   /// Migration constructor
   localStat(CkMigrateMessage *msg) : Group(msg) { };
+  /// Destructor
+  ~localStat() {
+    fclose(dopFilePtr);
+  }
   /// Start the specified timer
-  void TimerStart(int timer);  
+  void TimerStart(int timer);
   /// Stop the currently active timer
-  void TimerStop();            
+  void TimerStop();
   /// Switch to different timer, stopping active timer
-  void SwitchTimer(int timer); 
+  void SwitchTimer(int timer);
   /// Increment event forward execution count
-  inline void Do() { dos++; }         
+  inline void Do() { dos++; }
   /// Increment event rollback count
-  inline void Undo() { undos++; }    
+  inline void Undo() { undos++; }
   /// Increment commit count
-  inline void Commit() { commits++; }    
+  inline void Commit() { commits++; }
   /// Increment event loop count
-  inline void Loop() { loops++; }    
-  /// Increment GVT estimation count     
-  inline void GvtInc() { gvts++; }   
+  inline void Loop() { loops++; }
+  /// Increment GVT estimation count
+  inline void GvtInc() { gvts++; }
   /// Increment rollback count
-  inline void Rollback() { rollbacks++; }  
+  inline void Rollback() { rollbacks++; }
   /// Increment checkpoint count and adjust max
   inline void Checkpoint() { chkPts++; if (chkPts > maxChkPts) maxChkPts = chkPts; }
   /// Decrement checkpoint count
   inline void Reclaim() { chkPts--; }
   /// Add to checkpointed bytes count
-  inline void CPbytes(int n) { cpBytes += n; }  
+  inline void CPbytes(int n) { cpBytes += n; }
   /// Send local stats to global collector
   void SendStats();
   /// Query which timer is active
   inline int TimerRunning() { return (whichStat); }
   /// Set maximum times
-  inline void SetMaximums(POSE_TimeType gvt, double grt) { 
-    if (gvt > maxGVT) maxGVT = gvt; 
+  inline void SetMaximums(POSE_TimeType gvt, double grt) {
+    if (gvt > maxGVT) maxGVT = gvt;
     if (grt > maxGRT) maxGRT = grt;
   }
+  /// Write data to this PE's DOP log file
+  inline void WriteDopData(double srt, double ert, POSE_TimeType svt, POSE_TimeType evt) {
+#if USE_LONG_TIMESTAMPS
+    // fprintf returns the number of characters written, or a negative
+    // number if something went wrong
+    if (fprintf(dopFilePtr, "%f %f %lld %lld\n", srt, ert, svt, evt) <= 0) {
+      CkPrintf("WARNING: DOP data not written to %s\n", dopFileName);
+    }
+#else
+    // fprintf returns the number of characters written, or a negative
+    // number if something went wrong
+    if (fprintf(dopFilePtr, "%f %f %d %d\n", srt, ert, svt, evt) <= 0) {
+      CkPrintf("WARNING: DOP data not written to %s\n", dopFileName);
+    }
+#endif
+  }
 };
 PUPbytes(localStat)
 
 /// Entity to gather stats from each PE and prepare final report
 class globalStat : public Chare {
 private:
-  double doAvg, doMax, rbAvg, rbMax, gvtAvg, gvtMax, simAvg, simMax, 
-    cpAvg, cpMax, canAvg, canMax, lbAvg, lbMax, fcAvg, fcMax, commAvg, commMax,
-    maxTime;
+  double doAvg, doMax, rbAvg, rbMax, gvtAvg, gvtMax, simAvg, simMax, cpAvg, 
+    cpMax, canAvg, canMax, lbAvg, lbMax, fcAvg, fcMax, commAvg, commMax, maxTime;
   double minDo, maxDo, avgDo, GvtTime, maxGRT;
   long cpBytes;
   int reporting, totalDos, totalUndos, totalCommits, totalLoops, totalGvts, maxChkPts;