Made crack2D threads to deposit LB Data on behalf of the chunks.
authorMilind Bhandarkar <milind@cs.uiuc.edu>
Tue, 29 Aug 2000 01:29:17 +0000 (01:29 +0000)
committerMilind Bhandarkar <milind@cs.uiuc.edu>
Tue, 29 Aug 2000 01:29:17 +0000 (01:29 +0000)
Made a few members of the ArrayElement, and CkArray public in order
to do that. Also found a source of inefficiency (and also a bug) where
CkArray::Send was used as an entry method, and not an ordinary method
of CkArray for sending messages ot other objects from array elements.
Also, the id[0] of LDHandle did not contain the array element index in 1D
case as was the case earlier. MetisLB was depending on that to collect
communication data for the graph partitioner, and was segfaulting.

examples/fem/crack2D/driver.C
src/ck-core/ckarray.C
src/ck-core/ckarray.h
src/ck-ldb/CentralLB.C
src/ck-ldb/MetisLB.C
src/libs/ck-libs/fem/fem.C
src/libs/ck-libs/fem/fem.ci
src/libs/ck-libs/fem/fem.h

index 2fce7adb2698ad6dd600ba9235bd0242dee112f0..373659c6f1f267a6e2e1d2a20ed4789e39aaabe3 100644 (file)
@@ -121,15 +121,25 @@ updateNodes(GlobalData *gd, double prop, double slope)
   }
 }
 
+extern "C" double CmiCpuTimer(void);
+static void
+_DELAY_(int microsecs)
+{
+  double upto = CmiCpuTimer() + 1.e-6 * microsecs;
+  while(upto > CmiCpuTimer());
+}
+
 extern "C" void
 driver(int nn, int *nnums, int ne, int *enums, int npere, int *conn)
 {
+  int myid = FEM_My_Partition();
+  // CkPrintf("[%d] starting driver\n", myid);
   GlobalData *gd = new GlobalData;
   FEM_Register((void*)gd, (FEM_Packsize_Fn)mypksz, (FEM_Pack_Fn)mypk,
                (FEM_Unpack_Fn)myupk);
   Node *nodes = new Node[nn];
   Element *elements = new Element[ne];
-  gd->myid = FEM_My_Partition();
+  gd->myid = myid;
   gd->nn = nn;
   gd->nnums = nnums;
   gd->ne = ne;
@@ -148,9 +158,10 @@ driver(int nn, int *nnums, int ne, int *enums, int npere, int *conn)
   int kk = -1;
   double prop, slope;
   double stime, etime;
-  stime = CkTimer();
+  int phase = 0;
   for(i=0;i<gd->nTime;i++)
   {
+    stime = CkWallTimer();
     // CkPrintf("[%d] iteration %d at %lf secs\n", gd->myid, i, CkTimer());
     if (gd->ts_proportion[kk+1] == i)
     {
@@ -167,18 +178,26 @@ driver(int nn, int *nnums, int ne, int *enums, int npere, int *conn)
     initNodes(gd);
     lst_NL(gd);
     lst_coh2(gd);
+    if(myid==3 && i>20)
+    {
+      int biter = (i < 30 ) ? i : 30;
+      _DELAY_((biter-20)*5000);
+    }
     updateNodes(gd, prop, slope);
     FEM_Update_Field(rfield, gd->nodes);
-    // FIXME: Place holder for now.
-    FEM_Migrate();
-    gd = (GlobalData*) FEM_Get_Userdata();
-    gd->nnums = FEM_Get_Node_Nums();
-    gd->enums = FEM_Get_Elem_Nums();
-    gd->conn = FEM_Get_Conn();
+    if(i%20==19)
+    {
+      FEM_Migrate();
+      gd = (GlobalData*) FEM_Get_Userdata();
+      gd->nnums = FEM_Get_Node_Nums();
+      gd->enums = FEM_Get_Elem_Nums();
+      gd->conn = FEM_Get_Conn();
+    }
+    etime = CkWallTimer();
+    if(gd->myid == 0)
+      CkPrintf("Iter=%d\tTime=%lf seconds\n", i, (etime-stime));
   }
-  etime = CkTimer();
-  if(gd->myid == 0)
-    CkPrintf("Time per iteration = %lf seconds\n", (etime-stime)/gd->nTime);
+  // CkPrintf("[%d] exiting driver\n", myid);
 }
 
 extern "C" void
index 1c40ff2500b4d29308fb256ec65edaf6f7f35d9e..901b4d4a1d399c8bd0ec41028c336b2b327c361d 100644 (file)
@@ -153,8 +153,12 @@ static LDObjid idx2LDObjid(const CkArrayIndex &idx)
   const unsigned char *data=idx.getKey(len);
   const int *id=(const int *)data;
   lenInInts = len/sizeof(int);
+  /* FIXME: This is Orion's version. It breaks the common 1D case.
   for (i=0;i<lenInInts;i++)
     r.id[i%OBJ_ID_SZ]^=id[i]+(id[i]<<(24+i/4));
+  */
+  for (i=0;i<lenInInts;i++)
+    r.id[i%OBJ_ID_SZ] = id[i];
   return r;
 }
 #endif
