Several new changes
[charm.git] / src / ck-com / ComlibSectionInfo.h
1 #ifndef COMLIB_SECTION_INFO
2 #define COMLIB_SECTION_INFO
3
4 /***********
5   Helper classes that help strategies manage array sections 
6 ***********/
7
8 /* Hash key that lets a strategy access a section id data structure
9    given the source processor and the MaxSectionId on that processor
10 */
11 class ComlibSectionHashKey{
12  public:
13     int srcPe;
14     int id;
15     ComlibSectionHashKey(int _pe, int _id):srcPe(_pe), id(_id){};
16
17     //These routines allow ComlibSectionHashKey to be used in
18     //  a CkHashtableT
19     CkHashCode hash(void) const;
20     static CkHashCode staticHash(const void *a,size_t);
21     int compare(const ComlibSectionHashKey &ind) const;
22     static int staticCompare(const void *a,const void *b,size_t);
23 };
24
25 /*********** CkHashTable functions ******************/
26 inline CkHashCode ComlibSectionHashKey::hash(void) const
27 {
28     register int _id = id;
29     register int _pe = srcPe;
30     
31     register CkHashCode ret = (_id << 16) + _pe;
32     return ret;
33 }
34
35 inline int ComlibSectionHashKey::compare(const ComlibSectionHashKey &k2) const
36 {
37     if(id == k2.id && srcPe == k2.srcPe)
38         return 1;
39     
40     return 0;
41 }
42
43 /*For calls to qsort*/
44 inline int intCompare(void *a, void *b){
45     int a1 = *(int *) a;
46     int b1 = *(int *) b;
47
48     if(a1 < b1)
49         return -1;
50     
51     if(a1 == b1)
52         return 0;
53
54     if(a1 > b1)
55         return 1;
56
57     return 0;
58 }    
59
60 //ComlibSectionHashKey CODE
61 inline int ComlibSectionHashKey::staticCompare(const void *k1, const void *k2, 
62                                                 size_t ){
63     return ((const ComlibSectionHashKey *)k1)->
64                 compare(*(const ComlibSectionHashKey *)k2);
65 }
66
67 inline CkHashCode ComlibSectionHashKey::staticHash(const void *v,size_t){
68     return ((const ComlibSectionHashKey *)v)->hash();
69 }
70
71 /*************** End CkHashtable Functions *****************/
72
73
74
75 class ComlibSectionHashObject {
76  public:
77     //My local indices
78     CkVec<CkArrayIndexMax> indices;
79     
80     //Other processors to send this message to
81     int npes;
82     int *pelist;
83     
84     ComlibSectionHashObject(): indices(0) {
85         npes = 0;
86         pelist = NULL;
87     }
88
89     ~ComlibSectionHashObject() {
90         delete pelist;
91     }
92 };
93
94
95 /*** Class that helps a communication library strategy manage array
96      sections
97 ***************/
98
99 class ComlibSectionInfo {
100     /* Array ID of the array section */
101     CkArrayID destArrayID;
102     
103     //Unique section id for this section
104     //Will be used to access a hashtable on remote processors
105     int MaxSectionID;
106
107     //Instance ID of the strategy
108     int instanceID;
109
110     CkVec<CkArrayIndexMax> localDestIndexVec;
111
112  public:
113
114     ComlibSectionInfo() { 
115         destArrayID.setZero(); MaxSectionID = 1; instanceID = 0;    
116     }
117
118     ComlibSectionInfo(CkArrayID dest, int instance){
119         destArrayID = dest;
120         instanceID = instance;
121
122         MaxSectionID = 1;
123     }
124     
125     inline void initSectionID(CkSectionID *sid) {
126         sid->_cookie.sInfo.cInfo.id = MaxSectionID ++;            
127     }
128     
129     void processOldSectionMessage(CharmMessageHolder *cmsg);
130
131     ComlibMulticastMsg *getNewMulticastMessage(CharmMessageHolder *cmsg);
132
133     void unpack(envelope *cb_env, CkVec<CkArrayIndexMax> &destIndices, 
134                 envelope *&env);
135
136     void localMulticast(envelope *env);
137
138     void getRemotePelist(int nindices, CkArrayIndexMax *idxlist, 
139                          int &npes, int *&pelist);
140
141     void getPeList(int nindices, CkArrayIndexMax *idxlist, 
142                    int &npes, int *&pelist);
143
144     void getLocalIndices(int nindices, CkArrayIndexMax *idxlist, 
145                          CkVec<CkArrayIndexMax> &idx_vec);   
146         
147     static inline int getSectionID(CkSectionID id) {
148         return id._cookie.sInfo.cInfo.id;
149     }
150
151     void pup(PUP::er &p) {
152         p | destArrayID;
153         p | MaxSectionID;
154         p | instanceID;
155         p | localDestIndexVec;
156     }
157 };
158
159 #endif