110428Sandreas.hansson@arm.com/* 210428Sandreas.hansson@arm.com * Copyright (c) 2012-2014, TU Delft 310428Sandreas.hansson@arm.com * Copyright (c) 2012-2014, TU Eindhoven 410428Sandreas.hansson@arm.com * Copyright (c) 2012-2014, TU Kaiserslautern 510428Sandreas.hansson@arm.com * All rights reserved. 610428Sandreas.hansson@arm.com * 710428Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 810428Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 910428Sandreas.hansson@arm.com * met: 1010428Sandreas.hansson@arm.com * 1110428Sandreas.hansson@arm.com * 1. Redistributions of source code must retain the above copyright 1210428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer. 1310428Sandreas.hansson@arm.com * 1410428Sandreas.hansson@arm.com * 2. Redistributions in binary form must reproduce the above copyright 1510428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1610428Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution. 1710428Sandreas.hansson@arm.com * 1810428Sandreas.hansson@arm.com * 3. Neither the name of the copyright holder nor the names of its 1910428Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 2010428Sandreas.hansson@arm.com * this software without specific prior written permission. 2110428Sandreas.hansson@arm.com * 2210428Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 2310428Sandreas.hansson@arm.com * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2410428Sandreas.hansson@arm.com * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 2510428Sandreas.hansson@arm.com * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2610428Sandreas.hansson@arm.com * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2710428Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 2810428Sandreas.hansson@arm.com * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2910428Sandreas.hansson@arm.com * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 3010428Sandreas.hansson@arm.com * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 3110428Sandreas.hansson@arm.com * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3210428Sandreas.hansson@arm.com * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3310428Sandreas.hansson@arm.com * 3412266Sradhika.jagtap@arm.com * Authors: Karthik Chandrasekar 3512266Sradhika.jagtap@arm.com * Matthias Jung 3612266Sradhika.jagtap@arm.com * Omar Naji 3712266Sradhika.jagtap@arm.com * Subash Kannoth 3812266Sradhika.jagtap@arm.com * Éder F. Zulian 3912266Sradhika.jagtap@arm.com * Felipe S. Prado 4010428Sandreas.hansson@arm.com * 4110428Sandreas.hansson@arm.com */ 4210428Sandreas.hansson@arm.com 4310428Sandreas.hansson@arm.com#ifndef MEMORY_POWER_MODEL_H 4410428Sandreas.hansson@arm.com#define MEMORY_POWER_MODEL_H 4510428Sandreas.hansson@arm.com 4612266Sradhika.jagtap@arm.com#include <numeric> 4710428Sandreas.hansson@arm.com#include "MemorySpecification.h" 4812266Sradhika.jagtap@arm.com#include "MemBankWiseParams.h" 4910428Sandreas.hansson@arm.com#include "CommandAnalysis.h" 5010428Sandreas.hansson@arm.com 5110428Sandreas.hansson@arm.comnamespace Data { 5210428Sandreas.hansson@arm.comclass MemoryPowerModel { 5310428Sandreas.hansson@arm.com public: 5412266Sradhika.jagtap@arm.com 5512266Sradhika.jagtap@arm.com MemoryPowerModel(); 5612266Sradhika.jagtap@arm.com 5710428Sandreas.hansson@arm.com // Calculate energy and average power consumption for the given memory 5810428Sandreas.hansson@arm.com // command trace 5911555Sjungma@eit.uni-kl.de void power_calc(const MemorySpecification& memSpec, 6011555Sjungma@eit.uni-kl.de const CommandAnalysis& c, 6112266Sradhika.jagtap@arm.com int term, 6212266Sradhika.jagtap@arm.com const MemBankWiseParams& bwPowerParams); 6310428Sandreas.hansson@arm.com 6410428Sandreas.hansson@arm.com // Used to calculate self-refresh active energy 6510428Sandreas.hansson@arm.com static double engy_sref(double idd6, 6610428Sandreas.hansson@arm.com double idd3n, 6710428Sandreas.hansson@arm.com double idd5, 6810428Sandreas.hansson@arm.com double vdd, 6912266Sradhika.jagtap@arm.com double sref_cycles_idd6, 7010428Sandreas.hansson@arm.com double sref_ref_act_cycles, 7110428Sandreas.hansson@arm.com double sref_ref_pre_cycles, 7210428Sandreas.hansson@arm.com double spup_ref_act_cycles, 7310428Sandreas.hansson@arm.com double spup_ref_pre_cycles, 7410428Sandreas.hansson@arm.com double clk); 7512266Sradhika.jagtap@arm.com static double engy_sref_banks(double idd6, 7612266Sradhika.jagtap@arm.com double idd3n, 7712266Sradhika.jagtap@arm.com double idd5, 7812266Sradhika.jagtap@arm.com double vdd, 7912266Sradhika.jagtap@arm.com double sref_cycles, 8012266Sradhika.jagtap@arm.com double sref_ref_act_cycles, 8112266Sradhika.jagtap@arm.com double sref_ref_pre_cycles, 8212266Sradhika.jagtap@arm.com double spup_ref_act_cycles, 8312266Sradhika.jagtap@arm.com double spup_ref_pre_cycles, 8412266Sradhika.jagtap@arm.com double clk, 8512266Sradhika.jagtap@arm.com double esharedPASR, 8612266Sradhika.jagtap@arm.com const MemBankWiseParams& bwPowerParams, 8712266Sradhika.jagtap@arm.com unsigned bnkIdx, 8812266Sradhika.jagtap@arm.com int64_t nbrofBanks); 8910428Sandreas.hansson@arm.com 9010428Sandreas.hansson@arm.com int64_t total_cycles; 9110428Sandreas.hansson@arm.com 9212266Sradhika.jagtap@arm.com int64_t window_cycles; 9312266Sradhika.jagtap@arm.com 9410428Sandreas.hansson@arm.com struct Energy { 9510428Sandreas.hansson@arm.com // Total energy of all activates 9610428Sandreas.hansson@arm.com double act_energy; 9712266Sradhika.jagtap@arm.com std::vector<double> act_energy_banks; 9810428Sandreas.hansson@arm.com 9910428Sandreas.hansson@arm.com // Total energy of all precharges 10010428Sandreas.hansson@arm.com double pre_energy; 10112266Sradhika.jagtap@arm.com std::vector<double> pre_energy_banks; 10210428Sandreas.hansson@arm.com 10310428Sandreas.hansson@arm.com // Total energy of all reads 10410428Sandreas.hansson@arm.com double read_energy; 10512266Sradhika.jagtap@arm.com std::vector<double> read_energy_banks; 10610428Sandreas.hansson@arm.com 10710428Sandreas.hansson@arm.com // Total energy of all writes 10810428Sandreas.hansson@arm.com double write_energy; 10912266Sradhika.jagtap@arm.com std::vector<double> write_energy_banks; 11010428Sandreas.hansson@arm.com 11110428Sandreas.hansson@arm.com // Total energy of all refreshes 11210428Sandreas.hansson@arm.com double ref_energy; 11312266Sradhika.jagtap@arm.com std::vector<double> ref_energy_banks; 11412266Sradhika.jagtap@arm.com 11512266Sradhika.jagtap@arm.com // Bankwise refresh energy 11612266Sradhika.jagtap@arm.com std::vector<double> refb_energy_banks; 11710428Sandreas.hansson@arm.com 11810428Sandreas.hansson@arm.com // Total background energy of all active standby cycles 11910428Sandreas.hansson@arm.com double act_stdby_energy; 12012266Sradhika.jagtap@arm.com std::vector<double> act_stdby_energy_banks; 12110428Sandreas.hansson@arm.com 12210428Sandreas.hansson@arm.com // Total background energy of all precharge standby cycles 12310428Sandreas.hansson@arm.com double pre_stdby_energy; 12412266Sradhika.jagtap@arm.com std::vector<double> pre_stdby_energy_banks; 12510428Sandreas.hansson@arm.com 12610428Sandreas.hansson@arm.com // Total energy of idle cycles in the active mode 12710428Sandreas.hansson@arm.com double idle_energy_act; 12812266Sradhika.jagtap@arm.com std::vector<double> idle_energy_act_banks; 12910428Sandreas.hansson@arm.com 13010428Sandreas.hansson@arm.com // Total energy of idle cycles in the precharge mode 13110428Sandreas.hansson@arm.com double idle_energy_pre; 13212266Sradhika.jagtap@arm.com std::vector<double> idle_energy_pre_banks; 13310428Sandreas.hansson@arm.com 13410428Sandreas.hansson@arm.com // Total trace/pattern energy 13510428Sandreas.hansson@arm.com double total_energy; 13612266Sradhika.jagtap@arm.com std::vector<double> total_energy_banks; 13712266Sradhika.jagtap@arm.com 13812266Sradhika.jagtap@arm.com // Window energy 13912266Sradhika.jagtap@arm.com double window_energy; 14010428Sandreas.hansson@arm.com 14110428Sandreas.hansson@arm.com // Average Power 14210428Sandreas.hansson@arm.com double average_power; 14310428Sandreas.hansson@arm.com 14410428Sandreas.hansson@arm.com // Energy consumed in active/precharged fast/slow-exit modes 14510428Sandreas.hansson@arm.com double f_act_pd_energy; 14612266Sradhika.jagtap@arm.com std::vector<double> f_act_pd_energy_banks; 14712266Sradhika.jagtap@arm.com 14810428Sandreas.hansson@arm.com double f_pre_pd_energy; 14912266Sradhika.jagtap@arm.com std::vector<double> f_pre_pd_energy_banks; 15012266Sradhika.jagtap@arm.com 15110428Sandreas.hansson@arm.com double s_act_pd_energy; 15212266Sradhika.jagtap@arm.com std::vector<double> s_act_pd_energy_banks; 15312266Sradhika.jagtap@arm.com 15410428Sandreas.hansson@arm.com double s_pre_pd_energy; 15512266Sradhika.jagtap@arm.com std::vector<double> s_pre_pd_energy_banks; 15610428Sandreas.hansson@arm.com 15710428Sandreas.hansson@arm.com // Energy consumed in self-refresh mode 15810428Sandreas.hansson@arm.com double sref_energy; 15912266Sradhika.jagtap@arm.com std::vector<double> sref_energy_banks; 16010428Sandreas.hansson@arm.com 16110428Sandreas.hansson@arm.com // Energy consumed in auto-refresh during self-refresh mode 16210428Sandreas.hansson@arm.com double sref_ref_energy; 16312266Sradhika.jagtap@arm.com std::vector<double> sref_ref_energy_banks; 16412266Sradhika.jagtap@arm.com 16510428Sandreas.hansson@arm.com double sref_ref_act_energy; 16612266Sradhika.jagtap@arm.com std::vector<double> sref_ref_act_energy_banks; 16712266Sradhika.jagtap@arm.com 16810428Sandreas.hansson@arm.com double sref_ref_pre_energy; 16912266Sradhika.jagtap@arm.com std::vector<double> sref_ref_pre_energy_banks; 17010428Sandreas.hansson@arm.com 17110428Sandreas.hansson@arm.com // Energy consumed in powering-up from self-refresh mode 17210428Sandreas.hansson@arm.com double spup_energy; 17312266Sradhika.jagtap@arm.com std::vector<double> spup_energy_banks; 17410428Sandreas.hansson@arm.com 17510428Sandreas.hansson@arm.com // Energy consumed in auto-refresh during self-refresh power-up 17610428Sandreas.hansson@arm.com double spup_ref_energy; 17712266Sradhika.jagtap@arm.com std::vector<double> spup_ref_energy_banks; 17812266Sradhika.jagtap@arm.com 17910428Sandreas.hansson@arm.com double spup_ref_act_energy; 18012266Sradhika.jagtap@arm.com std::vector<double> spup_ref_act_energy_banks; 18112266Sradhika.jagtap@arm.com 18210428Sandreas.hansson@arm.com double spup_ref_pre_energy; 18312266Sradhika.jagtap@arm.com std::vector<double> spup_ref_pre_energy_banks; 18410428Sandreas.hansson@arm.com 18510428Sandreas.hansson@arm.com // Energy consumed in powering-up from active/precharged power-down modes 18610428Sandreas.hansson@arm.com double pup_act_energy; 18712266Sradhika.jagtap@arm.com std::vector<double> pup_act_energy_banks; 18812266Sradhika.jagtap@arm.com 18910428Sandreas.hansson@arm.com double pup_pre_energy; 19012266Sradhika.jagtap@arm.com std::vector<double> pup_pre_energy_banks; 19110428Sandreas.hansson@arm.com 19210428Sandreas.hansson@arm.com // Energy consumed by IO and Termination 19310428Sandreas.hansson@arm.com double read_io_energy; // Read IO Energy 19410428Sandreas.hansson@arm.com double write_term_energy; // Write Termination Energy 19510428Sandreas.hansson@arm.com double read_oterm_energy; // Read Termination Energy from idle rank 19610428Sandreas.hansson@arm.com double write_oterm_energy; // Write Termination Energy from idle rank 19710428Sandreas.hansson@arm.com // Total IO and Termination Energy 19810428Sandreas.hansson@arm.com double io_term_energy; 19910428Sandreas.hansson@arm.com }; 20010428Sandreas.hansson@arm.com 20110428Sandreas.hansson@arm.com struct Power { 20210428Sandreas.hansson@arm.com // Power measures corresponding to IO and Termination 20310428Sandreas.hansson@arm.com double IO_power; // Read IO Power 20410428Sandreas.hansson@arm.com double WR_ODT_power; // Write ODT Power 20510428Sandreas.hansson@arm.com double TermRD_power; // Read Termination in idle rank (in dual-rank systems) 20610428Sandreas.hansson@arm.com double TermWR_power; // Write Termination in idle rank (in dual-rank systems) 20710428Sandreas.hansson@arm.com 20810428Sandreas.hansson@arm.com // Average Power 20910428Sandreas.hansson@arm.com double average_power; 21012266Sradhika.jagtap@arm.com 21112266Sradhika.jagtap@arm.com // Window Average Power 21212266Sradhika.jagtap@arm.com double window_average_power; 21310428Sandreas.hansson@arm.com }; 21410428Sandreas.hansson@arm.com 21510428Sandreas.hansson@arm.com // Print the power and energy 21611555Sjungma@eit.uni-kl.de void power_print(const MemorySpecification& memSpec, 21710428Sandreas.hansson@arm.com int term, 21812266Sradhika.jagtap@arm.com const CommandAnalysis& c, 21912266Sradhika.jagtap@arm.com bool bankwiseMode) const; 22010428Sandreas.hansson@arm.com 22110428Sandreas.hansson@arm.com // To derive IO and Termination Power measures using DRAM specification 22211555Sjungma@eit.uni-kl.de void io_term_power(const MemorySpecification& memSpec); 22310428Sandreas.hansson@arm.com 22410428Sandreas.hansson@arm.com Energy energy; 22510428Sandreas.hansson@arm.com Power power; 22610428Sandreas.hansson@arm.com 22710428Sandreas.hansson@arm.com private: 22810428Sandreas.hansson@arm.com double calcIoTermEnergy(int64_t cycles, double period, double power, int64_t numBits) const; 22912266Sradhika.jagtap@arm.com // Sum quantities (e.g., operations, energy, cycles) that are stored in a per bank basis returning the total amount. 23012266Sradhika.jagtap@arm.com template <typename T> T sum(const std::vector<T> vec) const { return std::accumulate(vec.begin(), vec.end(), static_cast<T>(0)); } 23110428Sandreas.hansson@arm.com}; 23210428Sandreas.hansson@arm.com 23310428Sandreas.hansson@arm.comclass EnergyDomain { 23410428Sandreas.hansson@arm.com public: 23510428Sandreas.hansson@arm.com EnergyDomain(double voltage, double clkPeriod) : 23610428Sandreas.hansson@arm.com voltage(voltage), 23710428Sandreas.hansson@arm.com clkPeriod(clkPeriod) 23810428Sandreas.hansson@arm.com {} 23910428Sandreas.hansson@arm.com 24010428Sandreas.hansson@arm.com double calcTivEnergy(int64_t cycles, double current) const; 24112266Sradhika.jagtap@arm.com double getVoltage() const{ return voltage; }; 24210428Sandreas.hansson@arm.com private: 24310428Sandreas.hansson@arm.com const double voltage; 24410428Sandreas.hansson@arm.com const double clkPeriod; 24510428Sandreas.hansson@arm.com}; 24610428Sandreas.hansson@arm.com 24710428Sandreas.hansson@arm.com} 24810428Sandreas.hansson@arm.com#endif // ifndef MEMORY_POWER_MODEL_H 249