power_model.cc revision 12546:8182d78bebcb
111723Sar4jc@virginia.edu/* 211723Sar4jc@virginia.edu * Copyright (c) 2016-2018 ARM Limited 311723Sar4jc@virginia.edu * All rights reserved 411723Sar4jc@virginia.edu * 511723Sar4jc@virginia.edu * The license below extends only to copyright in the software and shall 611723Sar4jc@virginia.edu * not be construed as granting a license to any other intellectual 711723Sar4jc@virginia.edu * property including but not limited to intellectual property relating 811723Sar4jc@virginia.edu * to a hardware implementation of the functionality of the software 911723Sar4jc@virginia.edu * licensed hereunder. You may use the software subject to the license 1011723Sar4jc@virginia.edu * terms below provided that you ensure that this notice is replicated 1111723Sar4jc@virginia.edu * unmodified and in its entirety in all distributions of the software, 1211723Sar4jc@virginia.edu * modified or unmodified, in source code or in binary form. 1311723Sar4jc@virginia.edu * 1411723Sar4jc@virginia.edu * Redistribution and use in source and binary forms, with or without 1511723Sar4jc@virginia.edu * modification, are permitted provided that the following conditions are 1611723Sar4jc@virginia.edu * met: redistributions of source code must retain the above copyright 1711723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer; 1811723Sar4jc@virginia.edu * redistributions in binary form must reproduce the above copyright 1911723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer in the 2011723Sar4jc@virginia.edu * documentation and/or other materials provided with the distribution; 2111723Sar4jc@virginia.edu * neither the name of the copyright holders nor the names of its 2211723Sar4jc@virginia.edu * contributors may be used to endorse or promote products derived from 2311723Sar4jc@virginia.edu * this software without specific prior written permission. 2411723Sar4jc@virginia.edu * 2511723Sar4jc@virginia.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2611723Sar4jc@virginia.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2711723Sar4jc@virginia.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2811723Sar4jc@virginia.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2911723Sar4jc@virginia.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3011723Sar4jc@virginia.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3111723Sar4jc@virginia.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3211723Sar4jc@virginia.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3311723Sar4jc@virginia.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3411723Sar4jc@virginia.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3511963Sar4jc@virginia.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3611723Sar4jc@virginia.edu * 3711723Sar4jc@virginia.edu * Authors: David Guillen Fandos 3811723Sar4jc@virginia.edu */ 3911723Sar4jc@virginia.edu 4011723Sar4jc@virginia.edu#include "sim/power/power_model.hh" 4111723Sar4jc@virginia.edu 4211723Sar4jc@virginia.edu#include "base/statistics.hh" 4311723Sar4jc@virginia.edu#include "params/PowerModel.hh" 4411723Sar4jc@virginia.edu#include "params/PowerModelState.hh" 4511723Sar4jc@virginia.edu#include "sim/clocked_object.hh" 4611723Sar4jc@virginia.edu#include "sim/sub_system.hh" 4711723Sar4jc@virginia.edu 4811723Sar4jc@virginia.eduPowerModelState::PowerModelState(const Params *p) 4911723Sar4jc@virginia.edu : SimObject(p), _temp(0), clocked_object(NULL) 5011723Sar4jc@virginia.edu{ 5111723Sar4jc@virginia.edu} 5211723Sar4jc@virginia.edu 5311723Sar4jc@virginia.eduPowerModel::PowerModel(const Params *p) 5411723Sar4jc@virginia.edu : SimObject(p), states_pm(p->pm), subsystem(p->subsystem), 5511723Sar4jc@virginia.edu clocked_object(NULL), power_model_type(p->pm_type) 5611723Sar4jc@virginia.edu{ 5711723Sar4jc@virginia.edu panic_if(subsystem == NULL, 5811723Sar4jc@virginia.edu "Subsystem is NULL! This is not acceptable for a PowerModel!\n"); 5911723Sar4jc@virginia.edu subsystem->registerPowerProducer(this); 6011723Sar4jc@virginia.edu} 6111723Sar4jc@virginia.edu 6211723Sar4jc@virginia.eduvoid 6311963Sar4jc@virginia.eduPowerModel::setClockedObject(ClockedObject * clkobj) 6412695Sar4jc@virginia.edu{ 6512695Sar4jc@virginia.edu this->clocked_object = clkobj; 6612695Sar4jc@virginia.edu 6712695Sar4jc@virginia.edu for (auto & pms: states_pm) 6812695Sar4jc@virginia.edu pms->setClockedObject(clkobj); 6912695Sar4jc@virginia.edu} 7012695Sar4jc@virginia.edu 7112695Sar4jc@virginia.eduvoid 7212695Sar4jc@virginia.eduPowerModel::thermalUpdateCallback(const double & temp) 7311723Sar4jc@virginia.edu{ 7411723Sar4jc@virginia.edu for (auto & pms: states_pm) 7512695Sar4jc@virginia.edu pms->setTemperature(temp); 7612695Sar4jc@virginia.edu} 7712695Sar4jc@virginia.edu 7812695Sar4jc@virginia.eduvoid 7912695Sar4jc@virginia.eduPowerModel::regProbePoints() 8012695Sar4jc@virginia.edu{ 8112695Sar4jc@virginia.edu thermalListener.reset(new ThermalProbeListener ( 8212695Sar4jc@virginia.edu *this, this->subsystem->getProbeManager(), "thermalUpdate" 8312695Sar4jc@virginia.edu )); 8412695Sar4jc@virginia.edu} 8512695Sar4jc@virginia.edu 8612695Sar4jc@virginia.eduPowerModel* 8712695Sar4jc@virginia.eduPowerModelParams::create() 8812695Sar4jc@virginia.edu{ 8912695Sar4jc@virginia.edu return new PowerModel(this); 9012695Sar4jc@virginia.edu} 9112695Sar4jc@virginia.edu 9212695Sar4jc@virginia.edudouble 9312695Sar4jc@virginia.eduPowerModel::getDynamicPower() const 9412695Sar4jc@virginia.edu{ 9512695Sar4jc@virginia.edu assert(clocked_object); 9612695Sar4jc@virginia.edu 9711723Sar4jc@virginia.edu if (power_model_type == Enums::PMType::Static) { 9813612Sgabeblack@google.com // This power model only collects static data 9911723Sar4jc@virginia.edu return 0; 10011723Sar4jc@virginia.edu } 10112695Sar4jc@virginia.edu std::vector<double> w = clocked_object->pwrStateWeights(); 10212695Sar4jc@virginia.edu 10312695Sar4jc@virginia.edu // Same number of states (excluding UNDEFINED) 10412695Sar4jc@virginia.edu assert(w.size() - 1 == states_pm.size()); 10511723Sar4jc@virginia.edu 10612695Sar4jc@virginia.edu // Make sure we have no UNDEFINED state 10712695Sar4jc@virginia.edu warn_if(w[Enums::PwrState::UNDEFINED] > 0, 10812695Sar4jc@virginia.edu "SimObject in UNDEFINED power state! Power figures might be wrong!\n"); 10911723Sar4jc@virginia.edu 11011723Sar4jc@virginia.edu double power = 0; 11113612Sgabeblack@google.com for (unsigned i = 0; i < states_pm.size(); i++) 11211723Sar4jc@virginia.edu if (w[i + 1] > 0.0f) 11311723Sar4jc@virginia.edu power += states_pm[i]->getDynamicPower() * w[i + 1]; 11411723Sar4jc@virginia.edu 11513935Salec.roelke@gmail.com return power; 11613935Salec.roelke@gmail.com} 11712695Sar4jc@virginia.edu 11812695Sar4jc@virginia.edudouble 11912695Sar4jc@virginia.eduPowerModel::getStaticPower() const 12012695Sar4jc@virginia.edu{ 12112695Sar4jc@virginia.edu assert(clocked_object); 12212695Sar4jc@virginia.edu 12312695Sar4jc@virginia.edu std::vector<double> w = clocked_object->pwrStateWeights(); 12412695Sar4jc@virginia.edu 12512695Sar4jc@virginia.edu if (power_model_type == Enums::PMType::Dynamic) { 12612695Sar4jc@virginia.edu // This power model only collects dynamic data 12712695Sar4jc@virginia.edu return 0; 12812695Sar4jc@virginia.edu } 12912695Sar4jc@virginia.edu 13012695Sar4jc@virginia.edu // Same number of states (excluding UNDEFINED) 13112695Sar4jc@virginia.edu assert(w.size() - 1 == states_pm.size()); 13212695Sar4jc@virginia.edu 13312695Sar4jc@virginia.edu // Make sure we have no UNDEFINED state 13412695Sar4jc@virginia.edu if (w[0] > 0) 13511723Sar4jc@virginia.edu warn("SimObject in UNDEFINED power state! " 13612695Sar4jc@virginia.edu "Power figures might be wrong!\n"); 13712695Sar4jc@virginia.edu 13812695Sar4jc@virginia.edu // We have N+1 states, being state #0 the default 'UNDEFINED' state 13912695Sar4jc@virginia.edu double power = 0; 14012695Sar4jc@virginia.edu for (unsigned i = 0; i < states_pm.size(); i++) 14112695Sar4jc@virginia.edu // Don't evaluate power if the object hasn't been in that state 14212695Sar4jc@virginia.edu // This fixes issues with NaNs and similar. 14312695Sar4jc@virginia.edu if (w[i + 1] > 0.0f) 14413548Salec.roelke@gmail.com power += states_pm[i]->getStaticPower() * w[i + 1]; 14513548Salec.roelke@gmail.com 14613548Salec.roelke@gmail.com return power; 14713548Salec.roelke@gmail.com} 14813548Salec.roelke@gmail.com