// assmebly all stats messages from children void HybridBaseLB::buildStats(int atlevel) { #if CMK_LBDB_ON // build LDStats LevelData *lData = levelData[atlevel]; LDStats *statsData = lData->statsData; CLBStatsMsg **statsMsgsList = lData->statsMsgsList; int stats_msg_count = lData->stats_msg_count; // statsMsgsList DEBUGF(("[%d] buildStats for %d nobj:%d\n", CkMyPe(), stats_msg_count, statsData->n_objs)); statsData->nprocs() = stats_msg_count; statsData->objData.resize(statsData->n_objs); statsData->commData.resize(statsData->n_comm); statsData->from_proc.resize(statsData->n_objs); statsData->to_proc.resize(statsData->n_objs); int nobj = 0; int nmigobj = 0; int ncom = 0; for (int n=0; n<stats_msg_count; n++) { int i; CLBStatsMsg *msg = statsMsgsList[n]; int pe = msg->from_pe; for (i=0; i<msg->n_objs; i++) { // need to map index to relative index statsData->from_proc[nobj] = statsData->to_proc[nobj] = NeighborIndex(pe, atlevel); statsData->objData[nobj] = msg->objData[i]; if (msg->objData[i].migratable) nmigobj++; nobj++; } for (i=0; i<msg->n_comm; i++) { statsData->commData[ncom] = msg->commData[i]; ncom++; } // free the message delete msg; statsMsgsList[n]=0; } if (_lb_args.debug()>1) { CmiPrintf("[%d] n_obj:%d migratable:%d ncom:%d at level %d at %f.\n", CkMyPe(), nobj, nmigobj, ncom, atlevel, CkWallTimer()); } CmiAssert(statsData->n_objs == nobj); CmiAssert(statsData->n_comm == ncom); statsData->n_migrateobjs = nmigobj; #endif }
// build a message based on our LDStats for sending to parent // shrink if neccessary CLBStatsMsg * HybridBaseLB::buildCombinedLBStatsMessage(int atlevel) { #if CMK_LBDB_ON int i; double obj_walltime, obj_nmwalltime; #if CMK_LB_CPUTIMER double obj_cputime, obj_nmcputime; #endif LDStats *statsData = levelData[atlevel]->statsData; CmiAssert(statsData); CLBStatsMsg* cmsg; int osz = statsData->n_objs; int csz = statsData->n_comm; int shrink = 0; if ((statsStrategy == SHRINK || statsStrategy == SHRINK_NULL) && atlevel == tree->numLevels()-2) { shrink = 1; obj_walltime = obj_nmwalltime = 0.0; #if CMK_LB_CPUTIMER obj_cputime = obj_nmcputime = 0.0; #endif for (i=0; i<osz; i++) { if (statsData->objData[i].migratable) { obj_walltime += statsData->objData[i].wallTime; #if CMK_LB_CPUTIMER obj_cputime += statsData->objData[i].cpuTime; #endif } else { obj_nmwalltime += statsData->objData[i].wallTime; #if CMK_LB_CPUTIMER obj_nmcputime += statsData->objData[i].cpuTime; #endif } } // skip obj and comm data osz = csz = 0; } cmsg = new CLBStatsMsg(osz, csz); int mype = CkMyPe(); cmsg->from_pe = mype; // real PE // Get stats cmsg->pe_speed = 0; cmsg->total_walltime = 0.0; cmsg->idletime = 0.0; cmsg->bg_walltime = 0.0; #if CMK_LB_CPUTIMER cmsg->total_cputime = 0.0; cmsg->bg_cputime = 0.0; #endif for (int pe=0; pe<statsData->nprocs(); pe++) { struct ProcStats &procStat = statsData->procs[pe]; cmsg->pe_speed += procStat.pe_speed; // important cmsg->total_walltime += procStat.total_walltime; cmsg->idletime += procStat.idletime; cmsg->bg_walltime += procStat.bg_walltime; #if CMK_LB_CPUTIMER cmsg->total_cputime += procStat.total_cputime; cmsg->bg_cputime += procStat.bg_cputime; #endif } /* cmsg->idletime = 0.0; cmsg->bg_walltime = 0.0; cmsg->bg_cputime = 0.0; */ // copy obj data cmsg->n_objs = osz; for (i=0; i<osz; i++) { cmsg->objData[i] = statsData->objData[i]; } // copy comm data cmsg->n_comm = csz; for (i=0; i<csz; i++) { LDCommData &commData = statsData->commData[i]; cmsg->commData[i] = commData; // modify processor to be this real pe if (commData.from_proc()) cmsg->commData[i].src_proc = mype; if (commData.receiver.get_type() == LD_PROC_MSG) cmsg->commData[i].receiver.setProc(mype); } if (shrink) { cmsg->total_walltime = obj_walltime; cmsg->bg_walltime += obj_nmwalltime; #if CMK_LB_CPUTIMER cmsg->total_cputime = obj_cputime; cmsg->bg_cputime += obj_nmcputime; #endif } return cmsg; #else return NULL; #endif }