power_model.hh revision 11527:9007a9729815
110448Snilay@cs.wisc.edu/* 210448Snilay@cs.wisc.edu * Copyright (c) 2016 ARM Limited 310448Snilay@cs.wisc.edu * All rights reserved 410448Snilay@cs.wisc.edu * 510448Snilay@cs.wisc.edu * The license below extends only to copyright in the software and shall 610448Snilay@cs.wisc.edu * not be construed as granting a license to any other intellectual 710448Snilay@cs.wisc.edu * property including but not limited to intellectual property relating 810448Snilay@cs.wisc.edu * to a hardware implementation of the functionality of the software 910448Snilay@cs.wisc.edu * licensed hereunder. You may use the software subject to the license 1010448Snilay@cs.wisc.edu * terms below provided that you ensure that this notice is replicated 1110448Snilay@cs.wisc.edu * unmodified and in its entirety in all distributions of the software, 1210448Snilay@cs.wisc.edu * modified or unmodified, in source code or in binary form. 1310448Snilay@cs.wisc.edu * 1410448Snilay@cs.wisc.edu * Redistribution and use in source and binary forms, with or without 1510448Snilay@cs.wisc.edu * modification, are permitted provided that the following conditions are 1610448Snilay@cs.wisc.edu * met: redistributions of source code must retain the above copyright 1710448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer; 1810448Snilay@cs.wisc.edu * redistributions in binary form must reproduce the above copyright 1910448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer in the 2010448Snilay@cs.wisc.edu * documentation and/or other materials provided with the distribution; 2110448Snilay@cs.wisc.edu * neither the name of the copyright holders nor the names of its 2210447Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from 2310447Snilay@cs.wisc.edu * this software without specific prior written permission. 2410447Snilay@cs.wisc.edu * 2510447Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2610447Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2710447Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2810447Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2910447Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3010447Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3110447Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3210447Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3310447Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3410447Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3510447Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3610447Snilay@cs.wisc.edu * 3710447Snilay@cs.wisc.edu * Authors: David Guillen Fandos 3810447Snilay@cs.wisc.edu */ 3910447Snilay@cs.wisc.edu 4010447Snilay@cs.wisc.edu#ifndef __SIM_POWER_POWER_MODEL_HH__ 4110447Snilay@cs.wisc.edu#define __SIM_POWER_POWER_MODEL_HH__ 4210447Snilay@cs.wisc.edu 4310447Snilay@cs.wisc.edu#include "base/statistics.hh" 4410447Snilay@cs.wisc.edu#include "params/PowerModel.hh" 4510447Snilay@cs.wisc.edu#include "params/PowerModelState.hh" 4610447Snilay@cs.wisc.edu#include "sim/power/thermal_model.hh" 4710447Snilay@cs.wisc.edu#include "sim/probe/probe.hh" 4810447Snilay@cs.wisc.edu#include "sim/sim_object.hh" 4910447Snilay@cs.wisc.edu 5010447Snilay@cs.wisc.edu/** 5110447Snilay@cs.wisc.edu * A PowerModelState is an abstract class used as interface to get power 5210447Snilay@cs.wisc.edu * figures out of SimObjects 5310447Snilay@cs.wisc.edu */ 5410447Snilay@cs.wisc.educlass PowerModelState : public SimObject 5510447Snilay@cs.wisc.edu{ 5610447Snilay@cs.wisc.edu public: 5710447Snilay@cs.wisc.edu 5810447Snilay@cs.wisc.edu typedef PowerModelStateParams Params; 5910447Snilay@cs.wisc.edu PowerModelState(const Params *p); 6010447Snilay@cs.wisc.edu 6110447Snilay@cs.wisc.edu /** 6210447Snilay@cs.wisc.edu * Get the dynamic power consumption. 6310447Snilay@cs.wisc.edu * 6410447Snilay@cs.wisc.edu * @return Power (Watts) consumed by this object (dynamic component) 6510447Snilay@cs.wisc.edu */ 6610447Snilay@cs.wisc.edu virtual double getDynamicPower() const = 0; 6710447Snilay@cs.wisc.edu 6810447Snilay@cs.wisc.edu /** 6910447Snilay@cs.wisc.edu * Get the static power consumption. 7010447Snilay@cs.wisc.edu * 7110447Snilay@cs.wisc.edu * @return Power (Watts) consumed by this object (static component) 7210447Snilay@cs.wisc.edu */ 7310447Snilay@cs.wisc.edu virtual double getStaticPower() const = 0; 7410447Snilay@cs.wisc.edu 7510447Snilay@cs.wisc.edu /** 7610447Snilay@cs.wisc.edu * Temperature update. 7710447Snilay@cs.wisc.edu * 7810447Snilay@cs.wisc.edu * @param temp Current temperature of the HW part (Celsius) 7910447Snilay@cs.wisc.edu */ 8010447Snilay@cs.wisc.edu virtual void setTemperature(double temp) { _temp = temp; } 8110447Snilay@cs.wisc.edu 8210447Snilay@cs.wisc.edu void setClockedObject(ClockedObject * clkobj) { 8310447Snilay@cs.wisc.edu clocked_object = clkobj; 8410447Snilay@cs.wisc.edu } 8510447Snilay@cs.wisc.edu 8610447Snilay@cs.wisc.edu void regStats() { 8710447Snilay@cs.wisc.edu dynamicPower 8810447Snilay@cs.wisc.edu .method(this, &PowerModelState::getDynamicPower) 8910447Snilay@cs.wisc.edu .name(params()->name + ".dynamic_power") 9010447Snilay@cs.wisc.edu .desc("Dynamic power for this object (Watts)") 9110447Snilay@cs.wisc.edu ; 9210447Snilay@cs.wisc.edu 9310447Snilay@cs.wisc.edu staticPower 9410447Snilay@cs.wisc.edu .method(this, &PowerModelState::getStaticPower) 9510447Snilay@cs.wisc.edu .name(params()->name + ".static_power") 9610447Snilay@cs.wisc.edu .desc("Static power for this object (Watts)") 9710447Snilay@cs.wisc.edu ; 9810447Snilay@cs.wisc.edu } 9910447Snilay@cs.wisc.edu 10010447Snilay@cs.wisc.edu protected: 10110447Snilay@cs.wisc.edu Stats::Value dynamicPower, staticPower; 10210447Snilay@cs.wisc.edu 10310447Snilay@cs.wisc.edu /** Current temperature */ 10410447Snilay@cs.wisc.edu double _temp; 10510447Snilay@cs.wisc.edu 10610447Snilay@cs.wisc.edu /** The clocked object we belong to */ 10710447Snilay@cs.wisc.edu ClockedObject * clocked_object; 10810447Snilay@cs.wisc.edu}; 10910447Snilay@cs.wisc.edu 11010447Snilay@cs.wisc.edu/** 11110447Snilay@cs.wisc.edu * A PowerModel is a class containing a power model for a SimObject. 11210447Snilay@cs.wisc.edu * The PM describes the power consumption for every power state. 11310447Snilay@cs.wisc.edu */ 11410447Snilay@cs.wisc.educlass PowerModel : public SimObject 11510447Snilay@cs.wisc.edu{ 11610447Snilay@cs.wisc.edu public: 11710447Snilay@cs.wisc.edu 11810447Snilay@cs.wisc.edu typedef PowerModelParams Params; 11910447Snilay@cs.wisc.edu PowerModel(const Params *p); 12010447Snilay@cs.wisc.edu 12110447Snilay@cs.wisc.edu /** 12210447Snilay@cs.wisc.edu * Get the dynamic power consumption. 12310447Snilay@cs.wisc.edu * 12410447Snilay@cs.wisc.edu * @return Power (Watts) consumed by this object (dynamic component) 12510447Snilay@cs.wisc.edu */ 12610447Snilay@cs.wisc.edu double getDynamicPower() const; 12710447Snilay@cs.wisc.edu 12810447Snilay@cs.wisc.edu /** 12910447Snilay@cs.wisc.edu * Get the static power consumption. 13010447Snilay@cs.wisc.edu * 13110447Snilay@cs.wisc.edu * @return Power (Watts) consumed by this object (static component) 13210447Snilay@cs.wisc.edu */ 13310447Snilay@cs.wisc.edu double getStaticPower() const; 13410447Snilay@cs.wisc.edu 13510447Snilay@cs.wisc.edu void regStats() { 13610447Snilay@cs.wisc.edu dynamicPower 13710447Snilay@cs.wisc.edu .method(this, &PowerModel::getDynamicPower) 13810447Snilay@cs.wisc.edu .name(params()->name + ".dynamic_power") 13910447Snilay@cs.wisc.edu .desc("Dynamic power for this power state") 14010447Snilay@cs.wisc.edu ; 14110447Snilay@cs.wisc.edu 14210447Snilay@cs.wisc.edu staticPower 14310447Snilay@cs.wisc.edu .method(this, &PowerModel::getStaticPower) 14410447Snilay@cs.wisc.edu .name(params()->name + ".static_power") 14510447Snilay@cs.wisc.edu .desc("Static power for this power state") 14610447Snilay@cs.wisc.edu ; 14710447Snilay@cs.wisc.edu } 14810447Snilay@cs.wisc.edu 14910447Snilay@cs.wisc.edu void setClockedObject(ClockedObject *clkobj); 15010447Snilay@cs.wisc.edu 15110447Snilay@cs.wisc.edu virtual void regProbePoints(); 15210447Snilay@cs.wisc.edu 15310447Snilay@cs.wisc.edu void thermalUpdateCallback(const double & temp); 15410447Snilay@cs.wisc.edu 15510447Snilay@cs.wisc.edu protected: 15610447Snilay@cs.wisc.edu /** Listener class to catch thermal events */ 15710447Snilay@cs.wisc.edu class ThermalProbeListener : public ProbeListenerArgBase<double> 15810447Snilay@cs.wisc.edu { 15910447Snilay@cs.wisc.edu public: 16010447Snilay@cs.wisc.edu ThermalProbeListener(PowerModel &_pm, ProbeManager *pm, 16110447Snilay@cs.wisc.edu const std::string &name) 16210447Snilay@cs.wisc.edu : ProbeListenerArgBase(pm, name), pm(_pm) {} 16310447Snilay@cs.wisc.edu 16410447Snilay@cs.wisc.edu void notify(const double &temp) 165 { 166 pm.thermalUpdateCallback(temp); 167 } 168 169 protected: 170 PowerModel ± 171 }; 172 173 Stats::Value dynamicPower, staticPower; 174 175 /** Actual power models (one per power state) */ 176 std::vector<PowerModelState*> states_pm; 177 178 /** Listener to catch temperature changes in the SubSystem */ 179 std::unique_ptr<ThermalProbeListener> thermalListener; 180 181 /** The subsystem this power model belongs to */ 182 SubSystem * subsystem; 183 184 /** The clocked object we belong to */ 185 ClockedObject * clocked_object; 186}; 187 188#endif 189