astra-sim-alibabacloud/astra-sim/system/UsageTracker.cc (73 lines of code) (raw):

/****************************************************************************** This source code is licensed under the MIT license found in the LICENSE file in the root directory of this source tree. *******************************************************************************/ #include "UsageTracker.hh" #include "Sys.hh" namespace AstraSim { UsageTracker::UsageTracker(int levels) { this->levels = levels; this->current_level = 0; this->last_tick = 0; } void UsageTracker::increase_usage() { if (current_level < levels - 1) { Usage u(current_level, last_tick, Sys::boostedTick()); usage.push_back(u); current_level++; last_tick = Sys::boostedTick(); } } void UsageTracker::decrease_usage() { if (current_level > 0) { Usage u(current_level, last_tick, Sys::boostedTick()); usage.push_back(u); current_level--; last_tick = Sys::boostedTick(); } } void UsageTracker::set_usage(int level) { if (current_level != level) { Usage u(current_level, last_tick, Sys::boostedTick()); usage.push_back(u); current_level = level; last_tick = Sys::boostedTick(); } } void UsageTracker::report(CSVWriter* writer, int offset) { uint64_t col = offset * 3; uint64_t row = 1; for (auto a : usage) { writer->write_cell(row, col, std::to_string(a.start)); writer->write_cell(row++, col + 1, std::to_string(a.level)); } // writer->close_file_cont(); return; } std::list<std::pair<uint64_t, double>> UsageTracker::report_percentage( uint64_t cycles) { decrease_usage(); increase_usage(); Tick total_activity_possible = (this->levels - 1) * cycles; std::list<Usage>::iterator usage_pointer = this->usage.begin(); Tick current_activity = 0; Tick period_start = 0; Tick period_end = cycles; std::list<std::pair<uint64_t, double>> result; while (usage_pointer != this->usage.end()) { Usage current_usage = *usage_pointer; uint64_t begin = std::max(static_cast<uint64_t>(period_start), current_usage.start); uint64_t end = std::min(static_cast<uint64_t>(period_end), current_usage.end); assert(begin <= end); current_activity += ((end - begin) * current_usage.level); if (current_usage.end >= period_end) { result.push_back(std::make_pair( (uint64_t)period_end, (((double)current_activity) / total_activity_possible) * 100)); period_start += cycles; period_end += cycles; current_activity = 0; } else { std::advance(usage_pointer, 1); } } return result; } } // namespace AstraSim