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