NDMeshStreamer: added an overloaded init function that takes a CkArrayID
authorLukasz Wesolowski <wesolwsk@illinois.edu>
Wed, 20 Jun 2012 00:17:27 +0000 (19:17 -0500)
committerLukasz Wesolowski <wesolwsk@illinois.edu>
Wed, 20 Jun 2012 00:17:27 +0000 (19:17 -0500)
as input and uses it to determine the local number of contributors in the
common case when each local array element of a single chare array
is a contributor.

src/libs/ck-libs/NDMeshStreamer/NDMeshStreamer.ci
src/libs/ck-libs/NDMeshStreamer/NDMeshStreamer.h

index 0a6781d59d81ced377662400d3f653f419d28664..a2fe9e15544d3dac8b9f91d2711725a686344600 100644 (file)
@@ -57,6 +57,9 @@ module NDMeshStreamer {
          const CProxy_MeshStreamerArrayClient<dtype> &clientProxy,
          int bufferSize, bool yieldFlag = 0, 
          double progressPeriodInMs = -1.0);
+
+    entry void init(CkArrayID senderArrayID, CkCallback startCb, 
+                   CkCallback endCb, int prio); 
   };
 
 };
index 5bd7622e1e2c28c9cf1aeb7d66d7507abd345f9b..194eb096acc4cd39a89c00b8646819af4bd9632c 100644 (file)
@@ -208,7 +208,8 @@ public:
 #endif
   }
 
-  void init(int numLocalContributors, CkCallback startCb, CkCallback endCb, int prio);
+  void init(int numLocalContributors, CkCallback startCb, CkCallback endCb, 
+            int prio);
   
   void startStagedCompletion() {          
     if (individualDimensionSizes_[dimensionToFlush_] != 1) {
@@ -565,6 +566,11 @@ void MeshStreamer<dtype>::init(int numLocalContributors, CkCallback startCb,
   numLocalDone_ = 0; 
   numLocalContributors_ = numLocalContributors; 
   initLocalClients();
+
+  if (numLocalContributors_ == 0) {
+    startStagedCompletion();
+  }
+
   this->contribute(startCb);
 }
 
@@ -1092,6 +1098,14 @@ public:
 #endif
   }
 
+  void init(CkArrayID senderArrayID, CkCallback startCb, 
+            CkCallback endCb, int prio) {
+    CkArray *senderArrayMgr = senderArrayID.ckLocalBranch();
+    int numLocalElements = senderArrayMgr->getLocMgr()->numLocalElements();
+    MeshStreamer<ArrayDataItem<dtype, itype> >::init(
+                 numLocalElements, startCb, endCb, prio); 
+  }
+
   void receiveAtDestination(
        MeshStreamerMessage<ArrayDataItem<dtype, itype> > *msg) {