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