Added the ability to override the evt (ending virtual time) for an entry method in...
authorRyan Mokos <mokos@illinois.edu>
Mon, 8 Nov 2010 23:07:25 +0000 (17:07 -0600)
committerRyan Mokos <mokos@illinois.edu>
Mon, 8 Nov 2010 23:07:25 +0000 (17:07 -0600)
  if ((pose_config.stats) && (pose_config.dop)) {
    parent->dop_override_evt = ovt + (POSE_TimeType)time_that_would_have_been_elapsed;
  }

Also added patterns 2 and 3 to the POSE PatternGen example for testing of the above feature.

examples/pose/PatternGen/README
examples/pose/PatternGen/Worker.C
examples/pose/PatternGen/defs.h
examples/pose/PatternGen/pgm.C
src/libs/ck-libs/pose/etrans.pl
src/libs/ck-libs/pose/sim.h

index 5925e20a85ad40fb7195ef67fb285d1b65c5ebb9..fc496964f9aea9fdf12147aac9c812be96361d81 100644 (file)
@@ -16,9 +16,9 @@ In addition, running with -help lists the available patterns and usage:
 Steps for adding a pattern
 --------------------------
 1. Add new case statements to the switches in Worker::Worker, Worker::sendMessage, and Worker::recvMessage in Worker.C.
-2. If necessary, add any new helper functions or entry methods to Worker.h and Worker.C, making sure new entry methods are declared in Worker.ci.
-3. If necessary, add new event message classes to Worker.h and declare in Worker.ci.
-4. In defs.h, increment NUM_AVAILABLE_PATTERNS and add any new constants needed for the new pattern.
+2. In defs.h, increment NUM_AVAILABLE_PATTERNS and add any new constants needed for the new pattern.
+3. If necessary, add any new helper functions or entry methods to Worker.h and Worker.C, making sure new entry methods are declared in Worker.ci.
+4. If necessary, add new event message classes to Worker.h and declare in Worker.ci.
 5. If necessary, add parsing of new command-line parameters in main::main in pgm.C.
 6. Describe the new pattern briefly in the -help text in pgm.C, and provide more details below.
 
@@ -29,3 +29,9 @@ Pattern 0: This is a simple ring pattern.  Worker 0 sends a message to Worker 1,
 
 Pattern 1: In this pattern, each Worker begins by invoking its helper entry method, Worker::pattern1Iter.  This method sends one message to a Worker (via Worker::sendMessage) and then one message to itself with a short transit time (~200 GVT ticks) to initiate another send.  This repeats P1_MESSAGES_PER_ITER times (defined in defs.h).  This is then followed by sending a message to itself with a very long transit time (~1,000,000 GVT ticks).  This entire process is repeated for several iterations.  Note that there is no dependency between the recipt of a work message by Worker::recvMessage and when the next work message is sent--this is solely determined by the delay between the receipt of messages by Worker::pattern1Iter.
 
