e33722880e9b5fa45e1898f987f89d068159d594
[charm.git] / src / ck-core / ComlibStrategy.h
1 #ifndef COMMLIBSTRATEGY_H
2 #define COMMLIBSTRATEGY_H
3
4 #include "charm++.h"
5 #include "convcomlibstrategy.h"
6
7 //Class managing Charm++ messages in the communication library.
8 //It is aware of envelopes, arrays, etc
9 class CharmMessageHolder : public MessageHolder{
10  public:
11     CkSectionID *sec_id;
12
13     CharmMessageHolder() : MessageHolder() {sec_id = NULL;}
14     CharmMessageHolder(CkMigrateMessage *m) : MessageHolder(m) {}
15     
16     CharmMessageHolder(char * msg, int dest_proc);
17     ~CharmMessageHolder();
18
19     char * getCharmMessage();
20     
21     virtual void pup(PUP::er &p);
22     PUPable_decl(CharmMessageHolder);
23 };
24
25 //Info classes that help bracketed streategies manage objects
26 //Each info class points to a list of source (or destination) objects
27 //ArrayInfo also access the array listener interface
28
29 class ComlibNodeGroupInfo {
30  protected:
31     CkNodeGroupID ngid;
32     int isNodeGroup;
33
34  public:
35     ComlibNodeGroupInfo();
36
37     void setSourceNodeGroup(CkNodeGroupID gid) {
38         ngid = gid;
39         isNodeGroup = 1;
40     }
41
42     int isSourceNodeGroup(){return isNodeGroup;}
43     CkNodeGroupID getSourceNodeGroup();
44
45     void pup(PUP::er &p);
46 };
47
48 class ComlibGroupInfo {
49  protected:
50     CkGroupID gid;
51     int *srcpelist, nsrcpes; //src processors for the elements
52     int isGroup;   
53
54  public:
55     ComlibGroupInfo();
56
57     void setSourceGroup(CkGroupID gid, int *srcpelist=0, int nsrcpes=0);
58     int isSourceGroup(){return isGroup;}
59     void getSourceGroup(CkGroupID &gid, int *&pelist, int &npes);
60     
61     void pup(PUP::er &p);
62 };
63
64 class ComlibMulticastMsg;
65
66 /* Array strategy helper class.
67    Stores the source and destination arrays.
68    Computes most recent processor maps of source and destinaton arrays.
69    
70    Array section helper functions, make use of sections easier for the
71    communication library.
72 */
73
74 class ComlibArrayInfo {
75  protected:
76     CkArrayID src_aid;
77     CkArrayIndexMax *src_elements; //src array elements
78     int nSrcIndices;              //number of source indices   
79     int isSrcArray;
80
81     CkArrayID dest_aid;
82     CkArrayIndexMax *dest_elements; //dest array elements
83     int nDestIndices;              //number of destintation indices   
84     int isDestArray;
85
86     CkVec<CkArrayIndexMax> localDestIndexVec;
87     
88  public:
89     ComlibArrayInfo();
90
91     void setSourceArray(CkArrayID aid, CkArrayIndexMax *e=0, int nind=0);
92     int isSourceArray(){return isSrcArray;}
93     void getSourceArray(CkArrayID &aid, CkArrayIndexMax *&e, int &nind);
94     
95     void setDestinationArray(CkArrayID aid, CkArrayIndexMax *e=0, int nind=0);
96     int isDestinationArray(){return isDestArray;}
97     void getDestinationArray(CkArrayID &aid, CkArrayIndexMax *&e, int &nind);
98
99     void localMulticast(envelope *env);
100     void localMulticast(CkVec<CkArrayIndexMax> *idx_vec,envelope *env);
101
102     void getSourcePeList(int *&pelist, int &npes);
103     void getDestinationPeList(int *&pelist, int &npes);
104     void getCombinedPeList(int *&pelist, int &npes);
105     
106     void initSectionID(CkSectionID *sid);
107     ComlibMulticastMsg * getNewMulticastMessage(CharmMessageHolder *cmsg);
108
109     void pup(PUP::er &p);
110 };
111
112
113 /* All Charm++ communication library strategies should inherit from
114    this strategy. They should specify their object domain by setting
115    Strategy::type. They have three helpers predefined for them for
116    node groups, groups and arrays */
117
118 class CharmStrategy : public Strategy {
119     int forwardOnMigration;
120
121  public:
122     ComlibGroupInfo ginfo;
123     ComlibNodeGroupInfo nginfo;
124
125     //The communication library array listener watches and monitors
126     //the array elements belonging to ainfo.src_aid
127     ComlibArrayInfo ainfo;
128     
129     CharmStrategy() : Strategy() {
130         setType(GROUP_STRATEGY); 
131         forwardOnMigration = 0;
132     }
133
134     CharmStrategy(CkMigrateMessage *m) : Strategy(m){}
135
136     //Called for each message
137     //Function inserts a Charm++ message
138     virtual void insertMessage(CharmMessageHolder *msg) {
139         CkAbort("Bummer Should Not come here:CharmStrategy is abstract\n");
140     }
141
142     //Removed the virtual!
143     //Charm strategies should not use Message Holder
144     void insertMessage(MessageHolder *msg);
145     
146     //Called after all chares and groups have finished depositing their 
147     //messages on that processor.
148     virtual void doneInserting() {}
149
150     //Added a new call that is called after the strategy had be
151     //created on every processor.
152     //DOES NOT exist in Converse Strategies
153     virtual void beginProcessing(int nelements){}
154
155     virtual void pup(PUP::er &p);
156     PUPable_decl(CharmStrategy);
157
158     void setForwardOnMigration(int f) {
159         forwardOnMigration = f;
160     }
161     
162     int getForwardOnMigration() {
163         return forwardOnMigration;
164     }
165 };
166
167 #endif