fix bug for ending and clean up commits
[charm.git] / src / ck-core / cksection.h
1 /**
2 @file 
3  
4  These classes implement array sections which is a subset of ckarray.
5   Supported operation includes section multicast and reduction.
6   It is currently implemented using delegation.
7
8   Extracted from charm++.h into separate file on 6/22/2003 by
9   Gengbin Zheng.
10
11   Modified to make it suitable for the Communication Library by 
12   Sameer Kumar.
13 */
14
15 #ifndef _CKMULTICAST_H
16 #define _CKMULTICAST_H
17
18 #define  MulticastMsg          1
19 #define  COMLIB_MULTICAST_MESSAGE    2
20
21 //#define COMLIB_MULTICAST_ALL 0
22 #define COMLIB_MULTICAST_OLD_SECTION 1
23 #define COMLIB_MULTICAST_NEW_SECTION 2
24 #define COMLIB_MULTICAST_SECTION_ERROR 3
25
26 /** Structure that holds info relevant to the use of an array/group section
27  */
28 typedef struct _CkSectionInfoStruct {
29     /// The array ID of the array that has been sectioned
30     CkGroupID aid; ///< @note: Also used to store a CkGroupID for group multicasts
31     /// The pe on which this object has been created
32     int pe;
33     /// Info needed by the section comm managers
34     union section_type {
35         // Used when section is delegated to CkMulticast
36         struct sec_mcast {
37             /// Counter tracking the last reduction that has traversed this section
38             int redNo;
39             // Pointer to mCastCookie
40             void *val;
41         } 
42         sCookie;
43
44         // Used when section is delegated to Comlib
45         struct commlibInfo{
46             // The instance of the comm. lib.
47             short  instId;
48             // This field indicates local array indices to multicast to:
49             // (Deprecated) COMLIB_MULTICAST_ALL for all local elements, 
50             // COMLIB_MULTICAST_NEW_SECTION, elements are attached 
51             // to this message
52             // COMLIB_MULTICAST_OLD_SECTION use previously created section
53             // COMLIB_MULTICAST_SECTION_ERROR mark the section as old
54             short status;      
55             // Used to compare section ID's
56             int id;
57         } 
58         cInfo;
59     } sInfo;
60     // Indicates which library has been delegated the section comm
61     char type;
62 } CkSectionInfoStruct;
63
64 class CkSectionInfo {
65  public:
66     CkSectionInfoStruct  info;
67     
68     CkSectionInfo()  {
69         info.type = 0; info.pe = -1;
70         info.sInfo.sCookie.val=NULL; info.sInfo.sCookie.redNo=0;
71         info.sInfo.cInfo.instId = 0;
72         info.sInfo.cInfo.status = 0;
73         info.sInfo.cInfo.id     = 0;
74     }
75
76     CkSectionInfo(CkSectionInfoStruct i): info(i) {}
77
78     CkSectionInfo(int t) {
79       info.type = t; info.pe = -1;
80       switch (info.type) {
81       case MulticastMsg:
82         info.sInfo.sCookie.val=NULL; 
83         info.sInfo.sCookie.redNo=0;
84         break;
85       case COMLIB_MULTICAST_MESSAGE:
86         info.sInfo.cInfo.instId=0;
87         info.sInfo.cInfo.status=0;
88         info.sInfo.cInfo.id=0;
89         break;
90       default:
91         CmiAssert(0);
92       }
93     }
94
95     CkSectionInfo(CkArrayID _aid, void *p = NULL) {
96       info.type = MulticastMsg;
97       info.pe = CkMyPe();
98       info.aid = _aid;
99       info.sInfo.sCookie.val=p;
100       info.sInfo.sCookie.redNo=0;
101     }
102
103     CkSectionInfo(int e, void *p, int r, CkArrayID _aid) {
104       info.type = MulticastMsg;
105       info.pe = e; 
106       info.aid = _aid;
107       info.sInfo.sCookie.val=p;
108       info.sInfo.sCookie.redNo=r;
109     }
110
111     inline char  &get_type() { return info.type; }
112     inline int   &get_pe()    { return info.pe; }
113     //inline int   &get_redNo() { CmiAssert(info.type==MulticastMsg); return info.sInfo.sCookie.redNo; }
114     inline int   &get_redNo() { 
115       if(info.type!=MulticastMsg)
116         CkPrintf("[%d] get type %d\n",CkMyPe(),info.type);
117       return info.sInfo.sCookie.redNo; 
118     }
119     inline void  set_redNo(int redNo) 
120     { 
121     //  CmiAssert(info.type==MulticastMsg); 
122       info.sInfo.sCookie.redNo = redNo; 
123     }
124     inline void* &get_val()   { CmiAssert(info.type==MulticastMsg); return info.sInfo.sCookie.val; }
125     inline CkGroupID   &get_aid()    { return info.aid; }
126     inline CkGroupID   get_aid() const   { return info.aid; }
127
128     /*
129     void pup(PUP::er &p) {
130       p | aid;
131       p | pe;
132       p | type;
133       switch (type) {
134       case MulticastMsg:
135         p | sInfo.sCookie.redNo;
136         p | sInfo.sCookie.val;
137         break;
138       case COMLIB_MULTICAST_MESSAGE:
139         p | sInfo.cInfo.instId;
140         p | sInfo.cInfo.status;
141         p | sInfo.cInfo.id = 0;
142         break;
143       }
144     }
145     */
146 };
147
148 PUPbytes(CkSectionInfo) //FIXME: write a real pup routine
149 PUPmarshall(CkSectionInfo)
150
151
152
153 class CkArrayIndex1D;
154 class CkArrayIndex2D;
155 class CkArrayIndex3D;
156 class CkArrayIndex4D;
157 class CkArrayIndex5D;
158 class CkArrayIndex6D;
159
160 #define _SECTION_MAGIC     88       /* multicast magic number for error checking */
161
162 /// CkMcastBaseMsg is the base class for all multicast messages
163 class CkMcastBaseMsg {
164     public:
165         // Current info about the state of this section
166         CkSectionInfo _cookie;
167         // A magic number to detect msg corruption
168         char magic;
169         unsigned short ep;
170         
171         CkMcastBaseMsg(): magic(_SECTION_MAGIC) {}
172         static inline int checkMagic(CkMcastBaseMsg *m) { return m->magic == _SECTION_MAGIC; }
173         inline int &gpe(void)      { return _cookie.get_pe(); }
174         inline int &redno(void)    { return _cookie.get_redNo(); }
175         inline void *&cookie(void) { return _cookie.get_val(); }
176 };
177
178
179
180 #define CKSECTIONID_CONSTRUCTOR(index) \
181   CkSectionID(const CkArrayID &aid, const CkArrayIndex##index *elems, const int nElems);
182
183 /** A class that holds complete info about an array/group section
184  *
185  * Describes section members, host PEs, current section status etc.
186  */
187 class CkSectionID {
188     public:
189         /// Minimal section info
190         CkSectionInfo _cookie;
191         /// The list of array indices that are section members
192         CkArrayIndex *_elems;
193         /// The number of section members
194         int _nElems;
195         /** A list of PEs that host section members
196          *
197          * @note: Two reasons:
198          * (i) potentially extend sections to groups
199          * (ii) For array sections these point to the processors
200          * (ranks in commlib) the destinations array elements are on
201          * @note: Currently not saved when pupped across processors
202          */
203         int *pelist;
204         /// The number of PEs that host section members
205         int npes;
206         
207         CkSectionID(): _elems(NULL), _nElems(0), pelist(0), npes(0) {}
208         CkSectionID(const CkSectionID &sid);
209         CkSectionID(CkSectionInfo &c, CkArrayIndex *e, int n, int *_pelist, int _npes): _cookie(c), _elems(e), _nElems(n), pelist(_pelist), npes(_npes)  {}
210         CkSectionID(const CkGroupID &gid, const int *_pelist, const int _npes);
211         CKSECTIONID_CONSTRUCTOR(1D)
212         CKSECTIONID_CONSTRUCTOR(2D)
213         CKSECTIONID_CONSTRUCTOR(3D)
214         CKSECTIONID_CONSTRUCTOR(4D)
215         CKSECTIONID_CONSTRUCTOR(5D)
216         CKSECTIONID_CONSTRUCTOR(6D)
217         CKSECTIONID_CONSTRUCTOR(Max)
218
219         inline int getSectionID(){ return _cookie.info.sInfo.cInfo.id; }
220         void operator=(const CkSectionID &);
221         ~CkSectionID() {
222             if (_elems != NULL) delete [] _elems;
223             if (pelist != NULL) delete [] pelist;
224         }
225         void pup(PUP::er &p);
226 };
227 PUPmarshall(CkSectionID)
228
229 #endif
230