+Pattern 2: This is a simultaneous ring pattern (every Worker sends to the next Worker in the ring at the same time).  After a message is received, a number of GVT ticks are elapsed, and then another message is sent.  See the note on patterns 2 and 3.
+
+Pattern 3: This is a simultaneous ring pattern (every Worker sends to the next Worker in the ring at the same time).  After a message is received, the next message is sent without elapsing any virtual time.  See the note on patterns 2 and 3.
+
+Note on patterns 2 and 3: These patterns were intended to be used for POSE DOP analysis testing.  The timing is meant to be equivalent, and using +dop_pose +stats_pose should yield the same results for both patterns, as long as the parameters in defs.h are such that the P#_MESSAGES_TO_SEND are equal, P#_ELAPSE_TIME are equal, and P2_MESSAGES_TO_SEND + P2_ELAPSE_TIME = P3_MSG_TRANSIT_TIME.
+
index 6c989658c9f602a3289e382656dea467cbdf7978..d9f45eaef52b2bcf823ae77c0a1f1f2cc083056e 100644 (file)
@@ -12,20 +12,33 @@ Worker::Worker(WorkerInitMsg *initMsg) {
   dbPrintf("Worker %d constructed\n", myPID);
 
   // send the first message(s) of the simulation
+  WorkMsg *wm;
   switch (patternNum) {
-  case 0:
+  case 0:  // ring
     if (myPID == 0) {
-      WorkMsg *wm = new WorkMsg(myPID, 0);
+      wm = new WorkMsg(myPID, 0);
       msgCount++;
       POSE_invoke(recvMessage(wm), Worker, (totalNumWorkers > 1) ? 1 : 0, (POSE_TimeType)P0_MSG_TRANSIT_TIME);
     }
     break;
-  case 1: {
+  case 1: {  // short communication burst, long message send, repeat
     POSE_srand(time(NULL));
-    WorkMsg *wm = new WorkMsg(myPID, 0);
+    wm = new WorkMsg(myPID, 0);
     POSE_local_invoke(pattern1Iter(wm), 1);
     break;
   }
+  case 2: {  // simultaneous ring with elapse
+    wm = new WorkMsg(myPID, 0);
+    msgCount++;
+    POSE_invoke(recvMessage(wm), Worker, (myPID + 1) % totalNumWorkers, (POSE_TimeType)0);
+    break;
+  }
+  case 3: {  // simultaneous ring without elapse
+    wm = new WorkMsg(myPID, 0);
+    msgCount++;
+    POSE_invoke(recvMessage(wm), Worker, (myPID + 1) % totalNumWorkers, (POSE_TimeType)0);
+    break;
+  }
   default:
     CkPrintf("Invalid pattern number: %d\n", patternNum);
     CkAbort("");
@@ -43,19 +56,32 @@ void Worker::sendMessage() {
 
   // set message parameters based on the pattern
   switch (patternNum) {
-  case 0:
+  case 0:  // ring
     destWorker = (myPID + 1) % totalNumWorkers;
     msgTransitTime = (POSE_TimeType)P0_MSG_TRANSIT_TIME;
     wm = new WorkMsg(myPID, msgCount);
     msgCount++;
     break;
-  case 1:
+  case 1:  // short communication burst, long message send, repeat
     //destWorker = POSE_rand() % totalNumWorkers;
     destWorker = myPID;
     msgTransitTime = (POSE_TimeType)(P1_BASE_MSG_TRANSIT_TIME + (POSE_rand() % P1_MSG_TRANSIT_TIME_RANGE));
     wm = new WorkMsg(myPID, msgCount);
     msgCount++;
     break;
+  case 2:  // simultaneous ring with elapse
+    destWorker = (myPID + 1) % totalNumWorkers;
+    msgTransitTime = (POSE_TimeType)P2_MSG_TRANSIT_TIME;
+    wm = new WorkMsg(myPID, msgCount);
+    msgCount++;
+    break;
+  case 3: {  // simultaneous ring without elapse
+    destWorker = (myPID + 1) % totalNumWorkers;
+    msgTransitTime = (POSE_TimeType)P3_MSG_TRANSIT_TIME;
+    wm = new WorkMsg(myPID, msgCount);
+    msgCount++;
+    break;
+  }
   default:
     CkPrintf("Invalid pattern number: %d\n", patternNum);
     CkAbort("");
@@ -72,15 +98,33 @@ void Worker::recvMessage(WorkMsg *wm) {
           myPID, ovt, msgCount, iterNum, msgNum, wm->srcWorkerPID, wm->msgID);
 
   switch (patternNum) {
-  case 0:
+  case 0:  // ring
     elapse(P0_ELAPSE_TIME);
     if (((wm->msgID * totalNumWorkers) + wm->srcWorkerPID) < (P0_MESSAGES_TO_SEND - 1)) {
       sendMessage();
     }
     break;
-  case 1:
+  case 1:  // short communication burst, long message send, repeat
     // do nothing; everything is done on the sending side
     break;
+  case 2:  // simultaneous ring with elapse
+    if (((wm->msgID * totalNumWorkers) + wm->srcWorkerPID) < (P2_MESSAGES_TO_SEND - 1)) {
+    elapse(P2_ELAPSE_TIME);
+      sendMessage();
+    }
+    break;
+  case 3: {  // simultaneous ring without elapse
+    if (((wm->msgID * totalNumWorkers) + wm->srcWorkerPID) < (P3_MESSAGES_TO_SEND - 1)) {
+      // manually set evt for DOP analysis
+#ifndef CMK_OPTIMIZE
+      if ((pose_config.stats) && (pose_config.dop)) {
+        parent->dop_override_evt = ovt + (POSE_TimeType)P3_ELAPSE_TIME;
+      }
+#endif
+      sendMessage();
+    }
+    break;
+  }
   default:
     CkPrintf("Invalid pattern number: %d\n", patternNum);
     CkAbort("");
index a7cde604a10016050c4e29024200ef5126804be1..6c67394f0ca861748da0f57ed14b4123d9960178 100644 (file)
@@ -5,7 +5,7 @@
 #include <math.h>
 #include <time.h>
 
-#define NUM_AVAILABLE_PATTERNS 2
+#define NUM_AVAILABLE_PATTERNS 4
 
 // set to "if (1) CkPrintf" to turn on debug print statements
 #define dbPrintf if (0) CkPrintf
 #define P1_SHORT_DELAY 200
 #define P1_LARGE_DELAY 1000000
 
+// for pattern 2
+#define P2_MESSAGES_TO_SEND 100
+#define P2_MSG_TRANSIT_TIME 200
+#define P2_ELAPSE_TIME 800
+
+// for pattern 3
+#define P3_MESSAGES_TO_SEND 100
+#define P3_MSG_TRANSIT_TIME 1000
+#define P3_ELAPSE_TIME 800
+
 #endif  // _DEFS_H
index 83f66671c3f728ff7440de5f3153e49eaf083eba..63748370cb325c9138d119162f694c9ac07a2c88 100644 (file)
@@ -9,12 +9,18 @@ main::main(CkArgMsg *m) {
   int numWorkers, patternNum;
 
   if ((m->argc < 3) || (strcmp(m->argv[1], "-help") == 0)) {
-    CkPrintf("Usage: pgm <#workerObjs> <pattern#> [<pattern parameters>]\n");
+    CkPrintf("\nUsage: pgm <#workerObjs> <pattern#> [<pattern parameters>]\n");
     CkPrintf("\n");
     CkPrintf("Pattern 0: Simple ring test\n");
     CkPrintf("   Pattern parameters: none\n");
     CkPrintf("Pattern 1: Short communcation bursts (~100 GVT ticks apart), long message send (~1M ticks), repeat\n");
     CkPrintf("   Pattern parameters: none\n");
+    CkPrintf("Pattern 2: Simultaneous ring with elapse statements\n");
+    CkPrintf("   Pattern parameters: none\n");
+    CkPrintf("Pattern 3: Simultaneous ring without elapse statements\n");
+    CkPrintf("   Pattern parameters: none\n");
+    CkPrintf("\n");
+    CkPrintf("For more details on the patterns, see the README file.\n\n");
     CkExit();
   }
 
index 978a3e2082a9147ca2e7fbccd57dae9560377aa6..d8e373da291bedf0a9ea87affd9c17dbff862e5e 100755 (executable)
@@ -814,6 +814,7 @@ foreach my $incfile ($inC,@otherfiles)
            $outChandle->print("$count) {\n");
            $first = 0;
            $outChandle->print("#ifndef CMK_OPTIMIZE\n");
+           $outChandle->print("  dop_override_evt = (POSE_TimeType)-1;\n");
            $outChandle->print("  if(pose_config.stats)\n");
            $outChandle->print("    if (!CpvAccess(stateRecovery)) {localStats->Do();\n");
            $outChandle->print("    if(pose_config.dop)\n");
@@ -829,7 +830,11 @@ foreach my $incfile ($inC,@otherfiles)
            $outChandle->print("      et = CmiWallTimer();\n");
            $outChandle->print("      eq->currentPtr->ert = eq->currentPtr->srt + (et-st);\n");
            $outChandle->print("      ((state_$key *) objID)->ort = eq->currentPtr->ert+0.000001;\n");
-           $outChandle->print("      eq->currentPtr->evt = ((state_$key *) objID)->OVT();\n");
+           $outChandle->print("      if (dop_override_evt >= (POSE_TimeType)0) {\n");
+           $outChandle->print("        eq->currentPtr->evt = dop_override_evt;\n");
+           $outChandle->print("      } else {\n");
+           $outChandle->print("        eq->currentPtr->evt = ((state_$key *) objID)->OVT();\n");
+           $outChandle->print("      }\n");
            $outChandle->print("    }\n");
            $outChandle->print("    localStats->SwitchTimer(SIM_TIMER);}\n");
            $outChandle->print("#endif\n");
index eb0a15687a395aa5a5be5af33ec585a118514c0c..0be574f22fa4eccdc5ab6e8d375c29297a311d28 100644 (file)
@@ -226,7 +226,17 @@ class sim : public CBase_sim {
   double st, et, ct;
 #ifndef CMK_OPTIMIZE
   /// The local statistics collector
-  localStat *localStats; 
+  localStat *localStats;
+  /// Used to manually override the value of evt for DOP calculations
+  /* To override the ending virtual time of an entry method when doing
+     DOP analysis, add this code to the entry method:
+  #ifndef CMK_OPTIMIZE
+    if ((pose_config.stats) && (pose_config.dop)) {
+      parent->dop_override_evt = ovt + (POSE_TimeType)time_that_would_have_been_elapsed;
+    }
+  #endif
+  */
+  POSE_TimeType dop_override_evt;
 #endif
   /// The local load balancer
   LBgroup *localLBG;