
00001 // #ifdef filippo 00002 00003 // #include "KDirectMulticastStrategy.h" 00004 00005 // //Group Constructor 00006 // KDirectMulticastStrategy::KDirectMulticastStrategy(int kf, 00007 // int ndest, int *pelist) 00008 // : DirectMulticastStrategy(ndest, pelist), kfactor(kf) { 00009 // //FIXME: verify the list is sorted 00010 // commonKDirectInit(); 00011 // } 00012 00013 // //Array Constructor 00014 // KDirectMulticastStrategy::KDirectMulticastStrategy(int kf, 00015 // CkArrayID dest_aid) 00016 // : DirectMulticastStrategy(dest_aid), kfactor(kf){ 00017 // commonKDirectInit(); 00018 // } 00019 00020 // void KDirectMulticastStrategy::commonKDirectInit(){ 00021 // //sort list and create a reverse map 00022 // } 00023 00024 // extern int _charmHandlerIdx; 00025 // void KDirectMulticastStrategy::doneInserting(){ 00026 // ComlibPrintf("%d: DoneInserting \n", CkMyPe()); 00027 00028 // if(messageBuf->length() == 0) { 00029 // return; 00030 // } 00031 00032 // while(!messageBuf->isEmpty()) { 00033 // CharmMessageHolder *cmsg = messageBuf->deq(); 00034 // char *msg = cmsg->getCharmMessage(); 00035 // register envelope* env = UsrToEnv(msg); 00036 00037 // ComlibPrintf("[%d] Calling KDirect %d %d %d\n", CkMyPe(), 00038 // env->getTotalsize(), ndestpes, cmsg->dest_proc); 00039 00040 // if(cmsg->dest_proc == IS_MULTICAST) { 00041 // CmiSetHandler(env, handlerId); 00042 00043 // int *cur_pelist = NULL; 00044 // int cur_npes = 0; 00045 00046 // if(cmsg->sec_id == NULL) { 00047 // cur_pelist = kdestpelist; 00048 // cur_npes = kfactor; 00049 // } 00050 // else { 00051 // cur_npes = (kfactor <= cmsg->sid.npes)?kfactor : 00052 // cmsg->sid.npes; 00053 // cur_pelist = cmsg->sid.pe_list; 00054 // } 00055 00056 // ComlibPrintf("[%d] Sending Message to %d\n", CkMyPe(), cur_npes); 00057 // CmiSyncListSendAndFree(cur_npes, cur_pelist, 00058 // UsrToEnv(msg)->getTotalsize(), 00059 // UsrToEnv(msg)); 00060 // } 00061 // else { 00062 // CmiSyncSendAndFree(cmsg->dest_proc, 00063 // UsrToEnv(msg)->getTotalsize(), 00064 // (char *)UsrToEnv(msg)); 00065 // } 00066 00067 // delete cmsg; 00068 // } 00069 // } 00070 00071 // void KDirectMulticastStrategy::pup(PUP::er &p){ 00072 // DirectMulticastStrategy::pup(p); 00073 00074 // p | kfactor; 00075 // } 00076 00077 // void KDirectMulticastStrategy::beginProcessing(int nelements){ 00078 00079 // DirectMulticastStrategy::beginProcessing(nelements); 00080 00081 // kndestpelist = new int[kfactor]; 00082 00083 // int next_pe = 0, count = 0; 00084 // //Assuming the destination pe list is sorted. 00085 // for(count = 0; count < ndestpes; count++) 00086 // if(destpelist[count] > CkMyPe()) { 00087 // next_pe = count; 00088 // break; 00089 // } 00090 00091 // int kpos = 0; 00092 // for(count = next_pe; count < next_pe + kfactor; count++){ 00093 // int pe = destpelist[count % ndestpes]; 00094 // kdestpelist[kpos ++] = pe; 00095 // } 00096 // } 00097 00098 // void KDirectMulticastStrategy::handleMulticastMessage(void *msg){ 00099 // register envelope *env = (envelope *)msg; 00100 00101 // CkMcastBaseMsg *cbmsg = (CkMcastBaseMsg *)EnvToUsr(env); 00102 // int src_pe = cbmsg->_cookie.pe; 00103 // if(isDestinationGroup){ 00104 // CmiSetHandler(env, _charmHandlerIdx); 00105 // CmiSyncSend(CkMyPe(), env->getTotalsize(), (char *)env); 00106 00107 // int nmsgs = getNumMessagesToSend(src_pe, CkMyPe, CkNumPes()); 00108 // if(nmsgs > 0){ 00109 // CmiSetHandler(env, handlerId); 00110 // CmiSyncListSendAndFree(nmsgs, kdestpelist, 00111 // env->getTotalsize(), env); 00112 // } 00113 // return; 00114 // } 00115 00116 // int status = cbmsg->_cookie.sInfo.cInfo.status; 00117 // ComlibPrintf("[%d] In handle multicast message %d\n", CkMyPe(), status); 00118 00119 // if(status == COMLIB_MULTICAST_ALL) { 00120 // int nmsgs = getNumMessagesToSend(src_pe. CkMyPe(), CkNumPes()); 00121 // if(nmsgs > 0){ //Have to forward the messages 00122 // void *msg = EnvToUsr(env); 00123 // void *newmsg = CkCopyMsg(&msg); 00124 // envelope *newenv = UsrToEnv(newmsg); 00125 // CmiSyncListSendAndFree(nmsgs, kdestpelist, 00126 // newenv->getTotalsize(), newenv); 00127 // } 00128 00129 // //Multicast to all destination elements on current processor 00130 // ComlibPrintf("[%d] Local multicast sending all %d\n", CkMyPe(), 00131 // localDestIndices.size()); 00132 00133 // localMulticast(&localDestIndices, env); 00134 // } 00135 // else if(status == COMLIB_MULTICAST_NEW_SECTION){ 00136 // CkUnpackMessage(&env); 00137 // ComlibPrintf("[%d] Received message for new section src=%d\n", 00138 // CkMyPe(), cbmsg->_cookie.pe); 00139 00140 // ComlibMulticastMsg *ccmsg = (ComlibMulticastMsg *)cbmsg; 00141 00142 // KDirectHashObject *kobj = 00143 // createHashObject(ccmsg->nIndices, ccmsg->indices); 00144 00145 // envelope *usrenv = (envelope *) ccmsg->usrMsg; 00146 00147 // envelope *newenv = (envelope *)CmiAlloc(usrenv->getTotalsize()); 00148 // memcpy(newenv, usrenv, usrenv->getTotalsize()); 00149 00150 // localMulticast(&kobj->indices, newenv); 00151 00152 // ComlibSectionHashKey key(cbmsg->_cookie.pe, 00153 // cbmsg->_cookie.sInfo.cInfo.id); 00154 00155 // KDirectHashObject *old_kobj = 00156 // (KDirectHashObject*)sec_ht.get(key); 00157 // if(old_kobj != NULL) 00158 // delete old_kobj; 00159 00160 // sec_ht.put(key) = kobj; 00161 00162 // if(kobj->npes > 0) { 00163 // ComlibPrintf("[%d] Forwarding Message of %d to %d pes\n", 00164 // CkMyPe(), cbmsg->_cookie.pe, kobj->npes); 00165 // CkPackMessage(&env); 00166 // CmiSyncListSendAndFree(kpbj->npes, kobj->pelist, 00167 // env->getTotalsize(), env); 00168 // } 00169 // else 00170 // CmiFree(env); 00171 // } 00172 // else { 00173 // //status == COMLIB_MULTICAST_OLD_SECTION, use the cached section id 00174 // ComlibSectionHashKey key(cbmsg->_cookie.pe, 00175 // cbmsg->_cookie.sInfo.cInfo.id); 00176 // KDirectHashObject *kobj = (KDirectHashObject *)sec_ht.get(key); 00177 00178 // if(kobj == NULL) 00179 // CkAbort("Destination indices is NULL\n"); 00180 00181 // if(kobj->npes > 0){ 00182 // void *msg = EnvToUsr(env); 00183 // void *newmsg = CkCopyMsg(&msg); 00184 // envelope *newenv = UsrToEnv(newmsg); 00185 // CmiSyncListSendAndFree(kpbj->npes, kobj->pelist, 00186 // newenv->getTotalsize(), newenv); 00187 00188 // } 00189 00190 // localMulticast(&kobj->indices, env); 00191 // } 00192 // } 00193 00194 // void KDirectMulticastStrategy::initSectionID(CkSectionID *sid){ 00195 00196 // ComlibPrintf("KDirect Init section ID\n"); 00197 // sid->pelist = NULL; 00198 // sid->npes = 0; 00199 00200 // int *pelist = new int[kfactor]; 00201 // int npes; 00202 // getPeList(sid->_nElem, sid->_elems, pelist, npes); 00203 00204 // sid->destpelist = pelist; 00205 // sid->ndestpes = npes; 00206 // } 00207 00208 // KDirectHashObject *KDirectMulticastStrategy::createHashObject(int nelements, CkArrayIndex *elements){ 00209 00210 // KDirectHashObject *kobj = new KDirectHashObject; 00211 // kobj->pelist = new int[kfactor]; 00212 // getPeList(nelements, elements, kobj->pelist, kobj->npes); 00213 00214 // return kobj; 00215 // } 00216 00217 00218 // void KDirectMulticastStrategy::getPeList(int nelements, 00219 // CkArrayIndex *elements, 00220 // int *pelist, int &npes, 00221 // int src_pe){ 00222 00223 // npes = 0; 00224 00225 // int *tmp_pelist = new int[CkNumPes()]; 00226 // int num_pes; 00227 00228 // //make this a reusable function call later. 00229 // int count = 0, acount = 0; 00230 // for(acount = 0; acount < nelements; acount++){ 00231 // int p = CkArrayID::CkLocalBranch(destArrayID)-> 00232 // lastKnown(elements[acount]); 00233 00234 // for(count = 0; count < num_pes; count ++) 00235 // if(tmp_pelist[count] == p) 00236 // break; 00237 00238 // if(count == num_pes) { 00239 // tmp_pelist[num_pes ++] = p; 00240 // } 00241 // } 00242 00243 // if(num_pes == 0) { 00244 // delete [] tmp_pelist; 00245 // return; 00246 // } 00247 00248 // qsort(tmp_pelist, num_pes, sizeof(int), intCompare); 00249 00250 // int pdiff = 0; 00251 // int my_pos = 0; 00252 // int src_pos = 0; 00253 00254 // int count; 00255 // for(count = 0; count < num_pes; count ++) { 00256 // if(tmp_pelist[count] == CkMyPe()){ 00257 // my_pos = count; 00258 // } 00259 00260 // if(tmp_pelist[count] == src_pos){ 00261 // src_pos = count; 00262 // } 00263 // } 00264 00265 // int n_tosend = getNumMessagesToSend(src_pos, my_pos, num_pes); 00266 // for(count = 0; count < n_tosend; count ++) { 00267 // pelist[npes ++] = tmp_pelist[(src_pos + count)%num_pes]; 00268 // } 00269 00270 // delete [] tmp_pelist; 00271 // } 00272 00273 // int KDirectMulticastStrategy::getNumMessagesToSend(int src_pe, int my_pe, 00274 // int num_pes){ 00275 00276 // if(src_pe == my_pe) { 00277 // retutn 0; 00278 // } 00279 00280 // int nToSend = 0; 00281 00282 // int pdiff = my_pe - src_pe; 00283 00284 // if(pdiff < 0) 00285 // pdiff += num_pes; 00286 00287 // if(pdiff % kfactor != 0) 00288 // return 0; 00289 00290 // return (num_pes - pdiff > kfactor)? kfactor : num_pes - pdiff; 00291 // } 00292 00293 // #endif
1.5.5