void SamplerSMARTS::nextMode(bool rotate, FlowID fid, EmuMode mod){ if (rotate){ fetchNextMode(); I(next_mode != EmuInit); //If in live mode and warmup is to be forced if(BootLoader::genwarm > 0 && next_mode == EmuTiming) { BootLoader::genwarm--; setMode(EmuWarmup, fid); //setMode(EmuDetail, fid); } else if(BootLoader::live_warmup > 0 && next_mode == EmuTiming) { BootLoader::live_warmup--; //BootLoader::sample_count++; setMode(EmuDetail, fid); //setMode(EmuRabbit, fid); } else { setMode(next_mode, fid); } I(mode == next_mode); if (next_mode == EmuRabbit){ setModeNativeRabbit(); } setNextSwitch(getNextSwitch() + sequence_size[sequence_pos]); }else{ I(0); } }
bool TrafficLight::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper) { switch (variable) { case TRACI_ID_LIST: return wrapper->wrapStringList(objID, variable, getIDList()); case ID_COUNT: return wrapper->wrapInt(objID, variable, getIDCount()); case TL_RED_YELLOW_GREEN_STATE: return wrapper->wrapString(objID, variable, getRedYellowGreenState(objID)); case TL_CONTROLLED_LANES: return wrapper->wrapStringList(objID, variable, getControlledLanes(objID)); case TL_CURRENT_PHASE: return wrapper->wrapInt(objID, variable, getPhase(objID)); case VAR_NAME: return wrapper->wrapString(objID, variable, getPhaseName(objID)); case TL_CURRENT_PROGRAM: return wrapper->wrapString(objID, variable, getProgram(objID)); case TL_PHASE_DURATION: return wrapper->wrapDouble(objID, variable, getPhaseDuration(objID)); case TL_NEXT_SWITCH: return wrapper->wrapDouble(objID, variable, getNextSwitch(objID)); case TL_CONTROLLED_JUNCTIONS: return wrapper->wrapStringList(objID, variable, getControlledJunctions(objID)); default: return false; } }
void SamplerSMARTS::nextMode(bool rotate, FlowID fid, EmuMode mod){ if (rotate){ fetchNextMode(); I(next_mode != EmuInit); setMode(next_mode, fid); I(mode == next_mode); if (next_mode == EmuRabbit){ setModeNativeRabbit(); } setNextSwitch(getNextSwitch() + sequence_size[sequence_pos]); }else{ I(0); } }
void SamplerSMARTS::queue(uint32_t insn, uint64_t pc, uint64_t addr, FlowID fid, char op, uint64_t icount, void *env) /* main qemu/gpu/tracer/... entry point {{{1 */ { I(fid < emul->getNumEmuls()); if(likely(!execute(fid, icount))) return; // QEMU can still send a few additional instructions (emul should stop soon) I(mode!=EmuInit); I(insn); // process the current sample mode if (getNextSwitch()>totalnInst) { if (mode == EmuRabbit || mode == EmuInit) return; if (mode == EmuDetail || mode == EmuTiming) { emul->queueInstruction(insn,pc,addr, (op&0xc0) /* thumb */ ,fid, env, getStatsFlag()); return; } I(mode == EmuWarmup); doWarmupOpAddr(op, addr); return; } // Look for the new mode I(getNextSwitch() <= totalnInst); // I(mode != next_mode); pthread_mutex_lock (&mode_lock); // if (getNextSwitch() > totalnInst){//another thread just changed the mode pthread_mutex_unlock (&mode_lock); return; } lastMode = mode; nextMode(ROTATE, fid); if (lastMode == EmuTiming) { // timing is going to be over if (getTime()>=maxnsTime || totalnInst>=nInstMax) { markDone(); pthread_mutex_unlock (&mode_lock); return; } if (doPower) { uint64_t mytime = getTime(); int64_t ti = mytime - lastTime; I(ti > 0); ti = (static_cast<int64_t>(freq)*ti)/1e9; BootLoader::getPowerModelPtr()->setSamplingRatio(getSamplingRatio()); BootLoader::getPowerModelPtr()->calcStats(ti, !(lastMode == EmuTiming), fid); lastTime = mytime; updateCPI(fid); if (doTherm) { BootLoader::getPowerModelPtr()->updateSescTherm(ti); } } } pthread_mutex_unlock (&mode_lock); }
uint64_t SamplerSMARTS::queue(uint64_t pc, uint64_t addr, FlowID fid, char op, int src1, int src2, int dest, int dest2) /* main qemu/gpu/tracer/... entry point {{{1 */ { I(fid < emul->getNumEmuls()); if(likely(!execute(fid, 1))) return 0; // QEMU can still send a few additional instructions (emul should stop soon) I(mode!=EmuInit); // process the current sample mode if (getNextSwitch()>totalnInst) { if (mode == EmuRabbit || mode == EmuInit) { uint64_t rabbitInst = getNextSwitch() - totalnInst; execute(fid,rabbitInst); // Qemu is not going to return untill it has executed these many instructions // Or untill it hits a syscall that causes it to exit // Untill then, you are on your own. Sit back and relax! return rabbitInst; } if (mode == EmuDetail || mode == EmuTiming) { emul->queueInstruction(pc,addr, fid, op, src1, src2, dest, dest2, getStatsFlag()); return 0; } I(mode == EmuWarmup); #if 1 if ( op == iLALU_LD || op == iSALU_ST) // cache warmup fake inst, do not need SRC deps (faster) emul->queueInstruction(0,addr, fid, op, LREG_R0, LREG_R0, LREG_InvalidOutput, LREG_InvalidOutput, false); #else //doWarmupOpAddr(static_cast<InstOpcode>(op), addr); #endif return 0; } // Look for the new mode I(getNextSwitch() <= totalnInst); // I(mode != next_mode); pthread_mutex_lock (&mode_lock); // if (getNextSwitch() > totalnInst){//another thread just changed the mode pthread_mutex_unlock (&mode_lock); return 0; } lastMode = mode; nextMode(ROTATE, fid); if (lastMode == EmuTiming) { // timing is going to be over #if 0 static double last_timing = 0; static long long last_globalClock = 0; MSG("%f %lld" ,iusage[EmuTiming]->getDouble() ,globalClock-last_globalClock); last_timing = iusage[EmuTiming]->getDouble(); last_globalClock = globalClock; #endif BootLoader::reportSample(); if (getTime()>=maxnsTime || totalnInst>=nInstMax) { markDone(); pthread_mutex_unlock (&mode_lock); return 0; } if (doPower) { uint64_t mytime = getTime(); int64_t ti = mytime - lastTime; I(ti > 0); ti = (static_cast<int64_t>(freq)*ti)/1e9; BootLoader::getPowerModelPtr()->setSamplingRatio(getSamplingRatio()); BootLoader::getPowerModelPtr()->calcStats(ti, !(lastMode == EmuTiming), fid); lastTime = mytime; updateCPI(fid); if (doTherm) { BootLoader::getPowerModelPtr()->updateSescTherm(ti); } } } pthread_mutex_unlock (&mode_lock); return 0; }