changeset 2efa95cf8504 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=2efa95cf8504
description:
        ext: Update DRAMPower

        Sync DRAMPower to external tool

        This patch syncs the DRAMPower library of gem5 to the external
        one on github (https://github.com/ravenrd/DRAMPower) of which
        I am a maintainer.

        The version used is the commit:
        902a00a1797c48a9df97ec88868f20e847680ae6
        from 07.  May.  2016.

        Committed by Jason Lowe-Power <[email protected]>

diffstat:

 ext/drampower/README.md                         |    4 +-
 ext/drampower/src/CmdScheduler.cc               |  212 +++++++-------
 ext/drampower/src/CmdScheduler.h                |   80 ++--
 ext/drampower/src/CommandAnalysis.cc            |  294 ++++++++------------
 ext/drampower/src/CommandAnalysis.h             |   29 +-
 ext/drampower/src/MemArchitectureSpec.h         |   20 +-
 ext/drampower/src/MemCommand.cc                 |   43 +-
 ext/drampower/src/MemCommand.h                  |   42 ++-
 ext/drampower/src/MemTimingSpec.h               |   62 ++--
 ext/drampower/src/MemoryPowerModel.cc           |  331 ++++++++++-------------
 ext/drampower/src/MemoryPowerModel.h            |   12 +-
 ext/drampower/src/MemorySpecification.h         |   11 +-
 ext/drampower/src/TraceParser.cc                |   21 +-
 ext/drampower/src/TraceParser.h                 |    1 +
 ext/drampower/src/Utils.h                       |    4 +-
 ext/drampower/src/libdrampower/LibDRAMPower.cc  |    9 +-
 ext/drampower/src/libdrampower/LibDRAMPower.h   |    2 +
 ext/drampower/test/libdrampowertest/lib_test.cc |    5 +-
 src/mem/dram_ctrl.hh                            |    3 +-
 19 files changed, 560 insertions(+), 625 deletions(-)

diffs (truncated from 2229 to 300 lines):

diff -r adafd259839e -r 2efa95cf8504 ext/drampower/README.md
--- a/ext/drampower/README.md   Fri Jul 01 10:31:33 2016 -0500
+++ b/ext/drampower/README.md   Fri Jul 01 10:31:36 2016 -0500
@@ -252,8 +252,8 @@
 
 **To cite the DRAMPower Tool:**
 ```
-[1] "DRAMPower: Open-source DRAM power & energy estimation tool"
-Karthik Chandrasekar, Christian Weis, Yonghui Li, Benny Akesson, Norbert Wehn, 
and Kees Goossens
+[1] DRAMPower: Open-source DRAM Power & Energy Estimation Tool
+Karthik Chandrasekar, Christian Weis, Yonghui Li, Sven Goossens, Matthias 
Jung, Omar Naji, Benny Akesson, Norbert Wehn, and Kees Goossens
 URL: http://www.drampower.info
 ```
 
diff -r adafd259839e -r 2efa95cf8504 ext/drampower/src/CmdScheduler.cc
--- a/ext/drampower/src/CmdScheduler.cc Fri Jul 01 10:31:33 2016 -0500
+++ b/ext/drampower/src/CmdScheduler.cc Fri Jul 01 10:31:36 2016 -0500
@@ -31,7 +31,7 @@
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * Authors: Karthik Chandrasekar
+ * Authors: Karthik Chandrasekar, Yonghui Li, Sven Goossens
  *
  */
 #include "CmdScheduler.h"
@@ -42,17 +42,20 @@
 #include <algorithm>  // For max
 
 
+#define MILLION 1000000
+
+
 using namespace std;
 using namespace Data;
 
 // Read the traces and get the transaction. Each transaction is executed by
 // scheduling a number of commands to the memory. Hence, the transactions are
 // translated into a sequence of commands which will be used for power 
analysis.
-void cmdScheduler::transTranslation(MemorySpecification memSpec,
+void cmdScheduler::transTranslation(const MemorySpecification& memSpec,
                                     ifstream& trans_trace, int grouping, int 
interleaving, int burst, int powerdown)
 {
   commands.open("commands.trace", ifstream::out);
-  MemArchitectureSpec& memArchSpec = memSpec.memArchSpec;
+  const MemArchitectureSpec& memArchSpec = memSpec.memArchSpec;
   nBanks          = memArchSpec.nbrOfBanks;
   nColumns        = memArchSpec.nbrOfColumns;
   burstLength     = memArchSpec.burstLength;
@@ -77,13 +80,14 @@
 } // cmdScheduler::transTranslation
 
 // initialize the variables and vectors for starting command scheduling.
-void cmdScheduler::schedulingInitialization(MemorySpecification memSpec)
+void cmdScheduler::schedulingInitialization(const MemorySpecification& memSpec)
 {
-  MemTimingSpec& memTimingSpec = memSpec.memTimingSpec;
+  const MemTimingSpec& memTimingSpec = memSpec.memTimingSpec;
 
-  ACT.resize(2 * memSpec.memArchSpec.nbrOfBanks);
-  RDWR.resize(2 * memSpec.memArchSpec.nbrOfBanks);
-  PRE.resize(memSpec.memArchSpec.nbrOfBanks);
+  const size_t numBanks = static_cast<size_t>(memSpec.memArchSpec.nbrOfBanks);
+  ACT.resize(2 * numBanks);
+  RDWR.resize(2 * numBanks);
+  PRE.resize(numBanks);
   bankaccess = memSpec.memArchSpec.nbrOfBanks;
   if (!ACT.empty()) {
     ACT.erase(ACT.begin(), ACT.end());
@@ -96,14 +100,15 @@
   }
 
   ///////////////initialization//////////////
-  for (unsigned i = 0; i < memSpec.memArchSpec.nbrOfBanks; i++) {
+  for (int64_t i = 0; i < memSpec.memArchSpec.nbrOfBanks; i++) {
     cmd.Type = PRECHARGE;
-    cmd.bank = i;
+    cmd.bank = static_cast<unsigned>(i);
     cmd.name = "PRE";
-    if (memSpec.id == "WIDEIO_SDR")
-      cmd.time = 1 - static_cast<double>(memSpec.memTimingSpec.TAW);
-    else
-      cmd.time = 1 - static_cast<double>(memSpec.memTimingSpec.FAW);
+    if (memSpec.id == "WIDEIO_SDR") {
+      cmd.time = 1 - memSpec.memTimingSpec.TAW;
+    } else {
+      cmd.time = 1 - memSpec.memTimingSpec.FAW;
+    }
 
     PRE.push_back(cmd);
 
@@ -114,7 +119,7 @@
     cmd.Type = WRITE;
     cmd.name = "WRITE";
     cmd.time = -1;
-    RDWR[i].push_back(cmd);
+    RDWR[static_cast<size_t>(i)].push_back(cmd);
   }
   tREF             = memTimingSpec.REFI;
   transFinish.time = 0;
@@ -130,14 +135,14 @@
 // transactions are generated according to the information read from the 
traces.
 // Then the command scheduling function is triggered to generate commands and
 // schedule them to the memory according to the timing constraints.
-void cmdScheduler::getTrans(std::ifstream& trans_trace, MemorySpecification 
memSpec)
+void cmdScheduler::getTrans(std::ifstream& trans_trace, const 
MemorySpecification& memSpec)
 {
   std::string line;
 
   transTime = 0;
-  unsigned newtranstime;
-  unsigned transAddr;
-  unsigned transType = 1;
+  uint64_t newtranstime;
+  uint64_t transAddr;
+  int64_t transType = 1;
   trans    TransItem;
 
   if (!transTrace.empty()) {
@@ -147,12 +152,12 @@
   while (getline(trans_trace, line)) {
     istringstream linestream(line);
     string item;
-    unsigned itemnum = 0;
+    uint64_t itemnum = 0;
     while (getline(linestream, item, ',')) {
       if (itemnum == 0) {
         stringstream timestamp(item);
         timestamp >> newtranstime;
-        transTime = transTime + newtranstime;
+        transTime = transTime + static_cast<int64_t>(newtranstime);
       } else if (itemnum == 1) {
         if (item  == "write" || item == "WRITE") {
           transType = WRITE;
@@ -191,33 +196,35 @@
 // be scheduled until all the commands for the current one are scheduled.
 // After the scheduling, a sequence of commands are obtained and they are 
written
 // into commands.txt which will be used for power analysis.
-void cmdScheduler::analyticalScheduling(MemorySpecification memSpec)
+void cmdScheduler::analyticalScheduling(const MemorySpecification& memSpec)
 {
-  int  Bs               = -1;
-  int  transType        = -1;
-  double timer          = 0;
-  int  bankGroupPointer = 0;
-  int  bankGroupAddr    = 0;
+  int64_t  transType        = -1;
+  int64_t timer          = 0;
+  uint64_t  bankGroupPointer = 0;
+  uint64_t  bankGroupAddr    = 0;
   bool collisionFound;
   physicalAddr PhysicalAddress;
   bool bankGroupSwitch  = false;
-  std::vector<unsigned> bankPointer(nbrOfBankGroups, 0);
-  std::vector<int>  bankAccessNum(nBanks, -1);
-  std::vector<bool> ACTSchedule(nBanks, false);
-  int bankAddr       = -1;
-  double endTime     = 0;
-  double tComing_REF = 0;
+  std::vector<uint64_t> bankPointer(static_cast<size_t>(nbrOfBankGroups), 0);
+  std::vector<int64_t>  bankAccessNum(static_cast<size_t>(nBanks), -1);
+  std::vector<bool> ACTSchedule(static_cast<size_t>(nBanks), false);
+  uint64_t bankAddr   = 0;
+  int64_t endTime     = 0;
+  int64_t tComing_REF = 0;
 
   Inselfrefresh = 0;
 
-  MemTimingSpec& memTimingSpec = memSpec.memTimingSpec;
+  const MemTimingSpec& memTimingSpec = memSpec.memTimingSpec;
 
-  for (unsigned t = 0; t < transTrace.size(); t++) {
+  for (uint64_t t = 0; t < transTrace.size(); t++) {
     cmdScheduling.erase(cmdScheduling.begin(), cmdScheduling.end());
 
-    for (unsigned i = 0; i < nBanks; i++) {
-      ACTSchedule[i]   = false;
-      bankAccessNum[i] = -1;
+    for (auto a : ACTSchedule) {
+      a = false;
+    }
+
+    for (auto& b : bankAccessNum) {
+      b = -1;
     }
 
     timingsGet      = false;
@@ -225,13 +232,13 @@
 
     PhysicalAddress = memoryMap(transTrace[t], memSpec);
 
-    for (unsigned i = 0; i < nbrOfBankGroups; i++) {
-      bankPointer[i] = PhysicalAddress.bankAddr; // the bank pointer per group.
+    for (auto& b : bankPointer) {
+      b = PhysicalAddress.bankAddr; // the bank pointer per group.
     }
     bankGroupPointer = PhysicalAddress.bankGroupAddr;
 
-    endTime          = max(transFinish.time, PRE[transFinish.bank].time +
-                           static_cast<int>(memTimingSpec.RP));
+    endTime = max(transFinish.time, 
PRE[static_cast<size_t>(transFinish.bank)].time +
+                                    static_cast<int>(memTimingSpec.RP));
 
     // Before starting the scheduling for the next transaction, it has to
     // check whether it is necessary for implementing power down.
@@ -244,14 +251,12 @@
 
     ///////////////Scheduling Refresh////////////////////////
     if (((transFinish.time >= tREF) || (timer >= tREF))) {
-      for (double i = 0; i <= ((timer - tComing_REF) > 0 ? (timer - 
tComing_REF) /
+      for (int64_t i = 0; i <= ((timer - tComing_REF) > 0 ? (timer - 
tComing_REF) /
                                memTimingSpec.REFI : 0); i++) {
         cmd.bank = 0;
         cmd.name = "REF";
-        cmd.time = max(max(max(transFinish.time, PRE[transFinish.bank].time
-                               + static_cast<int>(memTimingSpec.RP)), tREF), 
startTime);
-        if (((power_down == SELF_REFRESH) && !Inselfrefresh) ||
-            (power_down != SELF_REFRESH)) {
+        cmd.time = max(max(max(transFinish.time, 
PRE[static_cast<size_t>(transFinish.bank)].time + memTimingSpec.RP), tREF), 
startTime);
+        if ((power_down == SELF_REFRESH && !Inselfrefresh) || power_down != 
SELF_REFRESH) {
           cmdScheduling.push_back(cmd);
           startTime = cmd.time + memTimingSpec.RFC;
         }
@@ -262,7 +267,7 @@
       }
     }
     ///////////////Execution Transactions///////////////////
-    Bs        = PhysicalAddress.bankAddr;
+    uint64_t Bs = PhysicalAddress.bankAddr;
     transType = transTrace[t].type;
 
     tRWTP     = getRWTP(transType, memSpec);
@@ -280,9 +285,8 @@
               bankGroupSwitch = true;
             }
             // update to the current bank group address.
-            bankGroupAddr = PhysicalAddress.bankGroupAddr + j;
-            bankAddr      = bankGroupAddr * nBanks / nbrOfBankGroups +
-                            bankPointer[bankGroupAddr];
+            bankGroupAddr = PhysicalAddress.bankGroupAddr + 
static_cast<uint64_t>(j);
+            bankAddr = bankGroupAddr * static_cast<uint64_t>(nBanks) / 
nbrOfBankGroups + bankPointer[bankGroupAddr];
           } else   {
             bankAddr = Bs + i;
           }
@@ -312,7 +316,7 @@
                              static_cast<int>(memTimingSpec.TAW));
             }
 
-            if ((i == 0) && (j == 0)) {
+            if (i == 0 && j == 0) {
               cmd.time = max(cmd.time, PreRDWR.time + 1);
               cmd.time = max(cmd.time, timer);
               cmd.time = max(startTime, cmd.time);
@@ -358,7 +362,7 @@
           }
           for (int ACTBank = static_cast<int>(ACT.size() - 1);
                ACTBank >= 0; ACTBank--) {
-            if (ACT[ACTBank].bank == bankAddr) {
+            if (ACT[ACTBank].bank == static_cast<int64_t>(bankAddr)) {
               cmd.time = max(PreRDWR.time + tSwitch_init, ACT.back().time
                              + static_cast<int>(memTimingSpec.RCD));
               break;
@@ -392,7 +396,7 @@
             PRE[bankAddr].name = "PRE";
             for (int ACTBank = static_cast<int>(ACT.size() - 1);
                  ACTBank >= 0; ACTBank--) {
-              if (ACT[ACTBank].bank == bankAddr) {
+              if (ACT[ACTBank].bank == static_cast<int64_t>(bankAddr)) {
                 PRE[bankAddr].time = max(ACT.back().time +
                                          static_cast<int>(memTimingSpec.RAS),
                                          PreRDWR.time + tRWTP);
@@ -419,7 +423,7 @@
     /////////////Update Vector Length/////////////////
     // the vector length is reduced so that less memory is used for running
     // this tool.
-    if (ACT.size() >= memSpec.memArchSpec.nbrOfBanks) {
+    if (ACT.size() >= static_cast<size_t>(memSpec.memArchSpec.nbrOfBanks)) {
       for (int m = 0; m < BI * BGI; m++) {
         ACT.erase(ACT.begin());
         RDWR[0].erase(RDWR[0].begin(), RDWR[0].end());
@@ -443,14 +447,14 @@
 // to add the power down/up during the command scheduling for transactions.
 // It is called when the command scheduling for a transaction is finished, and 
it
 // is also called if there is a refresh.
-void cmdScheduler::pdScheduling(double endTime, double timer,
-                                MemorySpecification memSpec)
+void cmdScheduler::pdScheduling(int64_t endTime, int64_t timer,
+                                const MemorySpecification& memSpec)
 {
-  double ZERO = 0;
-  MemTimingSpec& memTimingSpec = memSpec.memTimingSpec;
+  int64_t ZERO = 0;
+  const MemTimingSpec& memTimingSpec = memSpec.memTimingSpec;
 
   endTime = max(endTime, startTime);
-  double pdTime = max(ZERO, timer - endTime);
+  int64_t pdTime = max(ZERO, timer - endTime);
 
   if ((timer > (endTime + memTimingSpec.CKE)) && (power_down == POWER_DOWN)) {
     cmd.bank = 0;
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to