/* * SMUCNGPerfOperator.cpp * * Created on: Jul 20, 2019 * Author: carla */ #include "../../includes/DerivedMetrics.h" #include "SMUCNGPerfOperator.h" SMUCNGPerfOperator::SMUCNGPerfOperator(const std::string& name): OperatorTemplate(name) { _buffers.resize(5); } SMUCNGPerfOperator::~SMUCNGPerfOperator() { } void SMUCNGPerfOperator::printConfig(LOG_LEVEL ll) { OperatorTemplate::printConfig(ll); LOG_VAR(ll) << " metric to position map: "; for(auto &kv : _metricToPosition){ LOG_VAR(ll) << "Metric = " << kv.first << "Position = " << kv.second; } } void SMUCNGPerfOperator::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->getPosition() == _metricToPosition[SMUCSensorBase::CPI]) { std::vector & instructions = _buffers[0]; std::vector & clocks = _buffers[1]; _queryEngine.querySensor(inputs[_metricToPosition[SMUCSensorBase::INSTRUCTIONS]]->getName(), timestamp, timestamp, &instructions, false); //use absolute timestamp _queryEngine.querySensor(inputs[_metricToPosition[SMUCSensorBase::CLOCKS]]->getName(), timestamp, timestamp, &clocks, false); //use absolute timestamp reading_t clockspersecond; bool wascalced = false; if(instructions.size() > 0 && clocks.size() > 0) { if(calculateMetricRatio(clocks.begin(),instructions.begin(), outSensor->getScalingFactor(), clockspersecond)){ outSensor->storeReading(clockspersecond); } } } else if (outSensor->getPosition() == _metricToPosition[SMUCSensorBase::FREQUENCY]) { std::vector & clocks = _buffers[0]; std::vector & clocks_ref = _buffers[1]; _queryEngine.querySensor(inputs[_metricToPosition[SMUCSensorBase::CLOCKS]]->getName(), timestamp, timestamp, &clocks, false); //use absolute timestamp _queryEngine.querySensor(inputs[_metricToPosition[SMUCSensorBase::CLOCKS_REF]]->getName(), timestamp, timestamp, &clocks_ref, false); //use absolute timestamp reading_t frequency; bool wascalced = false; if( clocks.size() > 0 && clocks_ref.size() > 0){ if(calculateFrequency(clocks_ref.begin(),clocks.begin(), MIN_FREQ_MHZ, MAX_FREQ_MHZ, frequency)) { outSensor->storeReading(frequency); } } } resetBuffers(); } } void SMUCNGPerfOperator::resetBuffers(){ for(auto &buffer: _buffers){ buffer.clear(); } }