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 + -
显示快捷键?