void HybridBaseLB::ReceiveStats(CkMarshalledCLBStatsMessage &data, int fromlevel) { #if CMK_LBDB_ON FindNeighbors(); // store the message CLBStatsMsg *m = data.getMessage(); int atlevel = fromlevel + 1; CmiAssert(tree->isroot(CkMyPe(), atlevel)); depositLBStatsMessage(m, atlevel); int &stats_msg_count = levelData[atlevel]->stats_msg_count; stats_msg_count ++; DEBUGF(("[%d] ReceiveStats at level: %d %d/%d\n", CkMyPe(), atlevel, stats_msg_count, levelData[atlevel]->nChildren)); if (stats_msg_count == levelData[atlevel]->nChildren) { // build LDStats buildStats(atlevel); stats_msg_count = 0; int parent = levelData[atlevel]->parent; if (parent != -1) { // combine and shrink message // build a new message based on our LDStats CLBStatsMsg* cmsg = buildCombinedLBStatsMessage(atlevel); // send to parent CkMarshalledCLBStatsMessage marshmsg(cmsg); thisProxy[parent].ReceiveStats(marshmsg, atlevel); } else { // root of all processors, calls top-level strategy (refine) thisProxy[CkMyPe()].Loadbalancing(atlevel); } } #endif }
void CentralLB::ReceiveStats(CkMarshalledCLBStatsMessage &msg) { #if CMK_LBDB_ON if (statsMsgsList == NULL) { statsMsgsList = new CLBStatsMsg*[CkNumPes()]; CmiAssert(statsMsgsList != NULL); for(int i=0; i < CkNumPes(); i++) statsMsgsList[i] = 0; } if (statsData == NULL) statsData = new LDStats; // loop through all CLBStatsMsg in the incoming msg int count = msg.getCount(); for (int num = 0; num < count; num++) { CLBStatsMsg *m = msg.getMessage(num); CmiAssert(m!=NULL); const int pe = m->from_pe; DEBUGF(("Stats msg received, %d %d %d %p step %d\n", pe,stats_msg_count,m->n_objs,m,step())); #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_)) /* * if(m->step < step()){ * //TODO: if a processor is redoing an old load balance step.. * //tell it that the step is done and that it should not perform any migrations * thisProxy[pe].ReceiveDummyMigration(); * }*/ #endif if(!CmiNodeAlive(pe)){ DEBUGF(("[%d] ReceiveStats called from invalidProcessor %d\n",CkMyPe(),pe)); continue; } if (m->avail_vector!=NULL) { LBDatabaseObj()->set_avail_vector(m->avail_vector, m->next_lb); } if (statsMsgsList[pe] != 0) { CkPrintf("*** Unexpected CLBStatsMsg in ReceiveStats from PE %d ***\n", pe); } else { statsMsgsList[pe] = m; #if USE_REDUCTION depositData(m); #else // store per processor data right away struct ProcStats &procStat = statsData->procs[pe]; procStat.pe = pe; procStat.total_walltime = m->total_walltime; procStat.idletime = m->idletime; procStat.bg_walltime = m->bg_walltime; #if CMK_LB_CPUTIMER procStat.total_cputime = m->total_cputime; procStat.bg_cputime = m->bg_cputime; #endif procStat.pe_speed = m->pe_speed; //procStat.utilization = 1.0; procStat.available = CmiTrue; procStat.n_objs = m->n_objs; statsData->n_objs += m->n_objs; statsData->n_comm += m->n_comm; #endif #if defined(TEMP_LDB) procStat.pe_temp=m->pe_temp; procStat.pe_speed=m->pe_speed; #endif stats_msg_count++; } } // end of for const int clients = CkNumValidPes(); DEBUGF(("THIS POINT count = %d, clients = %d\n",stats_msg_count,clients)); if (stats_msg_count == clients) { DEBUGF(("[%d] All stats messages received \n",CmiMyPe())); statsData->nprocs() = stats_msg_count; thisProxy[CkMyPe()].LoadBalance(); } #endif }
void CkMarshalledCLBStatsMessage::add(CkMarshalledCLBStatsMessage &m) { int count = m.getCount(); for (int i=0; i<count; i++) add(m.getMessage(i)); }