statistics.cc
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· CC 代码 · 共 293 行
CC
293 行
/* * Copyright (c) 2003, 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. * * Authors: Nathan L. Binkert */#include <iomanip>#include <fstream>#include <list>#include <map>#include <string>#include "base/callback.hh"#include "base/cprintf.hh"#include "base/hostinfo.hh"#include "base/misc.hh"#include "base/statistics.hh"#include "base/str.hh"#include "base/time.hh"#include "base/trace.hh"#include "base/stats/statdb.hh"using namespace std;namespace Stats {StatData *DataAccess::find() const{ return Database::find(const_cast<void *>((const void *)this));}const StatData *getStatData(const void *stat){ return Database::find(const_cast<void *>(stat));}voidDataAccess::map(StatData *data){ Database::regStat(this, data);}StatData *DataAccess::statData(){ StatData *ptr = find(); assert(ptr); return ptr;}const StatData *DataAccess::statData() const{ const StatData *ptr = find(); assert(ptr); return ptr;}voidDataAccess::setInit(){ statData()->flags |= init;}voidDataAccess::setPrint(){ Database::regPrint(this);}StatData::StatData() : flags(none), precision(-1), prereq(0){ static int count = 0; id = count++;}StatData::~StatData(){}boolStatData::less(StatData *stat1, StatData *stat2){ const string &name1 = stat1->name; const string &name2 = stat2->name; vector<string> v1; vector<string> v2; tokenize(v1, name1, '.'); tokenize(v2, name2, '.'); int last = min(v1.size(), v2.size()) - 1; for (int i = 0; i < last; ++i) if (v1[i] != v2[i]) return v1[i] < v2[i]; // Special compare for last element. if (v1[last] == v2[last]) return v1.size() < v2.size(); else return v1[last] < v2[last]; return false;}boolStatData::baseCheck() const{ if (!(flags & init)) {#ifdef DEBUG cprintf("this is stat number %d\n", id);#endif panic("Not all stats have been initialized"); return false; } if ((flags & print) && name.empty()) { panic("all printable stats must be named"); return false; } return true;}voidFormulaBase::result(VResult &vec) const{ if (root) vec = root->result();}ResultFormulaBase::total() const{ return root ? root->total() : 0.0;}size_tFormulaBase::size() const{ if (!root) return 0; else return root->size();}voidFormulaBase::reset(){}boolFormulaBase::zero() const{ VResult vec; result(vec); for (int i = 0; i < vec.size(); ++i) if (vec[i] != 0.0) return false; return true;}voidFormulaBase::update(StatData *){}stringFormulaBase::str() const{ return root ? root->str() : "";}Formula::Formula(){ setInit();}Formula::Formula(Temp r){ root = r; assert(size());}const Formula &Formula::operator=(Temp r){ assert(!root && "Can't change formulas"); root = r; assert(size()); return *this;}const Formula &Formula::operator+=(Temp r){ if (root) root = NodePtr(new BinaryNode<std::plus<Result> >(root, r)); else root = r; assert(size()); return *this;}voidcheck(){ typedef Database::stat_list_t::iterator iter_t; iter_t i, end = Database::stats().end(); for (i = Database::stats().begin(); i != end; ++i) { StatData *data = *i; assert(data); if (!data->check() || !data->baseCheck()) panic("stat check failed for %s\n", data->name); } int j = 0; for (i = Database::stats().begin(); i != end; ++i) { StatData *data = *i; if (!(data->flags & print)) data->name = "__Stat" + to_string(j++); } Database::stats().sort(StatData::less); if (i == end) return; iter_t last = i; ++i; for (i = Database::stats().begin(); i != end; ++i) { if ((*i)->name == (*last)->name) panic("same name used twice! name=%s\n", (*i)->name); last = i; }}CallbackQueue resetQueue;voidreset(){ Database::stat_list_t::iterator i = Database::stats().begin(); Database::stat_list_t::iterator end = Database::stats().end(); while (i != end) { StatData *data = *i; data->reset(); ++i; } resetQueue.process();}voidregisterResetCallback(Callback *cb){ resetQueue.add(cb);}/* namespace Stats */ }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?