New version of communication library with learning capabilities. Learning and dynamic...
[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     CkPackMessage(&env);
18     int sizes[2];
19     sizes[0] = cmsg->sec_id->_nElems;
20     sizes[1] = env->getTotalsize();                
21     
22     cmsg->sec_id->_cookie.sInfo.cInfo.id = MaxSectionID ++;
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     return NULL;
53 }
54
55 void ComlibSectionInfo::unpack(envelope *cb_env, 
56                                CkVec<CkArrayIndexMax> *&dest_indices, 
57                                envelope *&env) {
58         
59     dest_indices = NULL;    
60     ComlibMulticastMsg *ccmsg = (ComlibMulticastMsg *)EnvToUsr(cb_env);
61     
62     if(ccmsg->nIndices > 0)
63         dest_indices = new CkVec<CkArrayIndexMax>;
64
65     for(int count = 0; count < ccmsg->nIndices; count++){
66         CkArrayIndexMax idx = ccmsg->indices[count];
67         
68         //This will work because. lastknown always knows if I have the
69         //element of not
70         int dest_proc = ComlibGetLastKnown(destArrayID, idx);
71         //CkArrayID::CkLocalBranch(destArrayID)->lastKnown(idx);
72         
73         if(dest_proc == CkMyPe())
74             dest_indices->insertAtEnd(idx);                        
75     }            
76     
77     envelope *usrenv = (envelope *) ccmsg->usrMsg;
78     env = (envelope *)CmiAlloc(usrenv->getTotalsize());
79     memcpy(env, ccmsg->usrMsg, usrenv->getTotalsize());
80 }
81
82
83 void ComlibSectionInfo::processOldSectionMessage(CharmMessageHolder *cmsg) {
84
85     ComlibPrintf("Process Old Section Message \n");
86
87     int cur_sec_id = ComlibSectionInfo::getSectionID(*cmsg->sec_id);
88
89     //Old section id, send the id with the message
90     CkMcastBaseMsg *cbmsg = (CkMcastBaseMsg *)cmsg->getCharmMessage();
91     cbmsg->_cookie.sInfo.cInfo.id = cur_sec_id;
92     cbmsg->_cookie.sInfo.cInfo.status = COMLIB_MULTICAST_OLD_SECTION;
93 }
94
95 void ComlibSectionInfo::initSectionID(CkSectionID *sid){
96     
97     if(sid->npes > 0) 
98         return;
99
100     sid->pelist = new int[CkNumPes()];
101     sid->npes = 0;
102     
103     int count = 0, acount = 0;
104
105     for(acount = 0; acount < sid->_nElems; acount++){
106
107         int p = ComlibGetLastKnown(destArrayID, sid->_elems[acount]);
108         //CkArrayID::CkLocalBranch(destArrayID)->
109         //lastKnown(sid->_elems[acount]);
110         
111         if(p == -1) CkAbort("Invalid Section\n");        
112         for(count = 0; count < sid->npes; count ++)
113             if(sid->pelist[count] == p)
114                 break;
115         
116         if(count == sid->npes) {
117             sid->pelist[sid->npes ++] = p;
118         }
119     }   
120 }
121
122 void ComlibSectionInfo::localMulticast(envelope *env){
123     ComlibArrayInfo::localMulticast(&localDestIndexVec, env);
124 }
125