doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-com / OneTimeMulticastStrategy.h
index 95c8056e10f3e9ce756b08a149d1a3ba1a0e6193..b2ef88f5d80e8823683c9df30384127808a5c18e 100644 (file)
@@ -54,12 +54,13 @@ class OneTimeMulticastStrategy: public Strategy, public CharmStrategy {
       @param [in] totalDestPEs The number of destination PEs to whom the message needs to be sent. This will always be > 0.
       @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 [in] rootPE The PE that created the multicast (is not listed in destPEs).
+      
       @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 );
+  virtual void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE , int * &pelist, int &npes);
 
     OneTimeMulticastStrategy(CkMigrateMessage *m): Strategy(m), CharmStrategy(m){}
   
@@ -88,7 +89,7 @@ class OneTimeMulticastStrategy: public Strategy, public CharmStrategy {
 class OneTimeRingMulticastStrategy: public OneTimeMulticastStrategy {
   
  public:
-  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, int * &pelist, int &npes );
+  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE , int * &pelist, int &npes);
 
  OneTimeRingMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
  OneTimeRingMulticastStrategy(): OneTimeMulticastStrategy() {}
@@ -111,7 +112,7 @@ class OneTimeTreeMulticastStrategy: public OneTimeMulticastStrategy {
   
  public:
   
-  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, int * &pelist, int &npes );
+  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE, int * &pelist, int &npes);
   
  OneTimeTreeMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
 
@@ -130,6 +131,57 @@ class OneTimeTreeMulticastStrategy: public OneTimeMulticastStrategy {
 
 
 
+/**
+ * A strategy that uses the topo-aware spanning tree builder to send msgs down a spanning tree 
+ * that is constructed in a network-topology aware manner if such info is available. Users 
+ * can specify the branching factor for the spanning tree
+ */
+class OneTimeTopoTreeMulticastStrategy: public OneTimeMulticastStrategy 
+{
+    private:
+        int degree;
+        
+    public:
+        OneTimeTopoTreeMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
+        /** Create a strategy with specified branching factor(which defaults to 4) */
+        OneTimeTopoTreeMulticastStrategy(int treeDegree=4): OneTimeMulticastStrategy(), degree(treeDegree) { }
+        ~OneTimeTopoTreeMulticastStrategy() {}
+        /// Determine the direct children of this PE in the spanning tree
+        void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE, int * &pelist, int &npes);
+        void pup(PUP::er &p)
+        { 
+            OneTimeMulticastStrategy::pup(p);
+            p | degree;
+        }
+        PUPable_decl(OneTimeTopoTreeMulticastStrategy);
+};
+
+
+
+/**
+   A strategy that does dimension ordered sending of messages. This may result in lower contention for torus networks than a topology oblivious tree.
+*/
+class OneTimeDimensionOrderedMulticastStrategy: public OneTimeMulticastStrategy {
+ public:
+  
+  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE, int * &pelist, int &npes);
+  
+ OneTimeDimensionOrderedMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
+
+  /** Create a strategy with specified branching factor(which defaults to 4) */
+ OneTimeDimensionOrderedMulticastStrategy(): OneTimeMulticastStrategy() {}
+
+  ~OneTimeDimensionOrderedMulticastStrategy() {}
+  
+  void pup(PUP::er &p){ 
+    OneTimeMulticastStrategy::pup(p); 
+  }
+  
+  PUPable_decl(OneTimeDimensionOrderedMulticastStrategy);
+ private:
+  int findMinMaxArray(int min, int len, int *array, bool* notincluded, int notIndex);
+};
+
 
 
 
@@ -142,7 +194,7 @@ class OneTimeNodeTreeMulticastStrategy: public OneTimeMulticastStrategy {
   
  public:
   
-  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, int * &pelist, int &npes );
+  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE, int * &pelist, int &npes);
   
  OneTimeNodeTreeMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
   
@@ -170,7 +222,7 @@ class OneTimeNodeTreeRingMulticastStrategy: public OneTimeMulticastStrategy {
   
  public:
   
-  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, int * &pelist, int &npes );
+  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE, int * &pelist, int &npes);
   
  OneTimeNodeTreeRingMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
   
@@ -187,10 +239,6 @@ class OneTimeNodeTreeRingMulticastStrategy: public OneTimeMulticastStrategy {
   PUPable_decl(OneTimeNodeTreeRingMulticastStrategy);
 };
 
-
-
-
-
 #endif
 
 /*@}*/