a6607e35959fe3152650beb302d42d2f4919ede8
[charm.git] / src / ck-com / ComlibManager.h
1 #ifndef COMMLIBMANAGER_H
2 #define COMMLIBMANAGER_H
3
4 #include "charm++.h"
5 #include "cksection.h"
6 #include "envelope.h"
7 #include "comlib.h"
8 #include <math.h>
9
10 #include "charm++.h"
11 #include "convcomlibmanager.h"
12
13 #define USE_TREE 1            //Organizes the all to all as a tree
14 #define USE_MESH 2            //Virtual topology is a mesh here
15 #define USE_HYPERCUBE 3       //Virtual topology is a hypercube
16 #define USE_DIRECT 4          //A dummy strategy that directly forwards 
17                               //messages without any processing.
18 #define USE_GRID 5            //Virtual topology is a 3d grid
19 #define USE_LINEAR 6          //Virtual topology is a linear array
20
21 #define CHARM_MPI 0 
22 #define MAX_NSTRAT 1024
23 #define LEARNING_PERIOD 1000 //Number of iterations after which the
24                              //learning framework will discover 
25                              //the appropriate strategy, not completely 
26                              //implemented
27 #define IS_MULTICAST -1
28
29 #define ALPHA 5E-6
30 #define BETA 3.33E-9
31
32 PUPbytes(comID);
33
34 #include "comlib.decl.h"
35
36 //Dummy message to be sent incase there are no messages to send. 
37 //Used by only the EachToMany strategy!
38 class ComlibDummyMsg: public CMessage_ComlibDummyMsg {
39     int dummy;
40 };
41
42 /*
43 //Priority message to call end iteration
44 class PrioMsg: public CMessage_PrioMsg {
45  public:
46     int instID;
47 };
48 */
49
50 class ComlibMulticastMsg : public CkMcastBaseMsg, 
51                public CMessage_ComlibMulticastMsg {
52     
53   public:
54     int nIndices;
55     char *usrMsg;        
56     CkArrayIndexMax *indices;
57 };
58
59 class ComlibManager;
60
61 extern CkGroupID cmgrID;
62
63 //An Instance of the communication library.
64 class ComlibInstanceHandle {
65  private:    
66     
67     int _instid;
68     CkGroupID _dmid;
69     int _srcPe;
70     
71  public:
72     ComlibInstanceHandle();
73     ComlibInstanceHandle(const ComlibInstanceHandle &h);
74     ComlibInstanceHandle(int instid, CkGroupID dmid);    
75     
76     void init();
77     void beginIteration();
78     void endIteration();
79     
80     CkGroupID getComlibManagerID();
81     void setStrategy(CharmStrategy *);
82
83     int getSourcePe() {return _srcPe;}
84
85     friend class ComlibManager;
86 };
87
88 PUPbytes(ComlibInstanceHandle);
89
90 class ComlibManager: public CkDelegateMgr {
91     friend class ComlibInstanceHandle;
92
93     int section_send_event;
94
95     int remotePe;
96     CmiBool isRemote;
97
98     int npes;
99     int *pelist;
100
101     CkArrayIndexMax dummyArrayIndex;
102
103     //For compatibility and easier use!
104     int strategyID; //Identifier of the strategy
105
106     //Pointer to the converse comm lib strategy table
107     StrategyTable *strategyTable;
108
109     CkVec<CharmStrategy *> ListOfStrategies; //temporary list of strategies
110     
111     CkQ<CharmMessageHolder *> remoteQ;  //list of remote messages
112                                         //after the object has
113                                         //migrated
114
115     //The number of strategies created by the user
116     int nstrats; 
117     
118     int curStratID, prevStratID;      
119     //Number of strategies created by the user.
120
121     //flags
122     int receivedTable, flushTable, barrierReached, barrier2Reached;
123     int totalMsgCount, totalBytes, nIterations;
124
125     ComlibArrayListener *alistener;
126     int prioEndIterationFlag;
127
128     void init(); //initialization function
129
130     //charm_message for multicast for a section of that group
131     void multicast(CharmMessageHolder *cmsg); //charm message holder here
132     //void multicast(void *charm_msg, int npes, int *pelist);
133
134     //The following funtions can be accessed only from ComlibInstanceHandle
135     void beginIteration();     //Notify begining of a bracket with
136                                //strategy identifier
137
138     void endIteration();       //Notify end, endIteration must be
139                                //called if a beginIteration is
140                                //called. Otherwise end of the entry
141                                //method is assumed to be the end of
142                                //the bracket.
143     
144     void setInstance(int id); 
145     //void prioEndIteration(PrioMsg *pmsg);
146     void registerStrategy(int pos, CharmStrategy *s);
147
148  public:
149     ComlibManager();  //Recommended constructor
150
151     ComlibManager(CkMigrateMessage *m){ }
152     int useDefCtor(void){ return 1; } //Use default constructor should
153     //be pupped and store all the strategies.
154     
155     void barrier(void);
156     void barrier2(void);
157     void resumeFromBarrier2(void);
158     void receiveTable(StrategyWrapper sw); //Receive table of strategies.
159
160     void ArraySend(CkDelegateData *pd,int ep, void *msg, const CkArrayIndexMax &idx, 
161                    CkArrayID a);
162
163     void receiveRemoteSend(CkQ<CharmMessageHolder*> &rq, int id);
164     void sendRemote();
165
166     void GroupSend(CkDelegateData *pd,int ep, void *msg, int onpe, CkGroupID gid);
167     
168     virtual void ArrayBroadcast(CkDelegateData *pd,int ep,void *m,CkArrayID a);
169     virtual void GroupBroadcast(CkDelegateData *pd,int ep,void *m,CkGroupID g);
170     virtual void ArraySectionSend(CkDelegateData *pd,int ep,void *m,CkArrayID a,CkSectionID &s);
171
172     CharmStrategy *getStrategy(int instid)
173         {return (CharmStrategy *)(* strategyTable)[instid].strategy;}
174
175     StrategyTableEntry *getStrategyTableEntry(int instid)
176         {return &((*strategyTable)[instid]);}
177
178     //To create a new strategy, returns handle to the strategy table;
179     ComlibInstanceHandle createInstance();  
180     void doneCreating();             //Done creating instances
181
182     //Learning functions
183     void learnPattern(int totalMessageCount, int totalBytes);
184     void switchStrategy(int strat);
185
186     void setRemote(int remotePe);
187 };
188
189 void ComlibDelegateProxy(CProxy *proxy);
190
191 ComlibInstanceHandle CkCreateComlibInstance();
192 ComlibInstanceHandle CkGetComlibInstance();
193 ComlibInstanceHandle CkGetComlibInstance(int id);
194
195 //Only Called when the strategies are not being created in main::main
196 void ComlibDoneCreating(); 
197
198 void ComlibInitSectionID(CkSectionID &sid);
199 void ComlibDeleteSection();
200
201 #endif