Get rid of the Statistics and Statreset ParamContexts, and

expose all of the relevant functionality to python.  Clean
up the mysql code while we're at it.

--HG--
extra : convert_revision : 5b711202a5a452b8875ebefb136a156b65c24279
This commit is contained in:
Nathan Binkert 2007-02-17 22:52:32 -08:00
parent 01f32efa4b
commit e94103397c
16 changed files with 278 additions and 168 deletions

View file

@ -79,6 +79,7 @@ base_sources = Split('''
base/loader/object_file.cc
base/loader/symtab.cc
base/stats/events.cc
base/stats/output.cc
base/stats/statdb.cc
base/stats/visit.cc
base/stats/text.cc
@ -134,6 +135,7 @@ base_sources = Split('''
python/swig/main_wrap.cc
python/swig/event_wrap.cc
python/swig/random_wrap.cc
python/swig/stats_wrap.cc
python/swig/trace_wrap.cc
python/swig/pyevent.cc
@ -148,7 +150,6 @@ base_sources = Split('''
sim/sim_events.cc
sim/sim_object.cc
sim/startup.cc
sim/stat_context.cc
sim/stat_control.cc
sim/system.cc
''')

View file

@ -2839,6 +2839,7 @@ class Temp
*/
void check();
void dump();
void reset();
void registerResetCallback(Callback *cb);

View file

@ -49,14 +49,6 @@ using namespace std;
namespace Stats {
MySqlRun MySqlDB;
bool
MySqlConnected()
{
return MySqlDB.connected();
}
void
MySqlRun::connect(const string &host, const string &user, const string &passwd,
const string &db, const string &name, const string &sample,
@ -198,7 +190,7 @@ SetupStat::init()
unsigned
SetupStat::setup()
{
MySQL::Connection &mysql = MySqlDB.conn();
MySQL::Connection &mysql = run->conn();
stringstream insert;
ccprintf(insert,
@ -317,7 +309,7 @@ void
InsertData::flush()
{
if (size) {
MySQL::Connection &mysql = MySqlDB.conn();
MySQL::Connection &mysql = run->conn();
assert(mysql.connected());
mysql.query(query);
if (mysql.error)
@ -349,7 +341,7 @@ InsertData::insert()
first = false;
size += sprintf(query + size, "(%u,%d,%d,%u,%llu,\"%f\")",
stat, x, y, MySqlDB.run(), (unsigned long long)tick,
stat, x, y, run->run(), (unsigned long long)tick,
data);
}
@ -367,7 +359,7 @@ struct InsertSubData
void
InsertSubData::setup()
{
MySQL::Connection &mysql = MySqlDB.conn();
MySQL::Connection &mysql = run->conn();
assert(mysql.connected());
stringstream insert;
ccprintf(insert,
@ -386,7 +378,7 @@ InsertSubData::setup()
void
InsertFormula(uint16_t stat, const string &formula)
{
MySQL::Connection &mysql = MySqlDB.conn();
MySQL::Connection &mysql = run->conn();
assert(mysql.connected());
stringstream insert_formula;
ccprintf(insert_formula,
@ -400,7 +392,7 @@ InsertFormula(uint16_t stat, const string &formula)
stringstream insert_ref;
ccprintf(insert_ref,
"INSERT INTO formula_ref(fr_stat,fr_run) values(%d, %d)",
stat, MySqlDB.run());
stat, run->run());
mysql.query(insert_ref);
// if (mysql.error)
@ -413,7 +405,7 @@ InsertFormula(uint16_t stat, const string &formula)
void
UpdatePrereq(uint16_t stat, uint16_t prereq)
{
MySQL::Connection &mysql = MySqlDB.conn();
MySQL::Connection &mysql = run->conn();
assert(mysql.connected());
stringstream update;
ccprintf(update, "UPDATE stats SET st_prereq=%d WHERE st_id=%d",
@ -426,6 +418,29 @@ UpdatePrereq(uint16_t stat, uint16_t prereq)
panic("could not commit transaction\n%s\n", mysql.error);
}
MySql::MySql()
: run(new MySqlRun)
{}
MySql::~MySql()
{
delete run;
}
void
MySql::connect(const string &host, const string &user, const string &passwd,
const string &db, const string &name, const string &sample,
const string &project)
{
run->connect(host, user, passwd, db, name, sample, project);
}
bool
MySql::connected() const
{
run->connected();
}
void
MySql::configure()
{
@ -434,7 +449,7 @@ MySql::configure()
*/
using namespace Database;
MySQL::Connection &mysql = MySqlDB.conn();
MySQL::Connection &mysql = run->conn();
stat_list_t::const_iterator i, end = stats().end();
for (i = stats().begin(); i != end; ++i) {
@ -605,7 +620,7 @@ MySql::configure(const FormulaData &data)
bool
MySql::valid() const
{
return MySqlDB.connected();
return run->connected();
}
void
@ -620,7 +635,7 @@ MySql::output()
// store sample #
newdata.tick = curTick;
MySQL::Connection &mysql = MySqlDB.conn();
MySQL::Connection &mysql = run->conn();
Database::stat_list_t::const_iterator i, end = Database::stats().end();
for (i = Database::stats().begin(); i != end; ++i) {
@ -825,4 +840,21 @@ MySql::visit(const FormulaData &data)
output(data);
}
/* namespace Stats */ }
bool
initMySQL(string host, string user, string password, string database,
string name, string sample, string project)
{
extern list<Output *> OutputList;
static MySql mysql;
if (mysql.connected())
return false;
if (user.empty())
user = username();
mysql.connect(host, user, password, database, name, sample, project);
OutputList.push_back(&mysql);
return true;
}

View file

@ -35,14 +35,13 @@
#include <string>
#include "base/stats/output.hh"
#include "config/use_mysql.hh"
namespace MySQL { class Connection; }
namespace Stats {
class DistDataData;
class MySqlRun;
bool MySqlConnected();
extern MySqlRun MySqlDB;
struct SetupStat
{
@ -95,6 +94,9 @@ class InsertData
class MySql : public Output
{
protected:
MySqlRun *run; /* Hide the implementation so we don't have a
#include mess */
SetupStat stat;
InsertData newdata;
std::list<FormulaData *> formulas;
@ -116,6 +118,17 @@ class MySql : public Output
assert(i != idmap.end());
return (*i).second;
}
public:
MySql(MySqlRun &_run){}
~MySql();
void connect(const std::string &host, const std::string &user,
const std::string &passwd, const std::string &db,
const std::string &name, const std::string &sample,
const std::string &project);
bool connected() const;
public:
// Implement Visit
virtual void visit(const ScalarData &data);
@ -149,6 +162,20 @@ class MySql : public Output
void configure(const FormulaData &data);
};
bool initMySQL(std::string host, std::string database, std::string user = "",
std::string passwd = "", std::string name = "test",
std::string sample = "0", std::string project = "test");
#if !USE_MYSQL
inline bool
initMySQL(std::string host, std::string user, std::string password,
std::string database, std::string name, std::string sample,
std::string project)
{
return false;
}
#endif
/* namespace Stats */ }
#endif // __BASE_STATS_MYSQL_HH__

70
src/base/stats/output.cc Normal file
View file

@ -0,0 +1,70 @@
/*
* Copyright (c) 2004-2005 The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution;
* neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors: Nathan Binkert
*/
#include <list>
#include "base/stats/output.hh"
#include "sim/eventq.hh"
#include "sim/host.hh"
using namespace std;
namespace Stats {
Tick lastDump(0);
list<Output *> OutputList;
void
dump()
{
assert(lastDump <= curTick);
if (lastDump == curTick)
return;
lastDump = curTick;
list<Output *>::iterator i = OutputList.begin();
list<Output *>::iterator end = OutputList.end();
for (; i != end; ++i) {
Output *output = *i;
if (!output->valid())
continue;
output->output();
}
}
/* namespace Stats */ }
void
debugDumpStats()
{
Stats::dump();
}

View file

@ -725,4 +725,25 @@ Text::visit(const FormulaData &data)
visit((const VectorData &)data);
}
bool
initText(const string &filename, bool desc, bool compat)
{
static Text text;
static bool connected = false;
if (connected)
return false;
extern list<Output *> OutputList;
text.open(*simout.find(filename));
text.descriptions = desc;
text.compat = compat;
OutputList.push_back(&text);
connected = true;
return true;
}
/* namespace Stats */ }

View file

@ -34,6 +34,7 @@
#include <iosfwd>
#include <string>
#include "base/output.hh"
#include "base/stats/output.hh"
namespace Stats {
@ -73,6 +74,8 @@ class Text : public Output
virtual void output();
};
bool initText(const std::string &filename, bool desc=true, bool compat=true);
/* namespace Stats */ }
#endif // __BASE_STATS_TEXT_HH__

View file

@ -110,6 +110,7 @@ swig_it('main')
swig_it('debug')
swig_it('event')
swig_it('random')
swig_it('stats')
swig_it('trace')
# Action function to build the zip archive. Uses the PyZipFile module

View file

@ -264,7 +264,7 @@ def main():
import objects
# set stats options
objects.Statistics.text_file = options.stats_file
internal.stats.initText(options.stats_file)
# set debugging options
for when in options.debug_break:

View file

@ -1,8 +1,6 @@
from m5.SimObject import SimObject
from m5.params import *
from Serialize import Serialize
from Serialize import Statreset
from Statistics import Statistics
class Root(SimObject):
type = 'Root'
@ -12,7 +10,5 @@ class Root(SimObject):
"print a progress message every n ticks (0 = never)")
output_file = Param.String('cout', "file to dump simulator output to")
checkpoint = Param.String('', "checkpoint file to load")
# stats = Param.Statistics(Statistics(), "statistics object")
# serialize = Param.Serialize(Serialize(), "checkpoint generation options")
stats = Statistics()
serialize = Serialize()

60
src/python/swig/stats.i Normal file
View file

@ -0,0 +1,60 @@
/*
* Copyright (c) 2006 The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution;
* neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors: Nathan Binkert
*/
%module stats
%include "std_string.i"
%{
#include "base/statistics.hh"
#include "base/stats/mysql.hh"
#include "base/stats/text.hh"
#include "sim/stat_control.hh"
%}
namespace Stats {
void initSimStats();
void initText(const std::string &filename, bool desc=true, bool compat=true);
void initMySQL(std::string host, std::string database, std::string user = "",
std::string passwd = "", std::string name = "test",
std::string sample = "0", std::string project = "test");
void StatEvent(bool dump, bool reset, Tick when = curTick, Tick repeat = 0);
void dump();
void reset();
/* namespace Stat */ }
%wrapper %{
// fix up module name to reflect the fact that it's inside the m5 package
#undef SWIG_name
#define SWIG_name "m5.internal._stats"
%}

View file

@ -53,6 +53,7 @@
#include "base/output.hh"
#include "base/pollevent.hh"
#include "base/statistics.hh"
#include "base/stats/output.hh"
#include "base/str.hh"
#include "base/time.hh"
#include "config/pythonhome.hh"
@ -220,7 +221,7 @@ loadIniFile(PyObject *_resolveFunc)
inifile.load(simout.resolve("config.ini"));
// Initialize statistics database
Stats::InitSimStats();
Stats::initSimStats();
}
@ -297,7 +298,6 @@ finalInit()
SimStartup();
}
/** Simulate for num_cycles additional cycles. If num_cycles is -1
* (the default), do not limit simulation; some other event must
* terminate the loop. Exported to Python via SWIG.
@ -350,16 +350,12 @@ simulate(Tick num_cycles = MaxTick)
async_event = false;
if (async_dump) {
async_dump = false;
using namespace Stats;
SetupEvent(Dump, curTick);
Stats::StatEvent(true, false);
}
if (async_dumpreset) {
async_dumpreset = false;
using namespace Stats;
SetupEvent(Dump | Reset, curTick);
Stats::StatEvent(true, true);
}
if (async_exit) {
@ -469,5 +465,5 @@ doExitCleanup()
ParamContext::cleanupAllContexts();
// print simulation stats
Stats::DumpNow();
Stats::dump();
}

View file

@ -32,6 +32,7 @@
#include <fcntl.h>
#include <unistd.h>
#include <fstream>
#include <string>
#include "arch/vtophys.hh"
@ -199,8 +200,7 @@ namespace AlphaPseudo
Tick when = curTick + delay * Clock::Int::ns;
Tick repeat = period * Clock::Int::ns;
using namespace Stats;
SetupEvent(Reset, when, repeat);
Stats::StatEvent(false, true, when, repeat);
}
void
@ -213,8 +213,7 @@ namespace AlphaPseudo
Tick when = curTick + delay * Clock::Int::ns;
Tick repeat = period * Clock::Int::ns;
using namespace Stats;
SetupEvent(Dump, when, repeat);
Stats::StatEvent(true, false, when, repeat);
}
void
@ -254,8 +253,7 @@ namespace AlphaPseudo
Tick when = curTick + delay * Clock::Int::ns;
Tick repeat = period * Clock::Int::ns;
using namespace Stats;
SetupEvent(Dump|Reset, when, repeat);
Stats::StatEvent(true, true, when, repeat);
}
void

View file

@ -407,36 +407,3 @@ Checkpoint::sectionExists(const std::string &section)
{
return db->sectionExists(section);
}
/** Hacked stat reset event */
class StatresetParamContext : public ParamContext
{
public:
StatresetParamContext(const string &section);
~StatresetParamContext();
void startup();
};
StatresetParamContext statParams("statsreset");
Param<Tick> reset_cycle(&statParams, "reset_cycle",
"Cycle to reset stats on", 0);
StatresetParamContext::StatresetParamContext(const string &section)
: ParamContext(section)
{ }
StatresetParamContext::~StatresetParamContext()
{
}
void
StatresetParamContext::startup()
{
if (reset_cycle > 0) {
Stats::SetupEvent(Stats::Reset, curTick + reset_cycle, 0);
cprintf("Stats reset event scheduled for %lli\n",
curTick + reset_cycle);
}
}

View file

@ -38,14 +38,9 @@
#include "base/callback.hh"
#include "base/hostinfo.hh"
#include "base/statistics.hh"
#include "base/str.hh"
#include "base/time.hh"
#include "base/stats/output.hh"
#include "cpu/base.hh"
#include "sim/eventq.hh"
#include "sim/sim_object.hh"
#include "sim/stat_control.hh"
#include "sim/root.hh"
using namespace std;
@ -63,11 +58,9 @@ namespace Stats {
Time statTime(true);
Tick startTick;
Tick lastDump(0);
class SimTicksReset : public Callback
struct SimTicksReset : public Callback
{
public:
void process()
{
statTime.set();
@ -92,7 +85,7 @@ statElapsedTicks()
SimTicksReset simTicksReset;
void
InitSimStats()
initSimStats()
{
simInsts
.functor(BaseCPU::numSimulatedInstructions)
@ -153,81 +146,40 @@ InitSimStats()
registerResetCallback(&simTicksReset);
}
class StatEvent : public Event
class _StatEvent : public Event
{
protected:
int flags;
private:
bool dump;
bool reset;
Tick repeat;
public:
StatEvent(EventQueue *queue, int _flags, Tick _when, Tick _repeat);
virtual void process();
virtual const char *description();
_StatEvent(bool _dump, bool _reset, Tick _when, Tick _repeat)
: Event(&mainEventQueue, Stat_Event_Pri), dump(_dump), reset(_reset),
repeat(_repeat)
{
setFlags(AutoDelete);
schedule(_when);
}
virtual void
process()
{
if (dump)
Stats::dump();
if (reset)
Stats::reset();
if (repeat)
new _StatEvent(dump, reset, curTick + repeat, repeat);
}
};
StatEvent::StatEvent(EventQueue *queue, int _flags, Tick _when, Tick _repeat)
: Event(queue, Stat_Event_Pri),
flags(_flags), repeat(_repeat)
{
setFlags(AutoDelete);
schedule(_when);
}
const char *
StatEvent::description()
{
return "Statistics dump and/or reset";
}
void
StatEvent::process()
StatEvent(bool dump, bool reset, Tick when, Tick repeat)
{
if (flags & Stats::Dump)
DumpNow();
if (flags & Stats::Reset) {
cprintf("Resetting stats at cycle %d!\n", curTick);
reset();
}
if (repeat)
schedule(curTick + repeat);
}
list<Output *> OutputList;
void
DumpNow()
{
assert(lastDump <= curTick);
if (lastDump == curTick)
return;
lastDump = curTick;
list<Output *>::iterator i = OutputList.begin();
list<Output *>::iterator end = OutputList.end();
for (; i != end; ++i) {
Output *output = *i;
if (!output->valid())
continue;
output->output();
}
}
void
SetupEvent(int flags, Tick when, Tick repeat, EventQueue *queue)
{
if (queue == NULL)
queue = &mainEventQueue;
new StatEvent(queue, flags, when, repeat);
new _StatEvent(dump, reset, when, repeat);
}
/* namespace Stats */ }
void debugDumpStats()
{
Stats::DumpNow();
}

View file

@ -31,25 +31,10 @@
#ifndef __SIM_STAT_CONTROL_HH__
#define __SIM_STAT_CONTROL_HH__
#include <fstream>
#include <list>
class EventQueue;
namespace Stats {
enum {
Reset = 0x1,
Dump = 0x2
};
class Output;
extern std::list<Output *> OutputList;
void DumpNow();
void SetupEvent(int flags, Tick when, Tick repeat = 0, EventQueue *queue = NULL);
void InitSimStats();
void initSimStats();
void StatEvent(bool dump, bool reset, Tick when = curTick, Tick repeat = 0);
/* namespace Stats */ }