adds RectMulticastStrategy. Depends on BGML native layer on BG/L.
[charm.git] / src / ck-com / RectMulticastStrategy.h
1 #ifndef RECT_MULTICAST_STRATEGY
2 #define RECT_MULTICAST_STRATEGY
3
4 // only works on BG/L Native Layer
5
6 #include "ComlibManager.h"
7 #include "ComlibSectionInfo.h"
8
9 typedef CkHashtableTslow < unsigned int, void *> comRectHashType;
10 //typedef CkHashtableT < unsigned int, int > comRectHashType;
11
12 CkpvExtern(comRectHashType *, com_rect_ptr);
13
14
15 // need place to record 'src in rectangle' state
16 class ComlibRectSectionHashObject : public ComlibSectionHashObject
17 {
18  public:
19   bool sourceInRectangle;
20   int cornerRoot;
21   CkArrayID aid;
22 };
23
24 void *DMHandler(void *msg);
25 /**
26  * Main class for multicast strategies. It defaults to sending a direct message
27  * to all the processors involved in the multicast.
28
29  * The definition of the section, as well as the location of all the elements in
30  * the processors is determined by the sending processor. The other will obey to
31  * it, even some elements have already migrated elsewhere.
32  */
33 #ifdef CMK_RECT_API
34 #include "bgml.h"
35 class RectMulticastStrategy: public CharmStrategy {
36  protected:
37     int handlerId;    
38     ComlibSectionInfo sinfo;
39
40     int isPersistent; 
41     
42     ///Array section support.
43     CkHashtableT<ComlibSectionHashKey, ComlibRectSectionHashObject *> sec_ht; 
44
45
46     inline unsigned int computeKey(int sectionID, int srcPe, CkArrayID arrId) {
47       //      fprintf(stderr,"key %d %d %d = %d\n",(((CkGroupID) arrId).idx), (sectionID), srcPe, (((CkGroupID) arrId).idx << 24) | (sectionID<<16)| srcPe);
48       return ((unsigned int) (((CkGroupID) arrId).idx << 24) | (sectionID<<16)| srcPe);}
49     
50     inline unsigned int computeKey(int sectionID, int srcPe, int id) { 
51       //      fprintf(stderr,"key %d %d %d = %d", id ,sectionID,  srcPe, (id  << 24) | (sectionID<<16)| srcPe);
52       return ((unsigned int) (id  << 24) | (sectionID<<16)| srcPe);}
53     
54     ///Add this section to the hash table locally.
55     void insertSectionID(CkSectionID *sid);
56
57     ///Called when a new section multicast is called by the user locally.
58     ///The strategy should then create a topology for it and return a hash
59     ///object to store that topology.
60     virtual ComlibRectSectionHashObject *createObjectOnSrcPe(int nindices, CkArrayIndexMax *idx_list, unsigned int sectionid);
61
62     /**   
63      * Similar to createHashObjectOnSrcPe, but that this call is made on the
64      * destination or intermediate processor. I receives all the information in
65      * the parameters, and it does not use ComlibLastKnown, since in some cases
66      * it can be incoherent.
67
68      * @param nindices number of local elements to multicast
69      * @param idxlist list of local elements
70      * @param npes number of processors involved in the multicast
71      * @param counts list of all the processors involved int the multicast
72      * @param srcpe processor which started the multicast
73      * @return a hash object describing the section
74      */
75     virtual ComlibRectSectionHashObject *createObjectOnIntermediatePe(int nindices, CkArrayIndexMax *idxlist, int npes, ComlibMulticastIndexCount *counts, int srcpe, int sectionID);
76         
77     ///Needed for getNewMulticastMessage, to specify if the list of processors need to be ordered
78     virtual int needSorting() { return 0; }
79
80     ///Called to multicast the message to local array elements.
81     void localMulticast(envelope *env, ComlibRectSectionHashObject *obj);
82     
83     ///Called to send to message out to the remote destinations.
84     ///This method can be overridden to call converse level strategies.
85     virtual void remoteMulticast(envelope *env, ComlibRectSectionHashObject *obj);
86
87     ///Called to forward to someone who can do the heavy sending work
88     virtual void forwardMulticast(envelope *env, ComlibRectSectionHashObject *obj);
89
90
91     ///Process a new message by extracting the array elements from it and
92     ///creating a new hash object by calling createObjectOnIntermediatePe().
93     void handleNewMulticastMessage(envelope *env);
94
95     void sendRectDest(ComlibRectSectionHashObject *obj, int srcpe, envelope *env);
96     BGTsRC_Geometry_t *getRectGeometry(ComlibRectSectionHashObject *obj, int srcpe);
97     int assignCornerRoot(BGTsRC_Geometry_t *geom, int srcpe);
98
99  public:
100
101
102
103     RectMulticastStrategy(CkMigrateMessage *m): CharmStrategy(m){}
104                 
105     ///Array constructor
106     RectMulticastStrategy(CkArrayID aid, int isPersistent = 0);
107         
108         
109     //Destuctor
110     ~RectMulticastStrategy();
111         
112     virtual void insertMessage(CharmMessageHolder *msg);
113     virtual void doneInserting();
114
115     ///Called by the converse handler function
116     virtual void handleMessage(void *msg);    
117     virtual void handleMessageForward(void *msg);    
118
119     virtual void pup(PUP::er &p);    
120     virtual void beginProcessing(int nelements);
121     
122     PUPable_decl(RectMulticastStrategy);
123 };
124 #else
125 class RectMulticastStrategy : public CharmStrategy {   
126   RectMulticastStrategy(CkMigrateMessage *m): CharmStrategy(m){}
127   //    RectMulticastStrategy(CkArrayID aid, int isPersistent = 0){}
128   ~RectMulticastStrategy(){}
129   PUPable_decl(RectMulticastStrategy);   
130 };
131 #endif
132 #endif
133