stat_control.cc revision 9262
15361Srstrong@cs.ucsd.edu/*
23671Sbinkertn@umich.edu * Copyright (c) 2012 ARM Limited
33671Sbinkertn@umich.edu * All rights reserved
43671Sbinkertn@umich.edu *
53671Sbinkertn@umich.edu * The license below extends only to copyright in the software and shall
63671Sbinkertn@umich.edu * not be construed as granting a license to any other intellectual
73671Sbinkertn@umich.edu * property including but not limited to intellectual property relating
83671Sbinkertn@umich.edu * to a hardware implementation of the functionality of the software
93671Sbinkertn@umich.edu * licensed hereunder.  You may use the software subject to the license
103671Sbinkertn@umich.edu * terms below provided that you ensure that this notice is replicated
113671Sbinkertn@umich.edu * unmodified and in its entirety in all distributions of the software,
123671Sbinkertn@umich.edu * modified or unmodified, in source code or in binary form.
133671Sbinkertn@umich.edu *
143671Sbinkertn@umich.edu * Copyright (c) 2004-2005 The Regents of The University of Michigan
153671Sbinkertn@umich.edu * All rights reserved.
163671Sbinkertn@umich.edu *
173671Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without
183671Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are
193671Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright
203671Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer;
213671Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright
223671Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the
233671Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution;
243671Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its
253671Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from
263671Sbinkertn@umich.edu * this software without specific prior written permission.
273671Sbinkertn@umich.edu *
283671Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
293671Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
303671Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
313671Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
323671Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
333671Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
343671Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
353671Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
363671Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
373671Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
383671Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
393671Sbinkertn@umich.edu *
403671Sbinkertn@umich.edu * Authors: Nathan Binkert
413671Sbinkertn@umich.edu *          Sascha Bischoff
423671Sbinkertn@umich.edu */
433671Sbinkertn@umich.edu
443671Sbinkertn@umich.edu// This file will contain default statistics for the simulator that
453671Sbinkertn@umich.edu// don't really belong to a specific simulator object
463671Sbinkertn@umich.edu
473671Sbinkertn@umich.edu#include <fstream>
483671Sbinkertn@umich.edu#include <iostream>
493671Sbinkertn@umich.edu#include <list>
503671Sbinkertn@umich.edu
513671Sbinkertn@umich.edu#include "base/callback.hh"
523671Sbinkertn@umich.edu#include "base/hostinfo.hh"
533671Sbinkertn@umich.edu#include "base/statistics.hh"
543671Sbinkertn@umich.edu#include "base/time.hh"
553671Sbinkertn@umich.edu#include "config/the_isa.hh"
563671Sbinkertn@umich.edu#if THE_ISA == NO_ISA
573671Sbinkertn@umich.edu#include "arch/noisa/cpu_dummy.hh"
583671Sbinkertn@umich.edu#else
593671Sbinkertn@umich.edu#include "cpu/base.hh"
603671Sbinkertn@umich.edu#endif
613671Sbinkertn@umich.edu
623671Sbinkertn@umich.edu#include "sim/eventq.hh"
633671Sbinkertn@umich.edu#include "sim/stat_control.hh"
643671Sbinkertn@umich.edu
653671Sbinkertn@umich.eduusing namespace std;
663671Sbinkertn@umich.edu
673671Sbinkertn@umich.eduStats::Formula simSeconds;
683671Sbinkertn@umich.eduStats::Value simTicks;
693671Sbinkertn@umich.eduStats::Value finalTick;
703671Sbinkertn@umich.eduStats::Value simFreq;
713671Sbinkertn@umich.edu
723671Sbinkertn@umich.edunamespace Stats {
733671Sbinkertn@umich.edu
743671Sbinkertn@umich.eduTime statTime(true);
753671Sbinkertn@umich.eduTick startTick;
763671Sbinkertn@umich.edu
773671Sbinkertn@umich.eduEvent *dumpEvent;
783671Sbinkertn@umich.edu
793671Sbinkertn@umich.edustruct SimTicksReset : public Callback
803671Sbinkertn@umich.edu{
813671Sbinkertn@umich.edu    void process()
823671Sbinkertn@umich.edu    {
833671Sbinkertn@umich.edu        statTime.setTimer();
843671Sbinkertn@umich.edu        startTick = curTick();
853671Sbinkertn@umich.edu    }
863671Sbinkertn@umich.edu};
873671Sbinkertn@umich.edu
885361Srstrong@cs.ucsd.edudouble
895361Srstrong@cs.ucsd.edustatElapsedTime()
905361Srstrong@cs.ucsd.edu{
913671Sbinkertn@umich.edu    Time now;
923671Sbinkertn@umich.edu    now.setTimer();
933671Sbinkertn@umich.edu
943671Sbinkertn@umich.edu    Time elapsed = now - statTime;
953671Sbinkertn@umich.edu    return elapsed;
963671Sbinkertn@umich.edu}
973671Sbinkertn@umich.edu
983671Sbinkertn@umich.eduTick
993671Sbinkertn@umich.edustatElapsedTicks()
1003671Sbinkertn@umich.edu{
1013671Sbinkertn@umich.edu    return curTick() - startTick;
1023671Sbinkertn@umich.edu}
1033671Sbinkertn@umich.edu
1043671Sbinkertn@umich.eduTick
1053671Sbinkertn@umich.edustatFinalTick()
1063671Sbinkertn@umich.edu{
1073671Sbinkertn@umich.edu    return curTick();
1083671Sbinkertn@umich.edu}
1093671Sbinkertn@umich.edu
1104116Sgblack@eecs.umich.eduSimTicksReset simTicksReset;
1114116Sgblack@eecs.umich.edu
1123671Sbinkertn@umich.edustruct Global
1133671Sbinkertn@umich.edu{
1143671Sbinkertn@umich.edu    Stats::Formula hostInstRate;
1153671Sbinkertn@umich.edu    Stats::Formula hostOpRate;
1163671Sbinkertn@umich.edu    Stats::Formula hostTickRate;
1173671Sbinkertn@umich.edu    Stats::Value hostMemory;
1183671Sbinkertn@umich.edu    Stats::Value hostSeconds;
1193671Sbinkertn@umich.edu
1203671Sbinkertn@umich.edu    Stats::Value simInsts;
1213671Sbinkertn@umich.edu    Stats::Value simOps;
1223671Sbinkertn@umich.edu
1233671Sbinkertn@umich.edu    Global();
1243671Sbinkertn@umich.edu};
1253671Sbinkertn@umich.edu
1263671Sbinkertn@umich.eduGlobal::Global()
1273671Sbinkertn@umich.edu{
1283671Sbinkertn@umich.edu    simInsts
1293671Sbinkertn@umich.edu        .functor(BaseCPU::numSimulatedInsts)
1303671Sbinkertn@umich.edu        .name("sim_insts")
1313671Sbinkertn@umich.edu        .desc("Number of instructions simulated")
1323671Sbinkertn@umich.edu        .precision(0)
1333671Sbinkertn@umich.edu        .prereq(simInsts)
1343671Sbinkertn@umich.edu        ;
1353671Sbinkertn@umich.edu
1363671Sbinkertn@umich.edu    simOps
1374555Sbinkertn@umich.edu        .functor(BaseCPU::numSimulatedOps)
1383671Sbinkertn@umich.edu        .name("sim_ops")
1393671Sbinkertn@umich.edu        .desc("Number of ops (including micro ops) simulated")
1403671Sbinkertn@umich.edu        .precision(0)
1413671Sbinkertn@umich.edu        .prereq(simOps)
1423671Sbinkertn@umich.edu        ;
1435361Srstrong@cs.ucsd.edu
1443671Sbinkertn@umich.edu    simSeconds
1453671Sbinkertn@umich.edu        .name("sim_seconds")
1463671Sbinkertn@umich.edu        .desc("Number of seconds simulated")
1473671Sbinkertn@umich.edu        ;
1483671Sbinkertn@umich.edu
1493671Sbinkertn@umich.edu    simFreq
1503671Sbinkertn@umich.edu        .scalar(SimClock::Frequency)
1513671Sbinkertn@umich.edu        .name("sim_freq")
1523671Sbinkertn@umich.edu        .desc("Frequency of simulated ticks")
1533671Sbinkertn@umich.edu        ;
1543671Sbinkertn@umich.edu
1555361Srstrong@cs.ucsd.edu    simTicks
1563671Sbinkertn@umich.edu        .functor(statElapsedTicks)
1573671Sbinkertn@umich.edu        .name("sim_ticks")
1583671Sbinkertn@umich.edu        .desc("Number of ticks simulated")
1593671Sbinkertn@umich.edu        ;
1603671Sbinkertn@umich.edu
1613671Sbinkertn@umich.edu    finalTick
1623671Sbinkertn@umich.edu        .functor(statFinalTick)
1633671Sbinkertn@umich.edu        .name("final_tick")
1643671Sbinkertn@umich.edu        .desc("Number of ticks from beginning of simulation \
1653671Sbinkertn@umich.edu(restored from checkpoints and never reset)")
1663671Sbinkertn@umich.edu        ;
1673671Sbinkertn@umich.edu
1683671Sbinkertn@umich.edu    hostInstRate
1693671Sbinkertn@umich.edu        .name("host_inst_rate")
1703671Sbinkertn@umich.edu        .desc("Simulator instruction rate (inst/s)")
1713671Sbinkertn@umich.edu        .precision(0)
1723671Sbinkertn@umich.edu        .prereq(simInsts)
1733671Sbinkertn@umich.edu        ;
1743671Sbinkertn@umich.edu
1753671Sbinkertn@umich.edu    hostOpRate
1763671Sbinkertn@umich.edu        .name("host_op_rate")
1773671Sbinkertn@umich.edu        .desc("Simulator op (including micro ops) rate (op/s)")
1783671Sbinkertn@umich.edu        .precision(0)
1793671Sbinkertn@umich.edu        .prereq(simOps)
1803671Sbinkertn@umich.edu        ;
1813671Sbinkertn@umich.edu
1823671Sbinkertn@umich.edu    hostMemory
1833671Sbinkertn@umich.edu        .functor(memUsage)
1843671Sbinkertn@umich.edu        .name("host_mem_usage")
1853671Sbinkertn@umich.edu        .desc("Number of bytes of host memory used")
1865361Srstrong@cs.ucsd.edu        .prereq(hostMemory)
1873671Sbinkertn@umich.edu        ;
1883671Sbinkertn@umich.edu
1893671Sbinkertn@umich.edu    hostSeconds
1903671Sbinkertn@umich.edu        .functor(statElapsedTime)
1913671Sbinkertn@umich.edu        .name("host_seconds")
1925361Srstrong@cs.ucsd.edu        .desc("Real time elapsed on the host")
1933671Sbinkertn@umich.edu        .precision(2)
1943671Sbinkertn@umich.edu        ;
1953671Sbinkertn@umich.edu
1963671Sbinkertn@umich.edu    hostTickRate
1973671Sbinkertn@umich.edu        .name("host_tick_rate")
1985361Srstrong@cs.ucsd.edu        .desc("Simulator tick rate (ticks/s)")
1993671Sbinkertn@umich.edu        .precision(0)
2003671Sbinkertn@umich.edu        ;
2013671Sbinkertn@umich.edu
2023671Sbinkertn@umich.edu    simSeconds = simTicks / simFreq;
2033671Sbinkertn@umich.edu    hostInstRate = simInsts / hostSeconds;
2043671Sbinkertn@umich.edu    hostOpRate = simOps / hostSeconds;
2053671Sbinkertn@umich.edu    hostTickRate = simTicks / hostSeconds;
2063671Sbinkertn@umich.edu
2073671Sbinkertn@umich.edu    registerResetCallback(&simTicksReset);
2083671Sbinkertn@umich.edu}
2093671Sbinkertn@umich.edu
2103671Sbinkertn@umich.eduvoid
2113671Sbinkertn@umich.eduinitSimStats()
2123671Sbinkertn@umich.edu{
2133671Sbinkertn@umich.edu    static Global global;
2143671Sbinkertn@umich.edu}
2153671Sbinkertn@umich.edu
2163671Sbinkertn@umich.edu/**
2173671Sbinkertn@umich.edu * Event to dump and/or reset the statistics.
2183671Sbinkertn@umich.edu */
2193671Sbinkertn@umich.educlass StatEvent : public Event
2203671Sbinkertn@umich.edu{
2213671Sbinkertn@umich.edu  private:
2223671Sbinkertn@umich.edu    bool dump;
2233671Sbinkertn@umich.edu    bool reset;
2243671Sbinkertn@umich.edu    Tick repeat;
2253671Sbinkertn@umich.edu
2263671Sbinkertn@umich.edu  public:
2273671Sbinkertn@umich.edu    StatEvent(bool _dump, bool _reset, Tick _repeat)
2283671Sbinkertn@umich.edu        : Event(Stat_Event_Pri, AutoDelete),
2293671Sbinkertn@umich.edu          dump(_dump), reset(_reset), repeat(_repeat)
2303671Sbinkertn@umich.edu    {
2313671Sbinkertn@umich.edu    }
2323671Sbinkertn@umich.edu
2333671Sbinkertn@umich.edu    virtual void
2343671Sbinkertn@umich.edu    process()
2353671Sbinkertn@umich.edu    {
2363671Sbinkertn@umich.edu        if (dump)
2373671Sbinkertn@umich.edu            Stats::dump();
2383671Sbinkertn@umich.edu
2393671Sbinkertn@umich.edu        if (reset)
2403671Sbinkertn@umich.edu            Stats::reset();
2413671Sbinkertn@umich.edu
2423671Sbinkertn@umich.edu        if (repeat) {
2433671Sbinkertn@umich.edu            Stats::schedStatEvent(dump, reset, curTick() + repeat, repeat);
2443671Sbinkertn@umich.edu        }
2453671Sbinkertn@umich.edu    }
2463671Sbinkertn@umich.edu};
2473671Sbinkertn@umich.edu
2483671Sbinkertn@umich.eduvoid
2493671Sbinkertn@umich.eduschedStatEvent(bool dump, bool reset, Tick when, Tick repeat)
2503671Sbinkertn@umich.edu{
2515361Srstrong@cs.ucsd.edu    dumpEvent = new StatEvent(dump, reset, repeat);
2523671Sbinkertn@umich.edu    mainEventQueue.schedule(dumpEvent, when);
2533671Sbinkertn@umich.edu}
2543671Sbinkertn@umich.edu
2553671Sbinkertn@umich.eduvoid
2563671Sbinkertn@umich.eduperiodicStatDump(uint64_t period)
2573671Sbinkertn@umich.edu{
2583671Sbinkertn@umich.edu    /*
2593671Sbinkertn@umich.edu     * If the period is set to 0, then we do not want to dump periodically,
2603671Sbinkertn@umich.edu     * thus we deschedule the event. Else, if the period is not 0, but the event
2613671Sbinkertn@umich.edu     * has already been scheduled, we need to get rid of the old event before we
2623671Sbinkertn@umich.edu     * create a new one, as the old event will no longer be moved forward in the
2633671Sbinkertn@umich.edu     * event that we resume from a checkpoint.
2643671Sbinkertn@umich.edu     */
2655361Srstrong@cs.ucsd.edu    if (dumpEvent != NULL && (period == 0 || dumpEvent->scheduled())) {
2663671Sbinkertn@umich.edu        // Event should AutoDelete, so we do not need to free it.
2673671Sbinkertn@umich.edu        mainEventQueue.deschedule(dumpEvent);
2683671Sbinkertn@umich.edu    }
2693671Sbinkertn@umich.edu
2703671Sbinkertn@umich.edu    /*
2715361Srstrong@cs.ucsd.edu     * If the period is not 0, we schedule the event. If this is called with a
2723671Sbinkertn@umich.edu     * period that is less than the current tick, then we shift the first dump
2733671Sbinkertn@umich.edu     * by curTick. This ensures that we do not schedule the event is the past.
2743671Sbinkertn@umich.edu     */
2753671Sbinkertn@umich.edu    if (period != 0) {
2763671Sbinkertn@umich.edu        // Schedule the event
2773671Sbinkertn@umich.edu        if (period >= curTick()) {
2783671Sbinkertn@umich.edu            schedStatEvent(true, true, (Tick)period, (Tick)period);
2795361Srstrong@cs.ucsd.edu        } else {
2803671Sbinkertn@umich.edu            schedStatEvent(true, true, (Tick)period + curTick(), (Tick)period);
2813671Sbinkertn@umich.edu        }
2823671Sbinkertn@umich.edu    }
2833671Sbinkertn@umich.edu}
2843671Sbinkertn@umich.edu
2855361Srstrong@cs.ucsd.eduvoid
2863671Sbinkertn@umich.eduupdateEvents()
2873671Sbinkertn@umich.edu{
2883671Sbinkertn@umich.edu    /*
2893671Sbinkertn@umich.edu     * If the dumpEvent has been scheduled, but is scheduled in the past, then
2903671Sbinkertn@umich.edu     * we need to shift the event to be at a valid point in time. Therefore, we
2915361Srstrong@cs.ucsd.edu     * shift the event by curTick.
2923671Sbinkertn@umich.edu     */
2933671Sbinkertn@umich.edu    if (dumpEvent != NULL &&
2943671Sbinkertn@umich.edu        (dumpEvent->scheduled() && dumpEvent->when() < curTick())) {
2953671Sbinkertn@umich.edu        // shift by curTick() and reschedule
2963671Sbinkertn@umich.edu        Tick _when = dumpEvent->when();
2975361Srstrong@cs.ucsd.edu        mainEventQueue.reschedule(dumpEvent, _when + curTick());
2983671Sbinkertn@umich.edu    }
2993671Sbinkertn@umich.edu}
3003671Sbinkertn@umich.edu
3013671Sbinkertn@umich.edu} // namespace Stats
3023671Sbinkertn@umich.edu