Several new changes
[charm.git] / src / ck-com / ComlibSectionInfo.C
1
2 #include "ComlibManager.h"
3 #include "ComlibSectionInfo.h"
4
5 ComlibMulticastMsg * ComlibSectionInfo::getNewMulticastMessage
6 (CharmMessageHolder *cmsg){
7     
8     if(cmsg->sec_id == NULL || cmsg->sec_id->_nElems == 0)
9         return NULL;
10
11     void *m = cmsg->getCharmMessage();
12     envelope *env = UsrToEnv(m);
13         
14     if(cmsg->sec_id->_cookie.sInfo.cInfo.id != 0) 
15         CmiAbort("In correct section\n");
16
17     initSectionID(cmsg->sec_id);   
18
19     CkPackMessage(&env);
20     int sizes[2];
21     sizes[0] = cmsg->sec_id->_nElems;
22     sizes[1] = env->getTotalsize();                
23     
24     ComlibPrintf("Creating new comlib multicast message %d, %d\n", sizes[0], sizes[1]);
25     
26     ComlibMulticastMsg *msg = new(sizes, 0) ComlibMulticastMsg;
27     msg->nIndices = cmsg->sec_id->_nElems;
28     msg->_cookie.sInfo.cInfo.instId = instanceID;
29     msg->_cookie.sInfo.cInfo.id = MaxSectionID - 1;
30     msg->_cookie.sInfo.cInfo.status = COMLIB_MULTICAST_NEW_SECTION;
31     msg->_cookie.type = COMLIB_MULTICAST_MESSAGE;
32     msg->_cookie.pe = CkMyPe();
33     
34     memcpy(msg->indices, cmsg->sec_id->_elems, 
35            sizes[0] * sizeof(CkArrayIndexMax));
36     memcpy(msg->usrMsg, env, sizes[1] * sizeof(char));         
37     envelope *newenv = UsrToEnv(msg);
38     
39     newenv->getsetArrayMgr() = env->getsetArrayMgr();
40     newenv->getsetArraySrcPe() = env->getsetArraySrcPe();
41     newenv->getsetArrayEp() = env->getsetArrayEp();
42     newenv->getsetArrayHops() = env->getsetArrayHops();
43     newenv->getsetArrayIndex() = env->getsetArrayIndex();
44
45     // for trace projections
46     newenv->setEvent(env->getEvent());
47     newenv->setSrcPe(env->getSrcPe());
48     
49     CkPackMessage(&newenv);        
50     return (ComlibMulticastMsg *)EnvToUsr(newenv);
51 }
52
53 void ComlibSectionInfo::unpack(envelope *cb_env, 
54                                CkVec<CkArrayIndexMax> &dest_indices, 
55                                envelope *&env) {
56         
57     ComlibMulticastMsg *ccmsg = (ComlibMulticastMsg *)EnvToUsr(cb_env);
58     
59     for(int count = 0; count < ccmsg->nIndices; count++){
60         CkArrayIndexMax idx = ccmsg->indices[count];
61         
62         //This will work because. lastknown always knows if I have the
63         //element of not
64         int dest_proc = ComlibGetLastKnown(destArrayID, idx);
65         //CkArrayID::CkLocalBranch(destArrayID)->lastKnown(idx);
66         
67         //        if(dest_proc == CkMyPe())
68         dest_indices.insertAtEnd(idx);                        
69     }            
70     
71     envelope *usrenv = (envelope *) ccmsg->usrMsg;
72     env = (envelope *)CmiAlloc(usrenv->getTotalsize());
73     memcpy(env, ccmsg->usrMsg, usrenv->getTotalsize());
74 }
75
76
77 void ComlibSectionInfo::processOldSectionMessage(CharmMessageHolder *cmsg) {
78
79     ComlibPrintf("Process Old Section Message \n");
80
81     int cur_sec_id = ComlibSectionInfo::getSectionID(*cmsg->sec_id);
82
83     //Old section id, send the id with the message
84     CkMcastBaseMsg *cbmsg = (CkMcastBaseMsg *)cmsg->getCharmMessage();
85     cbmsg->_cookie.sInfo.cInfo.id = cur_sec_id;
86     cbmsg->_cookie.sInfo.cInfo.status = COMLIB_MULTICAST_OLD_SECTION;
87 }
88
89 void ComlibSectionInfo::getPeList(int _nElems, 
90                                   CkArrayIndexMax *_elems, 
91                                   int &npes, int *&pelist){
92     
93     int length = CkNumPes();
94     if(length > _nElems)    //There will not be more processors than
95                             //number of elements. This is wastage of
96                             //memory as there may be fewer
97                             //processors. Fix later.
98         length = _nElems;
99     
100     pelist = new int[length];
101     npes = 0;
102     
103     int count = 0, acount = 0;
104     
105     for(acount = 0; acount < _nElems; acount++){
106         
107         int p = ComlibGetLastKnown(destArrayID, _elems[acount]);
108         
109         if(p == -1) CkAbort("Invalid Section\n");        
110         for(count = 0; count < npes; count ++)
111             if(pelist[count] == p)
112                 break;
113         
114         if(count == npes) {
115             pelist[npes ++] = p;
116         }
117     }   
118
119     if(npes == 0) {
120         delete pelist;
121         pelist = NULL;
122     }
123 }
124
125
126 void ComlibSectionInfo::getRemotePelist(int nindices, 
127                                         CkArrayIndexMax *idxlist, 
128                                         int &npes, int *&pelist) {
129
130     int count = 0, acount = 0;
131     
132     int length = CkNumPes();
133     if(length > nindices)
134         length = nindices;
135     
136     pelist = new int[length];
137     npes = 0;
138
139     for(acount = 0; acount < nindices; acount++){
140         
141         int p = ComlibGetLastKnown(destArrayID, idxlist[acount]);
142         if(p == CkMyPe())
143             continue;
144         
145         if(p == -1) CkAbort("Invalid Section\n");        
146         
147         //Collect remote processors
148         for(count = 0; count < npes; count ++)
149             if(pelist[count] == p)
150                 break;
151         
152         if(count == npes) {
153             pelist[npes ++] = p;
154         }
155     }
156     
157     if(npes == 0) {
158         delete pelist;
159         pelist = NULL;
160     }
161 }
162
163
164 void ComlibSectionInfo::getLocalIndices(int nindices, 
165                                         CkArrayIndexMax *idxlist, 
166                                         CkVec<CkArrayIndexMax> &idx_vec){    
167     int count = 0, acount = 0;
168     idx_vec.resize(0);
169     
170     for(acount = 0; acount < nindices; acount++){
171         int p = ComlibGetLastKnown(destArrayID, idxlist[acount]);
172         if(p == CkMyPe()) 
173             idx_vec.insertAtEnd(idxlist[acount]);
174     }
175 }
176
177
178 void ComlibSectionInfo::localMulticast(envelope *env){
179     ComlibArrayInfo::localMulticast(&localDestIndexVec, env);
180 }