mem-cache: Vectorize C arrays in BaseSetAssoc.
authorDaniel R. Carvalho <odanrc@yahoo.com.br>
Mon, 26 Feb 2018 14:22:33 +0000 (15:22 +0100)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Thu, 1 Mar 2018 08:14:33 +0000 (08:14 +0000)
Transform BaseSetAssoc's arrays into C++ vectors to avoid unnecessary
resource management.

Change-Id: I656f42f29e5f9589eba491b410ca1df5a64f2f34
Reviewed-on: https://gem5-review.googlesource.com/8621
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>

src/mem/cache/tags/base.cc
src/mem/cache/tags/base_set_assoc.cc
src/mem/cache/tags/base_set_assoc.hh

index aa8a34f2df3f3fa5c2401e46070245e67c1747c5..8b52b746eaa2809080b0acba1331219a8acd15fd 100644 (file)
@@ -63,7 +63,7 @@ BaseTags::BaseTags(const Params *p)
                     std::max(p->tag_latency, p->data_latency)),
       cache(nullptr),
       warmupBound((p->warmup_percentage/100.0) * (p->size / p->block_size)),
-      warmedUp(false), numBlocks(0)
+      warmedUp(false), numBlocks(p->size / p->block_size)
 {
 }
 
index c39822929c42182c15c44dae7c13a489fec2765a..728f5a5f9a5717be6e7f29b23a029df7883e7f7f 100644 (file)
@@ -56,8 +56,11 @@ using namespace std;
 
 BaseSetAssoc::BaseSetAssoc(const Params *p)
     :BaseTags(p), assoc(p->assoc), allocAssoc(p->assoc),
+     blks(p->size / p->block_size),
+     dataBlks(new uint8_t[p->size]), // Allocate data storage in one big chunk
      numSets(p->size / (p->block_size * p->assoc)),
-     sequentialAccess(p->sequential_access)
+     sequentialAccess(p->sequential_access),
+     sets(p->size / (p->block_size * p->assoc))
 {
     // Check parameters
     if (blkSize < 4 || !isPowerOf2(blkSize)) {
@@ -74,12 +77,6 @@ BaseSetAssoc::BaseSetAssoc(const Params *p)
     setMask = numSets - 1;
     tagShift = setShift + floorLog2(numSets);
 
-    sets = new SetType[numSets];
-    blks = new BlkType[numSets * assoc];
-    // allocate data storage in one big chunk
-    numBlocks = numSets * assoc;
-    dataBlks = new uint8_t[numBlocks * blkSize];
-
     unsigned blkIndex = 0;       // index into blks array
     for (unsigned i = 0; i < numSets; ++i) {
         sets[i].assoc = assoc;
@@ -110,13 +107,6 @@ BaseSetAssoc::BaseSetAssoc(const Params *p)
     }
 }
 
-BaseSetAssoc::~BaseSetAssoc()
-{
-    delete [] dataBlks;
-    delete [] blks;
-    delete [] sets;
-}
-
 CacheBlk*
 BaseSetAssoc::findBlock(Addr addr, bool is_secure) const
 {
index ef4c68b628c0d64ceebfce8c1e0ee160b4cce646..cbd48092c37c7aecda4307aa5fa6905b3ab2880b 100644 (file)
@@ -50,7 +50,8 @@
 
 #include <cassert>
 #include <cstring>
-#include <list>
+#include <memory>
+#include <vector>
 
 #include "mem/cache/base.hh"
 #include "mem/cache/blk.hh"
@@ -87,18 +88,20 @@ class BaseSetAssoc : public BaseTags
     const unsigned assoc;
     /** The allocatable associativity of the cache (alloc mask). */
     unsigned allocAssoc;
+
+    /** The cache blocks. */
+    std::vector<BlkType> blks;
+    /** The data blocks, 1 per cache block. */
+    std::unique_ptr<uint8_t[]> dataBlks;
+
     /** The number of sets in the cache. */
     const unsigned numSets;
+
     /** Whether tags and data are accessed sequentially. */
     const bool sequentialAccess;
 
     /** The cache sets. */
-    SetType *sets;
-
-    /** The cache blocks. */
-    BlkType *blks;
-    /** The data blocks, 1 per cache block. */
-    uint8_t *dataBlks;
+    std::vector<SetType> sets;
 
     /** The amount to shift the address to get the set. */
     int setShift;
@@ -120,7 +123,7 @@ public:
     /**
      * Destructor
      */
-    virtual ~BaseSetAssoc();
+    virtual ~BaseSetAssoc() {};
 
     /**
      * Find the cache block given set and way