Simpler, more precise benchmark.
authorTerry L. Wilmarth <wilmarth@uiuc.edu>
Fri, 17 Dec 2004 22:41:15 +0000 (22:41 +0000)
committerTerry L. Wilmarth <wilmarth@uiuc.edu>
Fri, 17 Dec 2004 22:41:15 +0000 (22:41 +0000)
examples/pose/SimBenchmark/Worker.C
examples/pose/SimBenchmark/Worker.h
examples/pose/SimBenchmark/pgm.C

index d43978c1036bc744ad8e38fec66056d6b6ed5e71..8a7d33077eb9581b7a35da1ab3a941080916ed67 100644 (file)
@@ -1,5 +1,15 @@
 #include <math.h>
 
+int GCD(int a, int b) {
+  if (b > a) 
+    return GCD(b,a);
+  else if(b == 0) 
+    return a;
+  else
+    return GCD(b, a%b);
+}
+
+
 worker::worker(WorkerData *m)
 {
   int i;
@@ -10,21 +20,29 @@ worker::worker(WorkerData *m)
   grainSize = m->grainSize;
   granularity = m->granularity;
   density = m->density;
-  msgsPerWork = m->msgsPerWork;
   for (i=0; i<100; i++) data[i] = 0;
   sent = 0;
   totalObjs = numObjs * CkNumPes();
   localDensity = ((double)density)/((double)totalObjs);
-  elapseTime = (int)(1.0/localDensity);
-  elapseRem = (int)(((1.0/localDensity) * (double)msgsPerWork) - 
-                   (elapseTime * msgsPerWork));
-  neighbor = (myHandle + numObjs) % totalObjs;
+  localMsgs = locality;
+  remoteMsgs = 100 - locality;
+  int theGCD = GCD(localMsgs, remoteMsgs);
+  localMsgs = localMsgs/theGCD;
+  remoteMsgs = remoteMsgs/theGCD;
+  localCount = localMsgs;
+  remoteCount = remoteMsgs;
+  localNbr = ((myHandle+1) % numObjs) + (CkMyPe() * numObjs);
+  remoteNbr = (myHandle + numObjs) % totalObjs;
+  fromLocal = ((myHandle + numObjs -1) % numObjs) + (CkMyPe() * numObjs);
+  fromRemote = (myHandle + totalObjs - numObjs) % totalObjs;
   delete m;
   SmallWorkMsg *sm = new SmallWorkMsg;
   memset(sm->data, 0, SM_MSG_SZ*sizeof(int));
-  //CkPrintf("Worker %d created on PE %d with msgsPerWork=%d, elapseTime=%d and elapseRem=%d. Sending message to self...\n", myHandle, CkMyPe(), msgsPerWork, elapseTime, elapseRem);
+  sm->fromPE = -1;
+  //CkPrintf("Worker %d created on PE %d with %d/%d (local/remote messages) sends to %d/%d receives from %d/%d.\n", myHandle, CkMyPe(), localMsgs, remoteMsgs, localNbr, remoteNbr, fromLocal, fromRemote);
   POSE_invoke(workSmall(sm), worker, parent->thisIndex, 0);
   sent++;
+  received = 0;
 }
 
 worker::worker()
@@ -42,20 +60,35 @@ worker& worker::operator=(const worker& obj)
   grainSize = obj.grainSize;
   granularity = obj.granularity;
   density = obj.density;
-  msgsPerWork = obj.msgsPerWork;
   sent = obj.sent;
+  received = obj.received;
+  localMsgs = obj.localMsgs;
+  remoteMsgs = obj.remoteMsgs;
+  localCount = obj.localCount;
+  remoteCount = obj.remoteCount;
+  localNbr = obj.localNbr;
+  remoteNbr = obj.remoteNbr;
+  fromLocal = obj.fromLocal;
+  fromRemote = obj.fromRemote;
   totalObjs = obj.totalObjs;
