/* * SMUCNGPerfAnalyzer.cpp * * Created on: Jul 20, 2019 * Author: carla */ #include "../../commonderivedmetrics/DerivedMetrics.h" #include "SMUCNGPerfAnalyzer.h" SMUCNGPerfAnalyzer::SMUCNGPerfAnalyzer(const std::string& name): AnalyzerTemplate(name) { } SMUCNGPerfAnalyzer::~SMUCNGPerfAnalyzer() { } void SMUCNGPerfAnalyzer::printConfig(LOG_LEVEL ll) { LOG_VAR(ll) << " No Window: "; AnalyzerTemplate::printConfig(ll); } void SMUCNGPerfAnalyzer::compute(U_Ptr unit) { auto inputs = unit->getInputs(); auto timestamp = getTimestamp(); //ToDo timestamp minus some time... auto outputs = unit->getOutputs(); for(auto& outSensor : outputs){ if(outSensor->getName().find('cpi') != std::string::npos){ vector * bufferInstructions = nullptr; bufferInstructions = _queryEngine.querySensor(inputs[_metricToPosition[SMUCSensorBase::INSTRUCTIONS]]->getName(), timestamp, timestamp, bufferInstructions, false); //use absolute timestamp vector * bufferClocks = nullptr; bufferClocks = _queryEngine.querySensor(inputs[_metricToPosition[SMUCSensorBase::CLOCKS]]->getName(), timestamp, timestamp, bufferClocks, false); //use absolute timestamp reading_t clockspersecond; bool wascalced = calculateMetricRatio(*(bufferClocks->begin()),*(bufferInstructions->begin()), outSensor->getScalingFactor(), clockspersecond); delete bufferInstructions; delete bufferClocks; if(wascalced) { outSensor->storeReading(clockspersecond); } } else if(outSensor->getName().find('frequency') != std::string::npos){ const unsigned int MAX_FREQ_MHZ = 2700; const unsigned int MIN_FREQ_MHZ = 1200; vector * bufferClocks = nullptr; bufferClocks = _queryEngine.querySensor(inputs[_metricToPosition[SMUCSensorBase::INSTRUCTIONS]]->getName(), timestamp, timestamp, bufferClocks, false); //use absolute timestamp vector * bufferClockRef = nullptr; bufferClockRef = _queryEngine.querySensor(inputs[_metricToPosition[SMUCSensorBase::CLOCKS]]->getName(), timestamp, timestamp, bufferClockRef, false); //use absolute timestamp reading_t frequency; bool wascalced = calculateFrequency(*(bufferClockRef->begin()),*(bufferClocks->begin()), MIN_FREQ_MHZ, MAX_FREQ_MHZ, frequency); delete bufferClocks; delete bufferClockRef; if(wascalced) { outSensor->storeReading(frequency); } } } }