// remove the obj-th object from database void BaseLB::LDStats::removeObject(int obj) { CmiAssert(obj < objData.size()); LDObjData odata = objData[obj]; LDObjKey okey; // build a key okey.omID() = odata.omID(); okey.objID() = odata.objID(); objData.remove(obj); from_proc.remove(obj); to_proc.remove(obj); n_objs --; if (odata.migratable) n_migrateobjs --; // search for sender, can be multiple sender int removed = 0; for (int com=0; com<n_comm; com++) { LDCommData &cdata = commData[com-removed]; if(!cdata.from_proc() && cdata.sender == okey) { commData.remove(com-removed); removed++; } } n_comm -= removed; }
// start from leaves of a domain, all processors in the domain start a // tree reduction to fill pending from/to proc pairs. void HybridBaseLB::StartCollectInfo(DummyMsg *m) { int i; delete m; LevelData *lData = levelData[0]; // we are leaf, start a tree reduction to find from/to proc pairs // set this counter lData->resumeAfterMigration = 1; // Locations int migs = lData->outObjs.size() + newObjs.size(); Location *locs = new Location[migs]; int count=0; int me = CkMyPe(); for (i=0; i<newObjs.size(); i++) { locs[count] = newObjs[i]; locs[count].loc = me; count++; } for (i=0; i<lData->outObjs.size(); i++) { LDObjKey key; key.omID() = lData->outObjs[i].handle.omID(); key.objID() = lData->outObjs[i].handle.objID(); locs[count].key = key; locs[count].loc = -1; // unknown count++; } // assuming leaf must have a parent DEBUGF(("[%d] level 0 has %d unmatched (out)%d+(new)%d. \n", CkMyPe(), migs, lData->outObjs.size(), newObjs.size())); thisProxy[lData->parent].CollectInfo(locs, migs, 0); delete [] locs; }
// objects arrives with only objdata void HybridBaseLB::ObjsMigrated(CkVec<LDObjData>& datas, int m, LDCommData *cdata, int n, int atlevel) { int i; LevelData *lData = levelData[atlevel]; LDStats *statsData = lData->statsData; if (statsData != NULL) { CkVec<LDObjData> &oData = statsData->objData; for (i=0; i<m; i++) { // copy into LDStats LDObjData &data = datas[i]; oData.push_back(data); statsData->n_objs++; if (data.migratable) statsData->n_migrateobjs++; // an incoming object to the root // pretend this object belongs to it statsData->from_proc.push_back(lData->nChildren); statsData->to_proc.push_back(lData->nChildren); } // copy into comm data if (n) { CkVec<LDCommData> &cData = statsData->commData; for (int i=0; i<n; i++) cData.push_back(cdata[i]); statsData->n_comm += n; statsData->deleteCommHash(); } } else { // leaf node, from which proc is unknown at this time for (i=0; i<m; i++) { LDObjData &data = datas[i]; LDObjKey key; key.omID() = data.omID(); key.objID() = data.objID(); newObjs.push_back(Location(key, -1)); } } lData->obj_completed+=m; if (lData->migrationDone()) { StatsDone(atlevel); } }
int BaseLB::LDStats::getHash(const LDObjKey &objKey) { const LDObjid &oid = objKey.objID(); const LDOMid &mid = objKey.omID(); return getHash(oid, mid); }