-  elapseTime = obj.elapseTime;
-  elapseRem = obj.elapseRem;
-  neighbor = obj.neighbor;
   for (i=0; i<100; i++) data[i] = obj.data[i];
   return *this;
 }
 
+void worker::terminus()
+{
+  if (sent != numMsgs)
+    CkPrintf("%d sent %d messages!\n", myHandle, sent);
+  if (received != numMsgs)
+    CkPrintf("%d received %d messages!\n", myHandle, received);
+}
 
 void worker::workSmall(SmallWorkMsg *m)
 {
   //CkPrintf("%d receiving small work at %d\n", parent->thisIndex, ovt);
+  received++;
+  if ((m->fromPE != fromLocal) && (m->fromPE != fromRemote) && (m->fromPE!=-1))
+    parent->CommitPrintf("%d received from %d which is weird!\n", myHandle, m->fromPE);
   doWork();
 }
 
@@ -103,41 +136,46 @@ void worker::doWork()
   SmallWorkMsg *sm;
   MediumWorkMsg *mm;
   LargeWorkMsg *lm;
+  int nbr;
 
-  // generate some events
-  int actualMsgSize = msgSize;
-  int local = (int)(((double)locality)/100.0 * (double)msgsPerWork);
-  //CkPrintf("%d out of %d messages will be sent to local objects\n", local, msgsPerWork);
-  int localNbr;
-  for (int i=0; i<msgsPerWork; i++) {
-    if (sent >= numMsgs) return;
-    sent++;
-    localNbr = ((myHandle+1) % numObjs) + (CkMyPe() * numObjs);
-    if (local > 0) local--;
-    else localNbr = neighbor;
-    elapse(elapseTime);
-    if (msgSize == MIX_MS) actualMsgSize = (actualMsgSize + 1) % 3;
-    if (actualMsgSize == SMALL) {
-      sm = new SmallWorkMsg;
-      memset(sm->data, 0, SM_MSG_SZ*sizeof(int));
-      POSE_invoke(workSmall(sm), worker, localNbr, 0);
-      //CkPrintf("%d sending small work to %d at %d. Sent=%d\n",myHandle,localNbr,ovt,sent);
-    }
-    else if (actualMsgSize == MEDIUM) {
-      mm = new MediumWorkMsg;
-      memset(mm->data, 0, MD_MSG_SZ*sizeof(int));
-      POSE_invoke(workMedium(mm), worker, localNbr, 0);
-      //CkPrintf("%d sending medium work to %d at %d\n",myHandle,localNbr,ovt);
-    }
-    else if (actualMsgSize == LARGE) {
-      lm = new LargeWorkMsg;
-      memset(lm->data, 0, LG_MSG_SZ*sizeof(int));
-      POSE_invoke(workLarge(lm), worker, localNbr, 0);
-      //CkPrintf("%d sending large work to %d at %d\n",myHandle,localNbr,ovt);
+  if (sent > numMsgs) parent->CommitPrintf("%d received more msgs than sent!\n", myHandle);
+  if (sent >= numMsgs) return;
+  sent++;
+  if (localCount > 0) {
+    localCount--;
+    nbr = localNbr;
+  }
+  else if (remoteCount > 0) {
+    remoteCount--;
+    nbr = remoteNbr;
+    if (remoteCount == 0) {
+      localCount = localMsgs;
+      remoteCount = remoteMsgs;
     }
   }
-  elapse(elapseRem);
-  int elapseCheck = sent * (1.0/density);
+  // generate an event
+  int actualMsgSize = msgSize;
+  if (msgSize == MIX_MS) actualMsgSize = (actualMsgSize + 1) % 3;
+  if (actualMsgSize == SMALL) {
+    sm = new SmallWorkMsg;
+    memset(sm->data, 0, SM_MSG_SZ*sizeof(int));
+    sm->fromPE = myHandle;
+    POSE_invoke(workSmall(sm), worker, nbr, 0);
+    //CkPrintf("%d sending small work to %d at %d. Sent=%d\n",myHandle,nbr,ovt,sent);
+  }
+  else if (actualMsgSize == MEDIUM) {
+    mm = new MediumWorkMsg;
+    memset(mm->data, 0, MD_MSG_SZ*sizeof(int));
+    POSE_invoke(workMedium(mm), worker, nbr, 0);
+    //CkPrintf("%d sending medium work to %d at %d\n",myHandle,nbr,ovt);
+  }
+  else if (actualMsgSize == LARGE) {
+    lm = new LargeWorkMsg;
+    memset(lm->data, 0, LG_MSG_SZ*sizeof(int));
+    POSE_invoke(workLarge(lm), worker, nbr, 0);
+    //CkPrintf("%d sending large work to %d at %d\n",myHandle,nbr,ovt);
+  }
+  int elapseCheck = sent * (1.0/localDensity);
   if (OVT() < elapseCheck) elapse(elapseCheck-OVT());
 }
 
index 62a8a1b2be50a0d9c46b8912b6c50829a7c4220f..dbf65613af8e355045c0663c4f8042fda4ceb617 100644 (file)
@@ -32,8 +32,7 @@
 
 class WorkerData {
  public:
-  int numObjs, numMsgs, msgSize, locality, density, grainSize, 
-    msgsPerWork;
+  int numObjs, numMsgs, msgSize, locality, density, grainSize;
   double granularity;
   WorkerData& operator=(const WorkerData& obj) {
     int i;
@@ -45,7 +44,6 @@ class WorkerData {
     grainSize = obj.grainSize;
     granularity = obj.granularity;
     density = obj.density;
-    msgsPerWork = obj.msgsPerWork;
     return *this;
   }
 };
@@ -53,9 +51,11 @@ class WorkerData {
 class SmallWorkMsg {
  public:
   int data[SM_MSG_SZ];
+  int fromPE;
   SmallWorkMsg& operator=(const SmallWorkMsg& obj) {
     eventMsg::operator=(obj);
     for (int i=0; i<SM_MSG_SZ; i++) data[i] = obj.data[i];
+    fromPE = obj.fromPE;
     return *this;
   }
 };
@@ -82,8 +82,9 @@ class LargeWorkMsg {
 
 
 class worker {
-  int numObjs, numMsgs, msgSize, locality, grainSize, density, msgsPerWork,
-    sent, totalObjs, elapseTime, elapseRem, neighbor;
+  int numObjs, numMsgs, msgSize, locality, grainSize, density, sent, totalObjs,
+    localMsgs, remoteMsgs, localNbr, remoteNbr, localCount, remoteCount,
+    fromLocal, fromRemote, received;
   double granularity, localDensity;
   int data[100];
  public:
@@ -94,8 +95,9 @@ class worker {
   void pup(PUP::er &p) { 
     chpt<state_worker>::pup(p); 
     p(numObjs); p(numMsgs); p(msgSize); p(density); p(localDensity);
-    p(locality); p(grainSize); p(granularity); p(msgsPerWork); p(sent);
-    p(totalObjs); p(elapseTime); p(elapseRem); p(neighbor);
+    p(locality); p(grainSize); p(granularity); p(sent); p(totalObjs); 
+    p(localMsgs); p(remoteMsgs); p(localNbr); p(remoteNbr); p(received);
+    p(localCount); p(remoteCount); p(fromLocal); p(fromRemote);
     p(data, 100);
   }
   void dump() {
@@ -103,6 +105,7 @@ class worker {
     CkPrintf("[worker: ");
   }
   void doWork();
+  void terminus();
 
   // Event methods
   void workSmall(SmallWorkMsg *m);
index ca31f5b044abee591197465b806198f69c26006d..3fbbb2561c38485555d081fc7ceca5532f701fa2 100644 (file)
@@ -71,7 +71,6 @@ main::main(CkArgMsg *m)
     wd->grainSize = grainSize;
     wd->granularity = granularity;
     wd->density = density;
-    wd->msgsPerWork = 10; //(lrand48() % 4) + 2;
 
     dest = map[i];
     wd->Timestamp(0);