stat_control.cc revision 1953
1/* 2 * Copyright (c) 2004-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29// This file will contain default statistics for the simulator that 30// don't really belong to a specific simulator object 31 32#include <fstream> 33#include <iostream> 34#include <list> 35 36#include "base/callback.hh" 37#include "base/hostinfo.hh" 38#include "base/statistics.hh" 39#include "base/str.hh" 40#include "base/time.hh" 41#include "base/stats/output.hh" 42#include "cpu/base.hh" 43#include "sim/eventq.hh" 44#include "sim/sim_object.hh" 45#include "sim/stat_control.hh" 46#include "sim/root.hh" 47 48using namespace std; 49 50Stats::Formula hostInstRate; 51Stats::Formula hostTickRate; 52Stats::Value hostMemory; 53Stats::Value hostSeconds; 54 55Stats::Value simTicks; 56Stats::Value simInsts; 57Stats::Value simFreq; 58Stats::Formula simSeconds; 59 60namespace Stats { 61 62Time statTime(true); 63Tick startTick; 64Tick lastDump(0); 65 66class SimTicksReset : public Callback 67{ 68 public: 69 void process() 70 { 71 statTime.set(); 72 startTick = curTick; 73 } 74}; 75 76double 77statElapsedTime() 78{ 79 Time now(true); 80 Time elapsed = now - statTime; 81 return elapsed(); 82} 83 84Tick 85statElapsedTicks() 86{ 87 return curTick - startTick; 88} 89 90SimTicksReset simTicksReset; 91 92void 93InitSimStats() 94{ 95 simInsts 96 .functor(BaseCPU::numSimulatedInstructions) 97 .name("sim_insts") 98 .desc("Number of instructions simulated") 99 .precision(0) 100 .prereq(simInsts) 101 ; 102 103 simSeconds 104 .name("sim_seconds") 105 .desc("Number of seconds simulated") 106 ; 107 108 simFreq 109 .scalar(Clock::Frequency) 110 .name("sim_freq") 111 .desc("Frequency of simulated ticks") 112 ; 113 114 simTicks 115 .functor(statElapsedTicks) 116 .name("sim_ticks") 117 .desc("Number of ticks simulated") 118 ; 119 120 hostInstRate 121 .name("host_inst_rate") 122 .desc("Simulator instruction rate (inst/s)") 123 .precision(0) 124 .prereq(simInsts) 125 ; 126 127 hostMemory 128 .functor(memUsage) 129 .name("host_mem_usage") 130 .desc("Number of bytes of host memory used") 131 .prereq(hostMemory) 132 ; 133 134 hostSeconds 135 .functor(statElapsedTime) 136 .name("host_seconds") 137 .desc("Real time elapsed on the host") 138 .precision(2) 139 ; 140 141 hostTickRate 142 .name("host_tick_rate") 143 .desc("Simulator tick rate (ticks/s)") 144 .precision(0) 145 ; 146 147 simSeconds = simTicks / simFreq; 148 hostInstRate = simInsts / hostSeconds; 149 hostTickRate = simTicks / hostSeconds; 150 151 registerResetCallback(&simTicksReset); 152} 153 154class StatEvent : public Event 155{ 156 protected: 157 int flags; 158 Tick repeat; 159 160 public: 161 StatEvent(int _flags, Tick _when, Tick _repeat); 162 virtual void process(); 163 virtual const char *description(); 164}; 165 166StatEvent::StatEvent(int _flags, Tick _when, Tick _repeat) 167 : Event(&mainEventQueue, Stat_Event_Pri), 168 flags(_flags), repeat(_repeat) 169{ 170 setFlags(AutoDelete); 171 schedule(_when); 172} 173 174const char * 175StatEvent::description() 176{ 177 return "Statistics dump and/or reset"; 178} 179 180void 181StatEvent::process() 182{ 183 if (flags & Stats::Dump) 184 DumpNow(); 185 186 if (flags & Stats::Reset) 187 reset(); 188 189 if (repeat) 190 schedule(curTick + repeat); 191} 192 193list<Output *> OutputList; 194 195void 196DumpNow() 197{ 198 assert(lastDump <= curTick); 199 if (lastDump == curTick) 200 return; 201 lastDump = curTick; 202 203 list<Output *>::iterator i = OutputList.begin(); 204 list<Output *>::iterator end = OutputList.end(); 205 for (; i != end; ++i) { 206 Output *output = *i; 207 if (!output->valid()) 208 continue; 209 210 output->output(); 211 } 212} 213 214void 215SetupEvent(int flags, Tick when, Tick repeat) 216{ 217 new StatEvent(flags, when, repeat); 218} 219 220/* namespace Stats */ } 221 222extern "C" void 223debugDumpStats() 224{ 225 Stats::DumpNow(); 226} 227 228