MemoryPowerModel.h (11555:2efa95cf8504) | MemoryPowerModel.h (12266:63b8da9eeca4) |
---|---|
1/* 2 * Copyright (c) 2012-2014, TU Delft 3 * Copyright (c) 2012-2014, TU Eindhoven 4 * Copyright (c) 2012-2014, TU Kaiserslautern 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are --- 17 unchanged lines hidden (view full) --- 26 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 28 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 * | 1/* 2 * Copyright (c) 2012-2014, TU Delft 3 * Copyright (c) 2012-2014, TU Eindhoven 4 * Copyright (c) 2012-2014, TU Kaiserslautern 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are --- 17 unchanged lines hidden (view full) --- 26 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 28 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 * |
34 * Authors: Karthik Chandrasekar, Matthias Jung, Omar Naji | 34 * Authors: Karthik Chandrasekar 35 * Matthias Jung 36 * Omar Naji 37 * Subash Kannoth 38 * Éder F. Zulian 39 * Felipe S. Prado |
35 * 36 */ 37 38#ifndef MEMORY_POWER_MODEL_H 39#define MEMORY_POWER_MODEL_H 40 | 40 * 41 */ 42 43#ifndef MEMORY_POWER_MODEL_H 44#define MEMORY_POWER_MODEL_H 45 |
46#include <numeric> |
|
41#include "MemorySpecification.h" | 47#include "MemorySpecification.h" |
48#include "MemBankWiseParams.h" |
|
42#include "CommandAnalysis.h" 43 44namespace Data { 45class MemoryPowerModel { 46 public: | 49#include "CommandAnalysis.h" 50 51namespace Data { 52class MemoryPowerModel { 53 public: |
54 55 MemoryPowerModel(); 56 |
|
47 // Calculate energy and average power consumption for the given memory 48 // command trace 49 void power_calc(const MemorySpecification& memSpec, 50 const CommandAnalysis& c, | 57 // Calculate energy and average power consumption for the given memory 58 // command trace 59 void power_calc(const MemorySpecification& memSpec, 60 const CommandAnalysis& c, |
51 int term); | 61 int term, 62 const MemBankWiseParams& bwPowerParams); |
52 53 // Used to calculate self-refresh active energy 54 static double engy_sref(double idd6, 55 double idd3n, 56 double idd5, 57 double vdd, | 63 64 // Used to calculate self-refresh active energy 65 static double engy_sref(double idd6, 66 double idd3n, 67 double idd5, 68 double vdd, |
58 double sref_cycles, | 69 double sref_cycles_idd6, |
59 double sref_ref_act_cycles, 60 double sref_ref_pre_cycles, 61 double spup_ref_act_cycles, 62 double spup_ref_pre_cycles, 63 double clk); | 70 double sref_ref_act_cycles, 71 double sref_ref_pre_cycles, 72 double spup_ref_act_cycles, 73 double spup_ref_pre_cycles, 74 double clk); |
75 static double engy_sref_banks(double idd6, 76 double idd3n, 77 double idd5, 78 double vdd, 79 double sref_cycles, 80 double sref_ref_act_cycles, 81 double sref_ref_pre_cycles, 82 double spup_ref_act_cycles, 83 double spup_ref_pre_cycles, 84 double clk, 85 double esharedPASR, 86 const MemBankWiseParams& bwPowerParams, 87 unsigned bnkIdx, 88 int64_t nbrofBanks); |
|
64 65 int64_t total_cycles; 66 | 89 90 int64_t total_cycles; 91 |
92 int64_t window_cycles; 93 |
|
67 struct Energy { 68 // Total energy of all activates 69 double act_energy; | 94 struct Energy { 95 // Total energy of all activates 96 double act_energy; |
97 std::vector<double> act_energy_banks; |
|
70 71 // Total energy of all precharges 72 double pre_energy; | 98 99 // Total energy of all precharges 100 double pre_energy; |
101 std::vector<double> pre_energy_banks; |
|
73 74 // Total energy of all reads 75 double read_energy; | 102 103 // Total energy of all reads 104 double read_energy; |
105 std::vector<double> read_energy_banks; |
|
76 77 // Total energy of all writes 78 double write_energy; | 106 107 // Total energy of all writes 108 double write_energy; |
109 std::vector<double> write_energy_banks; |
|
79 80 // Total energy of all refreshes 81 double ref_energy; | 110 111 // Total energy of all refreshes 112 double ref_energy; |
113 std::vector<double> ref_energy_banks; |
|
82 | 114 |
115 // Bankwise refresh energy 116 std::vector<double> refb_energy_banks; 117 |
|
83 // Total background energy of all active standby cycles 84 double act_stdby_energy; | 118 // Total background energy of all active standby cycles 119 double act_stdby_energy; |
120 std::vector<double> act_stdby_energy_banks; |
|
85 86 // Total background energy of all precharge standby cycles 87 double pre_stdby_energy; | 121 122 // Total background energy of all precharge standby cycles 123 double pre_stdby_energy; |
124 std::vector<double> pre_stdby_energy_banks; |
|
88 89 // Total energy of idle cycles in the active mode 90 double idle_energy_act; | 125 126 // Total energy of idle cycles in the active mode 127 double idle_energy_act; |
128 std::vector<double> idle_energy_act_banks; |
|
91 92 // Total energy of idle cycles in the precharge mode 93 double idle_energy_pre; | 129 130 // Total energy of idle cycles in the precharge mode 131 double idle_energy_pre; |
132 std::vector<double> idle_energy_pre_banks; |
|
94 95 // Total trace/pattern energy 96 double total_energy; | 133 134 // Total trace/pattern energy 135 double total_energy; |
136 std::vector<double> total_energy_banks; |
|
97 | 137 |
138 // Window energy 139 double window_energy; 140 |
|
98 // Average Power 99 double average_power; 100 101 // Energy consumed in active/precharged fast/slow-exit modes 102 double f_act_pd_energy; | 141 // Average Power 142 double average_power; 143 144 // Energy consumed in active/precharged fast/slow-exit modes 145 double f_act_pd_energy; |
146 std::vector<double> f_act_pd_energy_banks; 147 |
|
103 double f_pre_pd_energy; | 148 double f_pre_pd_energy; |
149 std::vector<double> f_pre_pd_energy_banks; 150 |
|
104 double s_act_pd_energy; | 151 double s_act_pd_energy; |
152 std::vector<double> s_act_pd_energy_banks; 153 |
|
105 double s_pre_pd_energy; | 154 double s_pre_pd_energy; |
155 std::vector<double> s_pre_pd_energy_banks; |
|
106 107 // Energy consumed in self-refresh mode 108 double sref_energy; | 156 157 // Energy consumed in self-refresh mode 158 double sref_energy; |
159 std::vector<double> sref_energy_banks; |
|
109 110 // Energy consumed in auto-refresh during self-refresh mode 111 double sref_ref_energy; | 160 161 // Energy consumed in auto-refresh during self-refresh mode 162 double sref_ref_energy; |
163 std::vector<double> sref_ref_energy_banks; 164 |
|
112 double sref_ref_act_energy; | 165 double sref_ref_act_energy; |
166 std::vector<double> sref_ref_act_energy_banks; 167 |
|
113 double sref_ref_pre_energy; | 168 double sref_ref_pre_energy; |
169 std::vector<double> sref_ref_pre_energy_banks; |
|
114 115 // Energy consumed in powering-up from self-refresh mode 116 double spup_energy; | 170 171 // Energy consumed in powering-up from self-refresh mode 172 double spup_energy; |
173 std::vector<double> spup_energy_banks; |
|
117 118 // Energy consumed in auto-refresh during self-refresh power-up 119 double spup_ref_energy; | 174 175 // Energy consumed in auto-refresh during self-refresh power-up 176 double spup_ref_energy; |
177 std::vector<double> spup_ref_energy_banks; 178 |
|
120 double spup_ref_act_energy; | 179 double spup_ref_act_energy; |
180 std::vector<double> spup_ref_act_energy_banks; 181 |
|
121 double spup_ref_pre_energy; | 182 double spup_ref_pre_energy; |
183 std::vector<double> spup_ref_pre_energy_banks; |
|
122 123 // Energy consumed in powering-up from active/precharged power-down modes 124 double pup_act_energy; | 184 185 // Energy consumed in powering-up from active/precharged power-down modes 186 double pup_act_energy; |
187 std::vector<double> pup_act_energy_banks; 188 |
|
125 double pup_pre_energy; | 189 double pup_pre_energy; |
190 std::vector<double> pup_pre_energy_banks; |
|
126 127 // Energy consumed by IO and Termination 128 double read_io_energy; // Read IO Energy 129 double write_term_energy; // Write Termination Energy 130 double read_oterm_energy; // Read Termination Energy from idle rank 131 double write_oterm_energy; // Write Termination Energy from idle rank 132 // Total IO and Termination Energy 133 double io_term_energy; 134 }; 135 136 struct Power { 137 // Power measures corresponding to IO and Termination 138 double IO_power; // Read IO Power 139 double WR_ODT_power; // Write ODT Power 140 double TermRD_power; // Read Termination in idle rank (in dual-rank systems) 141 double TermWR_power; // Write Termination in idle rank (in dual-rank systems) 142 143 // Average Power 144 double average_power; | 191 192 // Energy consumed by IO and Termination 193 double read_io_energy; // Read IO Energy 194 double write_term_energy; // Write Termination Energy 195 double read_oterm_energy; // Read Termination Energy from idle rank 196 double write_oterm_energy; // Write Termination Energy from idle rank 197 // Total IO and Termination Energy 198 double io_term_energy; 199 }; 200 201 struct Power { 202 // Power measures corresponding to IO and Termination 203 double IO_power; // Read IO Power 204 double WR_ODT_power; // Write ODT Power 205 double TermRD_power; // Read Termination in idle rank (in dual-rank systems) 206 double TermWR_power; // Write Termination in idle rank (in dual-rank systems) 207 208 // Average Power 209 double average_power; |
210 211 // Window Average Power 212 double window_average_power; |
|
145 }; 146 147 // Print the power and energy 148 void power_print(const MemorySpecification& memSpec, 149 int term, | 213 }; 214 215 // Print the power and energy 216 void power_print(const MemorySpecification& memSpec, 217 int term, |
150 const CommandAnalysis& c) const; | 218 const CommandAnalysis& c, 219 bool bankwiseMode) const; |
151 152 // To derive IO and Termination Power measures using DRAM specification 153 void io_term_power(const MemorySpecification& memSpec); 154 155 Energy energy; 156 Power power; 157 158 private: 159 double calcIoTermEnergy(int64_t cycles, double period, double power, int64_t numBits) const; | 220 221 // To derive IO and Termination Power measures using DRAM specification 222 void io_term_power(const MemorySpecification& memSpec); 223 224 Energy energy; 225 Power power; 226 227 private: 228 double calcIoTermEnergy(int64_t cycles, double period, double power, int64_t numBits) const; |
229 // Sum quantities (e.g., operations, energy, cycles) that are stored in a per bank basis returning the total amount. 230 template <typename T> T sum(const std::vector<T> vec) const { return std::accumulate(vec.begin(), vec.end(), static_cast<T>(0)); } |
|
160}; 161 162class EnergyDomain { 163 public: 164 EnergyDomain(double voltage, double clkPeriod) : 165 voltage(voltage), 166 clkPeriod(clkPeriod) 167 {} 168 169 double calcTivEnergy(int64_t cycles, double current) const; | 231}; 232 233class EnergyDomain { 234 public: 235 EnergyDomain(double voltage, double clkPeriod) : 236 voltage(voltage), 237 clkPeriod(clkPeriod) 238 {} 239 240 double calcTivEnergy(int64_t cycles, double current) const; |
241 double getVoltage() const{ return voltage; }; |
|
170 private: 171 const double voltage; 172 const double clkPeriod; 173}; 174 175} 176#endif // ifndef MEMORY_POWER_MODEL_H | 242 private: 243 const double voltage; 244 const double clkPeriod; 245}; 246 247} 248#endif // ifndef MEMORY_POWER_MODEL_H |