stat_control.cc revision 695
15083Sgblack@eecs.umich.edu/* 25083Sgblack@eecs.umich.edu * Copyright (c) 2003 The Regents of The University of Michigan 35083Sgblack@eecs.umich.edu * All rights reserved. 45083Sgblack@eecs.umich.edu * 55083Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65083Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75083Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85083Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95083Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105083Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115083Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125083Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135083Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145083Sgblack@eecs.umich.edu * this software without specific prior written permission. 155083Sgblack@eecs.umich.edu * 165083Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175083Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185083Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195083Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205083Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215083Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225083Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235083Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245083Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255083Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265083Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275083Sgblack@eecs.umich.edu */ 285083Sgblack@eecs.umich.edu 295083Sgblack@eecs.umich.edu// This file will contain default statistics for the simulator that 305083Sgblack@eecs.umich.edu// don't really belong to a specific simulator object 315083Sgblack@eecs.umich.edu 325083Sgblack@eecs.umich.edu#include <fstream> 335083Sgblack@eecs.umich.edu#include <iostream> 345083Sgblack@eecs.umich.edu#include <list> 355083Sgblack@eecs.umich.edu 365083Sgblack@eecs.umich.edu#include "base/callback.hh" 375083Sgblack@eecs.umich.edu#include "base/hostinfo.hh" 385083Sgblack@eecs.umich.edu#include "base/statistics.hh" 395083Sgblack@eecs.umich.edu#include "base/str.hh" 405083Sgblack@eecs.umich.edu#include "base/time.hh" 415083Sgblack@eecs.umich.edu#include "base/stats/output.hh" 425083Sgblack@eecs.umich.edu#include "sim/eventq.hh" 435083Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 445083Sgblack@eecs.umich.edu#include "sim/stat_control.hh" 455083Sgblack@eecs.umich.edu#include "sim/universe.hh" 465083Sgblack@eecs.umich.edu 475083Sgblack@eecs.umich.eduusing namespace std; 485083Sgblack@eecs.umich.edu 495083Sgblack@eecs.umich.eduStatistics::Formula hostInstRate; 505083Sgblack@eecs.umich.eduStatistics::Formula hostMemory; 515083Sgblack@eecs.umich.eduStatistics::Formula hostSeconds; 525083Sgblack@eecs.umich.eduStatistics::Formula hostTickRate; 535083Sgblack@eecs.umich.edu 545083Sgblack@eecs.umich.eduStatistics::Formula simInsts; 555083Sgblack@eecs.umich.eduStatistics::Formula simSeconds; 565083Sgblack@eecs.umich.eduStatistics::Formula simTicks; 575083Sgblack@eecs.umich.edu 585083Sgblack@eecs.umich.edunamespace Statistics { 595083Sgblack@eecs.umich.edu 605083Sgblack@eecs.umich.eduTime statTime(true); 615083Sgblack@eecs.umich.eduTick startTick; 625083Sgblack@eecs.umich.edu 635083Sgblack@eecs.umich.educlass SimTicksReset : public Callback 645083Sgblack@eecs.umich.edu{ 655083Sgblack@eecs.umich.edu public: 665083Sgblack@eecs.umich.edu void process() 675083Sgblack@eecs.umich.edu { 685083Sgblack@eecs.umich.edu statTime.set(); 695083Sgblack@eecs.umich.edu startTick = curTick; 705083Sgblack@eecs.umich.edu } 715083Sgblack@eecs.umich.edu}; 725083Sgblack@eecs.umich.edu 735083Sgblack@eecs.umich.edudouble 745083Sgblack@eecs.umich.edustatElapsedTime() 755083Sgblack@eecs.umich.edu{ 765083Sgblack@eecs.umich.edu Time now(true); 775083Sgblack@eecs.umich.edu Time elapsed = now - statTime; 785083Sgblack@eecs.umich.edu return elapsed(); 795083Sgblack@eecs.umich.edu} 805083Sgblack@eecs.umich.edu 815083Sgblack@eecs.umich.eduSimTicksReset simTicksReset; 825083Sgblack@eecs.umich.edu 835083Sgblack@eecs.umich.eduvoid 845083Sgblack@eecs.umich.eduInitSimStats() 855083Sgblack@eecs.umich.edu{ 865083Sgblack@eecs.umich.edu simInsts 875083Sgblack@eecs.umich.edu .name("sim_insts") 885083Sgblack@eecs.umich.edu .desc("Number of instructions simulated") 895083Sgblack@eecs.umich.edu .precision(0) 905083Sgblack@eecs.umich.edu .prereq(simInsts) 915083Sgblack@eecs.umich.edu ; 925083Sgblack@eecs.umich.edu 935083Sgblack@eecs.umich.edu simSeconds 945083Sgblack@eecs.umich.edu .name("sim_seconds") 955083Sgblack@eecs.umich.edu .desc("Number of seconds simulated") 965083Sgblack@eecs.umich.edu ; 975083Sgblack@eecs.umich.edu 985083Sgblack@eecs.umich.edu simTicks 995083Sgblack@eecs.umich.edu .name("sim_ticks") 1005083Sgblack@eecs.umich.edu .desc("Number of ticks simulated") 1015083Sgblack@eecs.umich.edu ; 1026345Sgblack@eecs.umich.edu 1035083Sgblack@eecs.umich.edu hostInstRate 1045083Sgblack@eecs.umich.edu .name("host_inst_rate") 1055083Sgblack@eecs.umich.edu .desc("Simulator instruction rate (inst/s)") 1065083Sgblack@eecs.umich.edu .precision(0) 1076345Sgblack@eecs.umich.edu .prereq(simInsts) 1085083Sgblack@eecs.umich.edu ; 1095083Sgblack@eecs.umich.edu 1105083Sgblack@eecs.umich.edu hostMemory 1115083Sgblack@eecs.umich.edu .name("host_mem_usage") 1125083Sgblack@eecs.umich.edu .desc("Number of bytes of host memory used") 1135083Sgblack@eecs.umich.edu .prereq(hostMemory) 1145083Sgblack@eecs.umich.edu ; 1155083Sgblack@eecs.umich.edu 1165083Sgblack@eecs.umich.edu hostSeconds 1175083Sgblack@eecs.umich.edu .name("host_seconds") 1185083Sgblack@eecs.umich.edu .desc("Real time elapsed on the host") 1195083Sgblack@eecs.umich.edu .precision(2) 1205083Sgblack@eecs.umich.edu ; 1215083Sgblack@eecs.umich.edu 1225083Sgblack@eecs.umich.edu hostTickRate 1236345Sgblack@eecs.umich.edu .name("host_tick_rate") 1245083Sgblack@eecs.umich.edu .desc("Simulator tick rate (ticks/s)") 1255083Sgblack@eecs.umich.edu .precision(0) 1265083Sgblack@eecs.umich.edu ; 1275083Sgblack@eecs.umich.edu 1285083Sgblack@eecs.umich.edu simInsts = constant(0); 1295083Sgblack@eecs.umich.edu simTicks = scalar(curTick) - scalar(startTick); 1305083Sgblack@eecs.umich.edu simSeconds = simTicks / scalar(ticksPerSecond); 1315083Sgblack@eecs.umich.edu hostMemory = functor(memUsage); 1325083Sgblack@eecs.umich.edu hostSeconds = functor(statElapsedTime); 1335083Sgblack@eecs.umich.edu hostInstRate = simInsts / hostSeconds; 1345083Sgblack@eecs.umich.edu hostTickRate = simTicks / hostSeconds; 1355083Sgblack@eecs.umich.edu 1366345Sgblack@eecs.umich.edu registerResetCallback(&simTicksReset); 1375083Sgblack@eecs.umich.edu} 1385083Sgblack@eecs.umich.edu 1395083Sgblack@eecs.umich.educlass StatEvent : public Event 1405083Sgblack@eecs.umich.edu{ 1415083Sgblack@eecs.umich.edu protected: 1425083Sgblack@eecs.umich.edu int flags; 1435083Sgblack@eecs.umich.edu Tick repeat; 1445083Sgblack@eecs.umich.edu 1455083Sgblack@eecs.umich.edu public: 1465083Sgblack@eecs.umich.edu StatEvent(int _flags, Tick _when, Tick _repeat); 1475083Sgblack@eecs.umich.edu virtual void process(); 1485083Sgblack@eecs.umich.edu virtual const char *description(); 1495083Sgblack@eecs.umich.edu}; 1505083Sgblack@eecs.umich.edu 1515083Sgblack@eecs.umich.eduStatEvent::StatEvent(int _flags, Tick _when, Tick _repeat) 1525083Sgblack@eecs.umich.edu : Event(&mainEventQueue, Stat_Event_Pri), 1535083Sgblack@eecs.umich.edu flags(_flags), repeat(_repeat) 1545083Sgblack@eecs.umich.edu{ 1555083Sgblack@eecs.umich.edu setFlags(AutoDelete); 1565083Sgblack@eecs.umich.edu schedule(_when); 1575083Sgblack@eecs.umich.edu} 1585083Sgblack@eecs.umich.edu 1595083Sgblack@eecs.umich.educonst char * 1605083Sgblack@eecs.umich.eduStatEvent::description() 1615083Sgblack@eecs.umich.edu{ 1625083Sgblack@eecs.umich.edu return "Statistics dump and/or reset"; 1635083Sgblack@eecs.umich.edu} 1645083Sgblack@eecs.umich.edu 1655083Sgblack@eecs.umich.eduvoid 1665083Sgblack@eecs.umich.eduStatEvent::process() 1675083Sgblack@eecs.umich.edu{ 1685083Sgblack@eecs.umich.edu if (flags & Statistics::Dump) 1695083Sgblack@eecs.umich.edu DumpNow(); 1705083Sgblack@eecs.umich.edu 1715083Sgblack@eecs.umich.edu if (flags & Statistics::Reset) 1725083Sgblack@eecs.umich.edu reset(); 1735083Sgblack@eecs.umich.edu 1745083Sgblack@eecs.umich.edu if (repeat) 1755083Sgblack@eecs.umich.edu schedule(curTick + repeat); 1765083Sgblack@eecs.umich.edu} 1775083Sgblack@eecs.umich.edu 1785083Sgblack@eecs.umich.edulist<Output *> OutputList; 1795083Sgblack@eecs.umich.edu 1805083Sgblack@eecs.umich.eduvoid 1815083Sgblack@eecs.umich.eduDumpNow() 1825083Sgblack@eecs.umich.edu{ 1835083Sgblack@eecs.umich.edu list<Output *>::iterator i = OutputList.begin(); 1845083Sgblack@eecs.umich.edu list<Output *>::iterator end = OutputList.end(); 1855083Sgblack@eecs.umich.edu for (; i != end; ++i) { 1865083Sgblack@eecs.umich.edu Output *output = *i; 1875083Sgblack@eecs.umich.edu if (!output->valid()) 1885083Sgblack@eecs.umich.edu continue; 1895083Sgblack@eecs.umich.edu 1905083Sgblack@eecs.umich.edu output->output(); 1915083Sgblack@eecs.umich.edu } 1925083Sgblack@eecs.umich.edu} 1935083Sgblack@eecs.umich.edu 1945083Sgblack@eecs.umich.eduvoid 1955083Sgblack@eecs.umich.eduSetupEvent(int flags, Tick when, Tick repeat) 1965083Sgblack@eecs.umich.edu{ 1975083Sgblack@eecs.umich.edu new StatEvent(flags, when, repeat); 1985083Sgblack@eecs.umich.edu} 1995083Sgblack@eecs.umich.edu 2005083Sgblack@eecs.umich.edu/* namespace Statistics */ } 2015083Sgblack@eecs.umich.edu 2025083Sgblack@eecs.umich.eduextern "C" void 2035083Sgblack@eecs.umich.edudebugDumpStats() 2045083Sgblack@eecs.umich.edu{ 2055083Sgblack@eecs.umich.edu Statistics::DumpNow(); 2065083Sgblack@eecs.umich.edu} 2075083Sgblack@eecs.umich.edu 2085083Sgblack@eecs.umich.edu