@@ -1302,7 +1306,8 @@ void CProxy_CkArrayBase::send(CkArrayMessage *msg, int entryIndex)
        msg->type.msg.entryIndex = entryIndex;
        msg->type.msg.hopCount = 0;
        msg=msg->insert(*_idx);//Insert array index into message
-       CProxy_CkArray(_aid).Send(msg, CkMyPe());
+       // CProxy_CkArray(_aid).Send(msg, CkMyPe());
+       CProxy_CkArray(_aid).ckLocalBranch()->Send(msg);
        delete _idx;
        _idx = NULL;
 }
index d2a7f0341d20885be2b024e25cc6255a8080c703..dbb9677635a879f2215ee117477d5c09dcf7eaf2 100644 (file)
@@ -276,8 +276,8 @@ protected:
   void AtSync(void);
   virtual void ResumeFromSync(void);
   CmiBool usesAtSync;//You must set this in the constructor to use AtSync().
-private: //Load balancer state:
   LDObjHandle ldHandle;//Transient (not migrated)
+private: //Load balancer state:
   LDBarrierClient ldBarrierHandle;//Transient (not migrated)  
   static void staticResumeFromSync(void* data);
   static void staticMigrate(LDObjHandle h, int dest);
@@ -390,6 +390,7 @@ public:
   void SendBroadcast(CkArrayMessage *msg);
   void RecvBroadcast(CkArrayMessage *msg);
   
+  LBDatabase *the_lbdb;
 private:
 #if CMK_LBDB_ON
   LDBarrierClient dummyBarrierHandle;
@@ -405,7 +406,6 @@ private:
   void queryLoad(LDOMHandle _h);
   
   LDOMHandle myLBHandle;
-  LBDatabase *the_lbdb;
 #endif
   //This flag lets us detect element suicide, so we can stop timing
   CmiBool curElementIsDead;
