doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-com / OneTimeMulticastStrategy.h
index 8f64f522ebf38df958da29ed71cc44232ca1c429..b2ef88f5d80e8823683c9df30384127808a5c18e 100644 (file)
 #include "ComlibSectionInfo.h"
 
 /**
 #include "ComlibSectionInfo.h"
 
 /**
-   The simplest multicast strategy. This strategy extracts the array section information, and packs the section information and the user message into a single message. The original message is delivered locally, and the new message is sent using CmiSyncListSendAndFree to all other processors containing destination objects. 
+   The simplest multicast strategy. This strategy extracts the array section information, and packs the section information and the user message into a single message. The original message is delivered locally, and the new message is sent using CmiSyncListSendAndFree to all other processors containing destination objects. If the destination entry method is [nokeep], then the multicast is delivered inline without extra copies to the local destination elements. If the destination is not [nokeep], then the message is delivered through the scheduler queue.  
+
+   Projections can trace the messages for the [nokeep] destinations, but the sending entry method will end prematurely because inline calling of local entry methods is not fully supported by Projections. Messages multicast to non [nokeep] methods are displayed incorrectly, probably because the call to deliver overwrites the source pe & event.
+
+@fixme Fix projections logging for the non [nokeep] version
 
    This strategy is simpler than those which are derived from the MulticastStrategy class because those maintain a persistant record of previous array section information extracted from the messages, and those provide multiple implementations of the multicast tree (such as ring or multiring or all to all). Those strategies ought to be used when multiple multicasts are sent to the same array section. If an array section is not reused, then this strategy ought to be used.
 
 
    This strategy is simpler than those which are derived from the MulticastStrategy class because those maintain a persistant record of previous array section information extracted from the messages, and those provide multiple implementations of the multicast tree (such as ring or multiring or all to all). Those strategies ought to be used when multiple multicasts are sent to the same array section. If an array section is not reused, then this strategy ought to be used.
 
@@ -47,15 +51,16 @@ class OneTimeMulticastStrategy: public Strategy, public CharmStrategy {
       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.
 
       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] 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] 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
 
   */
       @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){}
   
 
     OneTimeMulticastStrategy(CkMigrateMessage *m): Strategy(m), CharmStrategy(m){}
   
@@ -84,7 +89,7 @@ class OneTimeMulticastStrategy: public Strategy, public CharmStrategy {
 class OneTimeRingMulticastStrategy: public OneTimeMulticastStrategy {
   
  public:
 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() {}
 
  OneTimeRingMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
  OneTimeRingMulticastStrategy(): OneTimeMulticastStrategy() {}
@@ -107,7 +112,7 @@ class OneTimeTreeMulticastStrategy: public OneTimeMulticastStrategy {
   
  public:
   
   
  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) {}
 
   
  OneTimeTreeMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
 
@@ -126,11 +131,62 @@ 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);
+};
+
 
 
 
 /**
 
 
 
 /**
-   A node-aware strategy that sends along a node-based tree with user specified branching factor.
+   A node-aware strategy that sends along a node-based tree with user specified branching factor. Once the message reaches the PE representative for each node, it is forwarded from the PE to all other destination PEs on the node. This strategy can result in imbalanced loads. The PEs along the tree have higher load than the other PEs.
 */
 class OneTimeNodeTreeMulticastStrategy: public OneTimeMulticastStrategy {
  private:
 */
 class OneTimeNodeTreeMulticastStrategy: public OneTimeMulticastStrategy {
  private:
@@ -138,7 +194,7 @@ class OneTimeNodeTreeMulticastStrategy: public OneTimeMulticastStrategy {
   
  public:
   
   
  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) {}
   
   
  OneTimeNodeTreeMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
   
@@ -157,6 +213,31 @@ class OneTimeNodeTreeMulticastStrategy: public OneTimeMulticastStrategy {
 
 
 
 
 
 
+/**
+   A node-aware strategy that sends along a node-based tree with user specified branching factor. Once the message arrives at the first PE on the node, it is forwarded to the other PEs on the node through a ring.
+*/
+class OneTimeNodeTreeRingMulticastStrategy: public OneTimeMulticastStrategy {
+ private:
+  int degree;
+  
+ public:
+  
+  void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE, int * &pelist, int &npes);
+  
+ OneTimeNodeTreeRingMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
+  
+  /** Create a strategy with specified branching factor(which defaults to 4) */
+ OneTimeNodeTreeRingMulticastStrategy(int treeDegree=4): OneTimeMulticastStrategy(), degree(treeDegree) {}
+  
+  ~OneTimeNodeTreeRingMulticastStrategy() {}
+  
+  void pup(PUP::er &p){ 
+    OneTimeMulticastStrategy::pup(p); 
+    p | degree;
+  }
+  
+  PUPable_decl(OneTimeNodeTreeRingMulticastStrategy);
+};
 
 #endif
 
 
 #endif