void TraceCounter::endOverview() { DEBUGF(("%d/%d DEBUG: endOverview\n", CmiMyPe(), CmiNumPes())); double t = TraceTimer(); int _numEntries=_entryTable.size(); long long value1 = 0, value2 = 0; int genRead; if ((genRead=read_counters(counter1_->code, &value1, counter2_->code, &value2)) < 0 || genRead != genStart_) { CmiPrintf("genRead %d genStart_ %d counter1 %ld counter2 %ld\n", genRead, genStart_, value1, value2); traceClose(); CmiAbort("ERROR: read_counters() in endOverview\n"); } DEBUGF(( "%d/%d DEBUG: endOverview genRead %d Time %f counter1 %ld counter2 %ld\n", CmiMyPe(), CmiNumPes(), genRead, t-startEP_, value1, value2)); dirty_ = false; CpvAccess(_logPool)->setEp(_numEntries, counter1_->index, value1, counter2_->index, value2, t-startEP_); DEBUGF(( "%d/%d OVERVIEW phase%d Time(us) %f %s %ld %s %ld Idle(us) %f" " (overflow? MAX=%ld)\n", CmiMyPe(), CmiNumPes(), phase_, (t-startEP_)*1e6, counter1_->arg, value1, counter2_->arg, value2, idleTime_*1e6, MAXLONGLONG)); // this is phase boundary anyway, so switch counters switchCounters(); }
TraceThreadListener::~TraceThreadListener() { traceWrite(); traceFlush(); traceClose(); ProcessListener.deregisterThreadListener(ThreadID); }
//! begin/end execution of a Charm++ entry point //! NOTE: begin/endPack and begin/endUnpack can be called in between //! a beginExecute and its corresponding endExecute. void TraceCounter::endExecute() { DEBUGF(("%d/%d DEBUG: endExecute EP %d genStart_ %d\n", CmiMyPe(), CmiNumPes(), execEP_, genStart_)); if (!traceOn_ || overview_) { return; } if (status_!=WORKING) { static bool print = true; if (print) { print = false; if (CmiMyPe()==0) { CmiPrintf("WARN: %d endExecute called when status not WORKING!\n", CmiMyPe()); } } return; } else { status_=IDLE; } double t = TraceTimer(); long long value1 = 0, value2 = 0; int genRead; if ((genRead=read_counters(counter1_->code, &value1, counter2_->code, &value2)) < 0 || genRead != genStart_) { CmiPrintf("genRead %d genStart_ %d counter1 %ld counter2 %ld\n", genRead, genStart_, value1, value2); traceClose(); CmiAbort("ERROR: read_counters() in endExecute\n"); } DEBUGF(( "%d/%d DEBUG: endExecute genRead %d Time %f counter1 %d counter2 %ld\n", CmiMyPe(), CmiNumPes(), genRead, t-startEP_, value1, value2)); if (execEP_ != -1) { dirty_ = true; CpvAccess(_logPool)->setEp(execEP_, counter1_->index, value1, counter2_->index, value2, t-startEP_); if (!switchByPhase_) { switchCounters(); } } }
//! destructor TraceCounter::~TraceCounter() { delete [] commandLine_; traceClose(); }
static void _exitHandler(envelope *env) { DEBUGF(("exitHandler called on %d msgtype: %d\n", CkMyPe(), env->getMsgtype())); switch(env->getMsgtype()) { case StartExitMsg: CkAssert(CkMyPe()==0); if (!_CkExitFnVec.isEmpty()) { CkExitFn fn = _CkExitFnVec.deq(); fn(); break; } // else goto next case ExitMsg: CkAssert(CkMyPe()==0); if(_exitStarted) { CmiFree(env); return; } _exitStarted = 1; CkNumberHandler(_charmHandlerIdx,(CmiHandler)_discardHandler); CkNumberHandler(_bocHandlerIdx, (CmiHandler)_discardHandler); env->setMsgtype(ReqStatMsg); env->setSrcPe(CkMyPe()); // if exit in ring, instead of broadcasting, send in ring if (_ringexit){ DEBUGF(("[%d] Ring Exit \n",CkMyPe())); const int stride = CkNumPes()/_ringtoken; int pe = 0; while (pe<CkNumPes()) { CmiSyncSend(pe, env->getTotalsize(), (char *)env); pe += stride; } CmiFree(env); }else{ CmiSyncBroadcastAllAndFree(env->getTotalsize(), (char *)env); } break; case ReqStatMsg: #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_)) _messageLoggingExit(); #endif DEBUGF(("ReqStatMsg on %d\n", CkMyPe())); CkNumberHandler(_charmHandlerIdx,(CmiHandler)_discardHandler); CkNumberHandler(_bocHandlerIdx, (CmiHandler)_discardHandler); /*FAULT_EVAC*/ if(CmiNodeAlive(CkMyPe())){ #if CMK_WITH_STATS _sendStats(); #endif _mainDone = 1; // This is needed because the destructors for // readonly variables will be called when the program // exits. If the destructor is called while _mainDone // is 0, it will assume that the readonly variable was // declared locally. On all processors other than 0, // _mainDone is never set to 1 before the program exits. #if CMK_TRACE_ENABLED if (_ringexit) traceClose(); #endif } if (_ringexit) { int stride = CkNumPes()/_ringtoken; int pe = CkMyPe()+1; if (pe < CkNumPes() && pe % stride != 0) CmiSyncSendAndFree(pe, env->getTotalsize(), (char *)env); else CmiFree(env); } else CmiFree(env); //everyone exits here - there may be issues with leftover messages in the queue #if CMK_WITH_STATS if(CkMyPe()) #endif { DEBUGF(("[%d] Calling converse exit \n",CkMyPe())); ConverseExit(); if(CharmLibInterOperate) CpvAccess(interopExitFlag) = 1; } break; #if CMK_WITH_STATS case StatMsg: CkAssert(CkMyPe()==0); _allStats[env->getSrcPe()] = (Stats*) EnvToUsr(env); _numStatsRecd++; DEBUGF(("StatMsg on %d with %d\n", CkMyPe(), _numStatsRecd)); /*FAULT_EVAC*/ if(_numStatsRecd==CkNumValidPes()) { _printStats(); DEBUGF(("[%d] Calling converse exit \n",CkMyPe())); ConverseExit(); if(CharmLibInterOperate) CpvAccess(interopExitFlag) = 1; } break; #endif default: CmiAbort("Internal Error(_exitHandler): Unknown-msg-type. Contact Developers.\n"); } }