index 60c15cc34c896a8cb9dc2d04cfb5f7224ec9c68e..d2a754291a806ed861508e141534ce51105d60ed 100644 (file)
@@ -101,8 +101,8 @@ void CentralLB::ProcessAtSync()
 {
   if (CkMyPe() == cur_ld_balancer) {
     start_lb_time = CmiWallTimer();
-    CkPrintf("Load balancing step %d starting at %f in %d\n",
-            step(),start_lb_time, cur_ld_balancer);
+    // CkPrintf("Load balancing step %d starting at %f in %d\n",
+            // step(),start_lb_time, cur_ld_balancer);
   }
   // Send stats
   int sizes[2];
@@ -256,8 +256,8 @@ void CentralLB::MigrationDone()
 {
   if (CkMyPe() == cur_ld_balancer) {
     double end_lb_time = CmiWallTimer();
-    CkPrintf("Load balancing step %d finished at %f duration %f\n",
-            step(),end_lb_time,end_lb_time - start_lb_time);
+    // CkPrintf("Load balancing step %d finished at %f duration %f\n",
+            // step(),end_lb_time,end_lb_time - start_lb_time);
   }
   migrates_completed = 0;
   migrates_expected = -1;
index 6348742e079ed241c591a6da5c950c24e8f56fe3..65c4cccd5af31fd15bbf1bd5b5b798d0067b58bb 100644 (file)
@@ -192,8 +192,8 @@ CLBMigrateMsg* MetisLB::Strategy(CentralLB::LDStats* stats, int count)
     xadj[i+1] = count4all;
   }
 
-  //  CkPrintf("Pre-LDB Statistics step %d\n", step());
-  //  printStats(count, numobjs, objtime, comm, origmap);
+  //CkPrintf("Pre-LDB Statistics step %d\n", step());
+  //printStats(count, numobjs, objtime, comm, origmap);
 
   int wgtflag = 3; // Weights both on vertices and edges
   int numflag = 0; // C Style numbering
@@ -275,8 +275,8 @@ CLBMigrateMsg* MetisLB::Strategy(CentralLB::LDStats* stats, int count)
       CkPrintf("multiple constraints not implemented yet.\n");
     }
   }
-  //  CkPrintf("Post-LDB Statistics step %d\n", step());
-  //  printStats(count, numobjs, objtime, comm, newmap);
+  //CkPrintf("Post-LDB Statistics step %d\n", step());
+  //printStats(count, numobjs, objtime, comm, newmap);
 
   for(i=0;i<numobjs;i++)
     delete[] comm[i];
index 5135e50a64a851474412ba511126fe260e5ca232..bdd62d9d1d257af938adda1359be9183dbc812b5 100644 (file)
@@ -93,6 +93,7 @@ _allReduceHandler(void *, int datasize, void *data)
 }
 
 static main* _mainptr = 0;
+extern void CreateMetisLB(void);
 
 main::main(CkArgMsg *am)
 {
@@ -110,6 +111,7 @@ main::main(CkArgMsg *am)
       break;
     }
   }
+  CreateMetisLB();
   _femaid = CProxy_chunk::ckNew(_nchunks);
   CProxy_chunk farray(_femaid);
   farray.setReductionClient(_allReduceHandler, 0);
@@ -366,6 +368,7 @@ combine(const DType& dt, void* lhs, void* rhs, int op)
 
 chunk::chunk(void)
 {
+  usesAtSync = CmiTrue;
   ntypes = 0;
   new_DT(FEM_BYTE);
   new_DT(FEM_INT);
@@ -400,19 +403,25 @@ chunk::callDriver(void)
 void
 chunk::run(ChunkMsg *msg)
 {
+  start_running();
   CtvInitialize(chunk*, _femptr);
   CtvAccess(_femptr) = this;
   readChunk(msg);
   callDriver();
+  // Note: "this may have changed after we come back here 
+  CtvAccess(_femptr)->stop_running();
 }
 
 void
 chunk::run(void)
 {
+  start_running();
   CtvInitialize(chunk*, _femptr);
   CtvAccess(_femptr) = this;
   readChunk();
   callDriver();
+  // Note: "this may have changed after we come back here 
+  CtvAccess(_femptr)->stop_running();
 }
 
 void
@@ -474,7 +483,9 @@ chunk::update(int fid, void *nodes)
   if (nRecd != numPes) {
     wait_for = seqnum;
     tid = CthSelf();
+    stop_running();
     CthSuspend();
+    start_running();
     wait_for = 0;
     tid = 0;
   }
@@ -546,7 +557,9 @@ chunk::reduce(int fid, void *inbuf, void *outbuf, int op)
   contribute(len, inbuf, rtype);
   curbuf = outbuf;
   tid = CthSelf();
+  stop_running();
   CthSuspend();
+  start_running();
 }
 
 void
