Simplify set of parameters to determineNextHopPEs(). Add more documentation.
authorIsaac Dooley <idooley2@illinois.edu>
Wed, 24 Jun 2009 20:38:25 +0000 (20:38 +0000)
committerIsaac Dooley <idooley2@illinois.edu>
Wed, 24 Jun 2009 20:38:25 +0000 (20:38 +0000)
src/ck-com/OneTimeMulticastStrategy.C
src/ck-com/OneTimeMulticastStrategy.h

index a7ef31daa7cb9e6439f1f5fcd543e5e7cf1bb0c1..95857f32f9a84d5fd54803f6b223f0f14678780e 100644 (file)
@@ -88,8 +88,8 @@ void OneTimeMulticastStrategy::remoteMulticast(ComlibMulticastMsg * multMsg, boo
   }
   
   CkAssert(myIndex != -10000); // Sanity check
-    
-  determineNextHopPEs(multMsg, myIndex, pelist, npes );
+  
+  determineNextHopPEs(totalDestPEs, multMsg->indicesCount, myIndex, pelist, npes );
   
   if(npes == 0) {
     CmiFree(env);
@@ -117,29 +117,6 @@ void OneTimeMulticastStrategy::remoteMulticast(ComlibMulticastMsg * multMsg, boo
 }
 
 
-/** 
-    Fill in pelist and npes to which the multicast message will be forwarded from this PE.
-    Caller should delete pelist if npes>0.
-*/
-void OneTimeMulticastStrategy::determineNextHopPEs(ComlibMulticastMsg * multMsg, int myIndex, int * &pelist, int &npes ) {
-  if(myIndex==-1){
-    // We are at a root node of the spanning tree. 
-    // We will forward the message to all other PEs in the destination list.
-    npes = multMsg->nPes;
-    
-    pelist = new int[npes];
-    for (int i=0; i<npes; ++i) {
-      pelist[i] = multMsg->indicesCount[i].pe;
-    }
-  } else {
-    // We are at a leaf node of the spanning tree. 
-    npes = 0;
-  }
-  
-}
-
-
-
 
 /** 
     Receive an incoming multicast message(sent from OneTimeMulticastStrategy::remoteMulticast).
@@ -171,13 +148,25 @@ void OneTimeMulticastStrategy::handleMessage(void *msg){
 
 
 
+void OneTimeMulticastStrategy::determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, int * &pelist, int &npes) {
+  if(myIndex==-1){
+    // We are at a root node of the spanning tree. 
+    // We will forward the message to all other PEs in the destination list.
+    npes = totalDestPEs;
+    
+    pelist = new int[npes];
+    for (int i=0; i<npes; ++i) {
+      pelist[i] = destPEs[i].pe;
+    }
+  } else {
+    // We are at a leaf node of the spanning tree. 
+    npes = 0;
+  }
+  
+}
+
 
-/** 
-    Fill in pelist and npes to which the multicast message will be forwarded from this PE.
-    Caller should delete pelist if npes>0.
-*/
-void OneTimeRingMulticastStrategy::determineNextHopPEs(ComlibMulticastMsg * multMsg, int myIndex, int * &pelist, int &npes ) {
-  const int totalDestPEs = multMsg->nPes;
+void OneTimeRingMulticastStrategy::determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, int * &pelist, int &npes) {
   const int myPe = CkMyPe();
 
   if(myIndex == totalDestPEs-1){
@@ -188,20 +177,13 @@ void OneTimeRingMulticastStrategy::determineNextHopPEs(ComlibMulticastMsg * mult
     // All non-final PEs will send to next PE in list
     npes = 1;
     pelist = new int[1];
-    pelist[0] = multMsg->indicesCount[myIndex+1].pe;
+    pelist[0] = destPEs[myIndex+1].pe;
   }
 
 }
 
 
-
-
-/** 
-    Fill in pelist and npes to which the multicast message will be forwarded from this PE.
-    Caller should delete pelist if npes>0.
-*/
-void OneTimeTreeMulticastStrategy::determineNextHopPEs(ComlibMulticastMsg * multMsg, int myIndex, int * &pelist, int &npes ) {
-  const int totalDestPEs = multMsg->nPes;
+void OneTimeTreeMulticastStrategy::determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, int * &pelist, int &npes){
   const int myPe = CkMyPe();
   
   // The logical indices start at 0 = root node. Logical index i corresponds to the entry i+1 in the array of PEs in the message
@@ -219,8 +201,7 @@ void OneTimeTreeMulticastStrategy::determineNextHopPEs(ComlibMulticastMsg * mult
     npes = 0;
     return;
   }
-  
-
 #if DEBUG
   if(numSend > 0)
     CkPrintf("Tree logical index %d sending to logical %d to %d (totalDestPEs excluding root=%d)  numSend=%d\n",
@@ -232,7 +213,7 @@ void OneTimeTreeMulticastStrategy::determineNextHopPEs(ComlibMulticastMsg * mult
   
   for(int i=0;i<numSend;i++){
     CkAssert(sendLogicalIndexStart-1+i < totalDestPEs);
-    pelist[i] = multMsg->indicesCount[sendLogicalIndexStart-1+i].pe;
+    pelist[i] = destPEs[sendLogicalIndexStart-1+i].pe;
 #if DEBUG
     CkPrintf("Tree logical index %d sending to PE %d\n", myIndex+1, pelist[i]);
 #endif
index 46c8be78bbbe7ca4d2a04545fc8a6c91a6b01d7f..d5ad236166e520571f4e26e8a88aa9042d42835a 100644 (file)
 
    The local messages are delivered through the array manager using the CharmStrategy::deliverToIndices methods. If a destination chare is remote, the array manager will forward it on to the pe that contains the chare.
    
+   To create a new strategy:
+   <ul>
+   <li>Add a class declaration similar to the ones below, making sure they inherit from OneTimeMulticastStrategy. 
+   <li>Add a PUPable entry in ComlibManager.ci 
+   <li>Implement determineNextHopPEs in OneTimeMulticastStrategy.C. See information for OneTimeMulticastStrategy::determineNextHopPEs .
+   </ul>
+
+@todo  Buffer messages until strategy is fully enabled. The current version might have some startup issues if the multicast is used too early.
+
+@todo  Implement topology aware subclasses. 
+
 */
 class OneTimeMulticastStrategy: public Strategy, public CharmStrategy {
  private:
@@ -32,9 +43,21 @@ class OneTimeMulticastStrategy: public Strategy, public CharmStrategy {
   
  public:
 
-  virtual void determineNextHopPEs(ComlibMulticastMsg * multMsg, int myIndex, int * &pelist, int &npes );
-  
- OneTimeMulticastStrategy(CkMigrateMessage *m): Strategy(m), CharmStrategy(m){}
+  /** 
+      Determine the set of PEs to which the message should be forwarded from this PE.
+      Fill in pelist and npes to which the multicast message will be forwarded from this PE.
+
+      @param [in] totalDestPEs The number of destination PEs to whom the message needs to be sent. 
+      @param [in] destPEs The list of PEs that eventually will be sent the message.
+      @param [in] myIndex The index into destPEs for this PE.
+
+      @param [out] pelist A list of PEs to which the message will be sent after this function returns. This function allocates the array with new. The caller will free it with delete[] if npes>0.
+      @param [out] npes The size of pelist
+
+  */
+  virtual void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, int * &pelist, int &npes );
+
+    OneTimeMulticastStrategy(CkMigrateMessage *m): Strategy(m), CharmStrategy(m){}
   
   OneTimeMulticastStrategy();
   ~OneTimeMulticastStrategy();
@@ -56,12 +79,12 @@ class OneTimeMulticastStrategy: public Strategy, public CharmStrategy {
 
 
 /**
-   A OneTimeMulticastStrategy that sends along a ring
+   A strategy that sends along a ring through the destination processors.
 */
 class OneTimeRingMulticastStrategy: public OneTimeMulticastStrategy {
   
  public:
-  void determineNextHopPEs(ComlibMulticastMsg * multMsg, int myIndex, int * &pelist, int &npes );
+  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, int * &pelist, int &npes );
 
  OneTimeRingMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
  OneTimeRingMulticastStrategy(): OneTimeMulticastStrategy() {}
@@ -76,7 +99,7 @@ class OneTimeRingMulticastStrategy: public OneTimeMulticastStrategy {
 
 
 /**
-   A OneTimeMulticastStrategy that sends along a tree of arbitrary degree
+   A strategy that sends along a tree with user specified branching factor.
 */
 class OneTimeTreeMulticastStrategy: public OneTimeMulticastStrategy {
  private:
@@ -84,10 +107,13 @@ class OneTimeTreeMulticastStrategy: public OneTimeMulticastStrategy {
   
  public:
   
-  void determineNextHopPEs(ComlibMulticastMsg * multMsg, int myIndex, int * &pelist, int &npes );
+  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, int * &pelist, int &npes );
   
  OneTimeTreeMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
+
+  /** Create a strategy with specified branching factor(which defaults to 4) */
  OneTimeTreeMulticastStrategy(int treeDegree=4): OneTimeMulticastStrategy(), degree(treeDegree) {}
+
   ~OneTimeTreeMulticastStrategy() {}
   
   void pup(PUP::er &p){ 
@@ -96,7 +122,6 @@ class OneTimeTreeMulticastStrategy: public OneTimeMulticastStrategy {
   }
   
   PUPable_decl(OneTimeTreeMulticastStrategy);
-  
 };