Chare Arrays: Add interface to signal online dynamic element insertion
authorPhil Miller <mille121@illinois.edu>
Fri, 6 Jul 2012 18:05:31 +0000 (18:05 +0000)
committerPhil Miller <mille121@illinois.edu>
Fri, 6 Jul 2012 18:13:28 +0000 (13:13 -0500)
The AMR benchmark code was having trouble with hangs around
AtSync-triggered load balancing, apparently related to the fact that
it was inserting new chare array elements after startup. In
discussions with Gengbin, we figured that this arose because the
additional elements were interfering with the count of local elements
used to determine when a processor's objects had all reached AtSync
and thus it could contribute its LB stats.

The backend infrastructure had interfaces to 'pause' the LB barrier
while new elements were being inserted, but this had never been
surfaced in a way usable by client code. Add a `beginInserting()`
method as an analogue to the existing `doneInserting()` method that
was already required at startup to surface that code.

Tested to resolve at least one kind of hang in the AMR code on BG/Q.

src/ck-core/ckarray.C
src/ck-core/ckarray.ci
src/ck-core/ckarray.h

index 969753bfb0aa5d977f6a4d55ba7c2197442c25c8..ea3cbb75f4f578d74c8613acd6163945445b6068 100644 (file)
@@ -954,11 +954,22 @@ void CProxy_ArrayBase::doneInserting(void)
   CProxy_CkArray(_aid).remoteDoneInserting();
 }
 
+void CProxy_ArrayBase::beginInserting(void)
+{
+  DEBC((AA"Broadcasting a beginInserting request\n"AB));
+  CProxy_CkArray(_aid).remoteBeginInserting();
+}
+
 void CkArray::doneInserting(void)
 {
   thisProxy[CkMyPe()].remoteDoneInserting();
 }
 
+void CkArray::beginInserting(void)
+{
+  thisProxy[CkMyPe()].remoteBeginInserting();
+}
+
 /// This is called on every processor after the last array insertion.
 void CkArray::remoteDoneInserting(void)
 {
@@ -971,6 +982,18 @@ void CkArray::remoteDoneInserting(void)
   }
 }
 
+void CkArray::remoteBeginInserting(void)
+{
+  CK_MAGICNUMBER_CHECK;
+
+  if (!isInserting) {
+    isInserting = CmiTrue;
+    DEBC((AA"Begin inserting objects\n"AB));
+    for (int l=0;l<listeners.size();l++) listeners[l]->ckBeginInserting();
+    locMgr->startInserting();
+  }
+}
+
 CmiBool CkArray::demandCreateElement(const CkArrayIndex &idx,
        int onPe,int ctor,CkDeliver_t type)
 {
index 3b14a9450bb7d2a6ed227fb91516985a5df421fa..79a6fe42d9c92125a914459971b5e3f35366d723 100644 (file)
@@ -9,6 +9,7 @@ module CkArray {
        entry CkArray(CkArrayOptions opts, CkMarshalledMessage ctorMsg, CkNodeGroupID nodereductionProxy);
        //Insertion
        entry void insertElement(CkMessage *);
+       entry void remoteBeginInserting(void);
        entry void remoteDoneInserting(void);
        //Broadcast
        entry void sendBroadcast(CkMessage *);
index 7aba76112d58937bb9b9cb0eb6143c919712996f..995e6204d6cc8c3455a2dacccfc451b25974a235 100644 (file)
@@ -350,6 +350,7 @@ public:
        unsigned int numLocalElements() const { return ckLocMgr()->numLocalElements(); }
 
        void doneInserting(void);
+       void beginInserting(void);
 
        CK_REDUCTION_CLIENT_DECL
 
@@ -688,7 +689,9 @@ public:
   /// Create initial array elements:
   virtual void insertInitial(const CkArrayIndex &idx,void *ctorMsg,int local=1);
   virtual void doneInserting(void);
+  virtual void beginInserting(void);
   void remoteDoneInserting(void);
+  void remoteBeginInserting(void);
 
   /// Create manually:
   virtual CmiBool insertElement(CkMessage *);