@@ -787,9 +800,8 @@ chunk::pup(PUP::er &p)
   if(p.isUnpacking())
   {
     tid = CthUnpackThread(p.getBuf());
-    CthAwaken(tid);
+    // CthAwaken(tid);
     CtvAccessOther(tid,_femptr) = this;
-    tid = 0;
   }
   p.advance(tsize);
   p(seqnum);
@@ -902,24 +914,18 @@ FEM_Get_Userdata(void)
   return cptr->get_userdata();
 }
 
-// FIXME: Place Holder
 extern "C" void
 FEM_Migrate(void)
 {
   chunk *cptr = CtvAccess(_femptr);
   cptr->tid = CthSelf();
   int idx = cptr->thisIndex;
-  int mype = CkMyPe();
-  int npes = CkNumPes();
-  int tope = (mype+1)%npes;
   CProxy_chunk cproxy(_femaid);
-  cproxy[idx].migrate(new MigrateInfo(tope));
+  cproxy[idx].migrate();
+  cptr->stop_running();
   CthSuspend();
-  if(CkMyPe()!=tope)
-  {
-    CkError("[%d] wanted to go to %d but went to %d!\n",idx,tope,CkMyPe());
-    CkAbort("");
-  }
+  cptr = CtvAccess(_femptr);
+  cptr->start_running();
 }
 
 extern "C" void 
index 3ed12077bc1af7becf63ac549e1ba147d8f15e1d..78bdc92b7bd8b1874b21dcc2a4777902b7eb128e 100644 (file)
@@ -1,10 +1,10 @@
 mainmodule fem {
+  extern module MetisLB;
   readonly CkChareID _mainhandle;
   readonly CkArrayID _femaid;
   readonly unsigned int _nchunks;
   message [varsize] DataMsg;
   message [packed] ChunkMsg;
-  message MigrateInfo;
   mainchare main {
     entry main();
     entry void done(void);
@@ -15,6 +15,6 @@ mainmodule fem {
     entry [threaded] void run(ChunkMsg*);
     entry void recv(DataMsg *);
     entry void result(DataMsg *);
-    entry void migrate(MigrateInfo *);
+    entry void migrate(void);
   };
 };
index c72cdeca7458123ed1dd04176a9cb2795a10ff3d..11c421fc0f179d722a216f2ce884fc45a00c079f 100644 (file)
@@ -103,13 +103,6 @@ class ChunkMsg : public CMessage_ChunkMsg {
   static ChunkMsg *unpack(void *);
 };
 
-class MigrateInfo :public CMessage_MigrateInfo
-{
- public:
-  int where;
-  MigrateInfo(int w) : where(w) {}
-};
-
 #define MAXDT 20
 
 class chunk : public ArrayElement1D
@@ -155,7 +148,19 @@ class chunk : public ArrayElement1D
   void run(ChunkMsg*);
   void recv(DataMsg *);
   void result(DataMsg *);
-  void migrate(MigrateInfo *msg) { migrateMe(msg->where); delete msg; }
+  void migrate(void)
+  {
+    // CkPrintf("[%d] going to sync\n", thisIndex);
+    AtSync();
+  }
+  void start_running(void)
+  {
+    thisArray->the_lbdb->ObjectStart(ldHandle);
+  }
+  void stop_running(void)
+  {
+    thisArray->the_lbdb->ObjectStop(ldHandle);
+  }
   int new_DT(int base_type, int vec_len=1, int init_offset=0, int distance=0) {
     if(ntypes==MAXDT) {
       CkAbort("FEM: registered datatypes limit exceeded.");
@@ -185,6 +190,12 @@ class chunk : public ArrayElement1D
     valid_udata = 1;
   }
   void pup(PUP::er &p);
+  void ResumeFromSync(void)
+  {
+    // CkPrintf("[%d] returned from sync\n", thisIndex);
+    CthAwaken(tid);
+    tid = 0;
+  }
  private:
   FILE *fp;
   void update_field(DataMsg *);