Adding some new multicast strategies.
[charm.git] / src / ck-com / OneTimeMulticastStrategy.h
1 /**
2    @addtogroup ComlibCharmStrategy
3    @{
4    
5    @file 
6  
7 */
8
9 #ifndef ONE_TIME_MULTICAST_STRATEGY
10 #define ONE_TIME_MULTICAST_STRATEGY
11
12 #include "ComlibManager.h"
13 #include "ComlibSectionInfo.h"
14
15 /**
16    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. 
17
18    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.
19
20    A class can be created which inherits from this class, but provides its own determineNextHopPEs method to specify any type of desired spanning tree. For example, OneTimeRingMulticastStrategy forwards the multicast messages in a ring while OneTimeTreeMulticastStrategy forwards messages along a tree of specified degree. In the future, topology aware (both network and core/cpu/node) strategies should be added.
21
22    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.
23    
24 */
25 class OneTimeMulticastStrategy: public Strategy, public CharmStrategy {
26  private:
27   
28   ComlibSectionInfo sinfo; // This is used to create the multicast messages themselves
29
30   void remoteMulticast(ComlibMulticastMsg * multMsg, bool rootPE);
31   void localMulticast(CharmMessageHolder *cmsg);
32   
33  public:
34
35   virtual void determineNextHopPEs(ComlibMulticastMsg * multMsg, int myIndex, int * &pelist, int &npes );
36   
37  OneTimeMulticastStrategy(CkMigrateMessage *m): Strategy(m), CharmStrategy(m){}
38   
39   OneTimeMulticastStrategy();
40   ~OneTimeMulticastStrategy();
41   
42   void insertMessage(MessageHolder *msg) {insertMessage((CharmMessageHolder*)msg);}
43   void insertMessage(CharmMessageHolder *msg);
44   
45   ///Called by the converse handler function
46   void handleMessage(void *msg);    
47
48   void pup(PUP::er &p);
49
50   PUPable_decl(OneTimeMulticastStrategy);
51
52 };
53
54
55
56
57
58 /**
59    A OneTimeMulticastStrategy that sends along a ring
60 */
61 class OneTimeRingMulticastStrategy: public OneTimeMulticastStrategy {
62   
63  public:
64   void determineNextHopPEs(ComlibMulticastMsg * multMsg, int myIndex, int * &pelist, int &npes );
65
66  OneTimeRingMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
67  OneTimeRingMulticastStrategy(): OneTimeMulticastStrategy() {}
68   ~OneTimeRingMulticastStrategy() {}
69   
70   void pup(PUP::er &p){ OneTimeMulticastStrategy::pup(p); }
71   
72   PUPable_decl(OneTimeRingMulticastStrategy);
73
74 };
75
76
77
78 /**
79    A OneTimeMulticastStrategy that sends along a tree of arbitrary degree
80 */
81 class OneTimeTreeMulticastStrategy: public OneTimeMulticastStrategy {
82  private:
83   int degree;
84   
85  public:
86   
87   void determineNextHopPEs(ComlibMulticastMsg * multMsg, int myIndex, int * &pelist, int &npes );
88   
89  OneTimeTreeMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
90  OneTimeTreeMulticastStrategy(int treeDegree=4): OneTimeMulticastStrategy(), degree(treeDegree) {}
91   ~OneTimeTreeMulticastStrategy() {}
92   
93   void pup(PUP::er &p){ 
94     OneTimeMulticastStrategy::pup(p); 
95     p | degree;
96   }
97   
98   PUPable_decl(OneTimeTreeMulticastStrategy);
99   
100 };
101
102
103
104 #endif
105
106 /*@}*/