mem-cache: Use possible locations to find block
authorDaniel R. Carvalho <odanrc@yahoo.com.br>
Fri, 9 Mar 2018 14:04:20 +0000 (15:04 +0100)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Wed, 10 Oct 2018 18:17:42 +0000 (18:17 +0000)
Use possible locations to find block to make it placement policy
independent.

Change-Id: I4c9d9e1e1ff91ce12e85ca1970f927d8f4f5a93b
Reviewed-on: https://gem5-review.googlesource.com/c/8884
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.hh
src/mem/cache/tags/base_set_assoc.cc
src/mem/cache/tags/base_set_assoc.hh
src/mem/cache/tags/sector_tags.cc
src/mem/cache/tags/sector_tags.hh
src/mem/cache/tags/skewed_assoc.cc
src/mem/cache/tags/skewed_assoc.hh

index 7f848e0d8ed44e6d48defae78a3ce86d8259b550..9358652bf337b155ab910f105037a36f96ea1c4a 100644 (file)
@@ -78,6 +78,35 @@ BaseTags::setCache(BaseCache *_cache)
     cache = _cache;
 }
 
+std::vector<ReplaceableEntry*>
+BaseTags::getPossibleLocations(const Addr addr) const
+{
+    panic("Unimplemented getPossibleLocations for tags subclass");
+}
+
+CacheBlk*
+BaseTags::findBlock(Addr addr, bool is_secure) const
+{
+    // Extract block tag
+    Addr tag = extractTag(addr);
+
+    // Find possible locations for the given address
+    const std::vector<ReplaceableEntry*> locations =
+        getPossibleLocations(addr);
+
+    // Search for block
+    for (const auto& location : locations) {
+        CacheBlk* blk = static_cast<CacheBlk*>(location);
+        if ((blk->tag == tag) && blk->isValid() &&
+            (blk->isSecure() == is_secure)) {
+            return blk;
+        }
+    }
+
+    // Did not find block
+    return nullptr;
+}
+
 void
 BaseTags::insertBlock(const Addr addr, const bool is_secure,
                       const int src_master_ID, const uint32_t task_ID,
index 385d25c9fbc535739d4344e14e6db1775094ea86..7badc46c2cbfd76f00588f852bdec86319251e52 100644 (file)
@@ -161,6 +161,18 @@ class BaseTags : public ClockedObject
      */
     void setCache(BaseCache *_cache);
 
+    /**
+     * Find all possible block locations for insertion and replacement of
+     * an address. Should be called immediately before ReplacementPolicy's
+     * findVictim() not to break cache resizing.
+     * Returns blocks in all ways belonging to the set of the address.
+     *
+     * @param addr The addr to a find possible locations for.
+     * @return The possible locations.
+     */
+    virtual std::vector<ReplaceableEntry*> getPossibleLocations(
+        const Addr addr) const;
+
   public:
     typedef BaseTagsParams Params;
     BaseTags(const Params *p);
@@ -199,9 +211,13 @@ class BaseTags : public ClockedObject
     std::string print();
 
     /**
-     * Find a block using the memory address
+     * Finds the block in the cache without touching it.
+     *
+     * @param addr The address to look for.
+     * @param is_secure True if the target memory space is secure.
+     * @return Pointer to the cache block.
      */
-    virtual CacheBlk * findBlock(Addr addr, bool is_secure) const = 0;
+    virtual CacheBlk *findBlock(Addr addr, bool is_secure) const;
 
     /**
      * Find a block given set and way.
index 8bd65e03ba4a3e2f766c4d56dd0d03ce087acc0b..05712ec8f2c06db3fc4c9292733fe6e4c45cc52c 100644 (file)
@@ -84,14 +84,12 @@ BaseSetAssoc::init(BaseCache* cache)
     // Initialize blocks
     unsigned blkIndex = 0;       // index into blks array
     for (unsigned i = 0; i < numSets; ++i) {
-        sets[i].assoc = assoc;
-
-        sets[i].blks.resize(assoc);
+        sets[i].resize(assoc);
 
         // link in the data blocks
         for (unsigned j = 0; j < assoc; ++j) {
             // Select block within the set to be linked
-            BlkType*& blk = sets[i].blks[j];
+            BlkType*& blk = sets[i][j];
 
             // Locate next cache block
             blk = &blks[blkIndex];
@@ -128,19 +126,10 @@ BaseSetAssoc::invalidate(CacheBlk *blk)
     replacementPolicy->invalidate(blk->replacementData);
 }
 
-CacheBlk*
-BaseSetAssoc::findBlock(Addr addr, bool is_secure) const
-{
-    Addr tag = extractTag(addr);
-    unsigned set = extractSet(addr);
-    BlkType *blk = sets[set].findBlk(tag, is_secure);
-    return blk;
-}
-
 ReplaceableEntry*
 BaseSetAssoc::findBlockBySetAndWay(int set, int way) const
 {
-    return sets[set].blks[way];
+    return sets[set][way];
 }
 
 BaseSetAssoc *
index a3826499fc59c5096567e976d16bf1c0984f9718..26cc6bcf02d541bc9ef74f3f422dd67390cf78fb 100644 (file)
@@ -59,7 +59,6 @@
 #include "mem/cache/blk.hh"
 #include "mem/cache/replacement_policies/base.hh"
 #include "mem/cache/tags/base.hh"
-#include "mem/cache/tags/cacheset.hh"
 #include "params/BaseSetAssoc.hh"
 
 /**
@@ -76,7 +75,7 @@ class BaseSetAssoc : public BaseTags
     /** Typedef the block type used in this tag store. */
     typedef CacheBlk BlkType;
     /** Typedef the set type used in this tag store. */
-    typedef CacheSet<CacheBlk> SetType;
+    typedef std::vector<CacheBlk*> SetType;
 
   protected:
     /** The associativity of the cache. */
@@ -106,6 +105,25 @@ class BaseSetAssoc : public BaseTags
     /** Replacement policy */
     BaseReplacementPolicy *replacementPolicy;
 
+    /**
+     * Find all possible block locations for insertion and replacement of
+     * an address. Should be called immediately before ReplacementPolicy's
+     * findVictim() not to break cache resizing.
+     * Returns blocks in all ways belonging to the set of the address.
+     *
+     * @param addr The addr to a find possible locations for.
+     * @return The possible locations.
+     */
+    std::vector<ReplaceableEntry*> getPossibleLocations(const Addr addr) const
+                                                                      override
+    {
+        std::vector<ReplaceableEntry*> locations;
+        for (const auto& blk : sets[extractSet(addr)]) {
+            locations.push_back(static_cast<ReplaceableEntry*>(blk));
+        }
+        return locations;
+    }
+
   public:
     /** Convenience typedef. */
      typedef BaseSetAssocParams Params;
@@ -186,16 +204,6 @@ class BaseSetAssoc : public BaseTags
         return blk;
     }
 
-    /**
-     * Finds the given address in the cache, do not update replacement data.
-     * i.e. This is a no-side-effect find of a block.
-     *
-     * @param addr The address to find.
-     * @param is_secure True if the target memory space is secure.
-     * @return Pointer to the cache block if found.
-     */
-    CacheBlk* findBlock(Addr addr, bool is_secure) const override;
-
     /**
      * Find a block given set and way.
      *
@@ -218,7 +226,7 @@ class BaseSetAssoc : public BaseTags
                          std::vector<CacheBlk*>& evict_blks) const override
     {
         // Get possible locations for the victim block
-        std::vector<CacheBlk*> locations = getPossibleLocations(addr);
+        std::vector<ReplaceableEntry*> locations = getPossibleLocations(addr);
 
         // Choose replacement victim from replacement candidates
         CacheBlk* victim = static_cast<CacheBlk*>(replacementPolicy->getVictim(
@@ -234,20 +242,6 @@ class BaseSetAssoc : public BaseTags
         return victim;
     }
 
-    /**
-     * Find all possible block locations for insertion and replacement of
-     * an address. Should be called immediately before ReplacementPolicy's
-     * findVictim() not to break cache resizing.
-     * Returns blocks in all ways belonging to the set of the address.
-     *
-     * @param addr The addr to a find possible locations for.
-     * @return The possible locations.
-     */
-    virtual const std::vector<CacheBlk*> getPossibleLocations(Addr addr) const
-    {
-        return sets[extractSet(addr)].blks;
-    }
-
     /**
      * Insert the new block into the cache and update replacement data.
      *
index 988fda54007af217fb6ffe21b42c1acfc0c366ee..ef3fec2b9f1d9cb8fe3e4ccb292e74da035b1178 100644 (file)
@@ -194,10 +194,14 @@ SectorTags::accessBlock(Addr addr, bool is_secure, Cycles &lat)
     return blk;
 }
 
-const std::vector<SectorBlk*>
-SectorTags::getPossibleLocations(Addr addr) const
+std::vector<ReplaceableEntry*>
+SectorTags::getPossibleLocations(const Addr addr) const
 {
-    return sets[extractSet(addr)];
+    std::vector<ReplaceableEntry*> locations;
+    for (const auto& blk : sets[extractSet(addr)]) {
+        locations.push_back(static_cast<ReplaceableEntry*>(blk));
+    }
+    return locations;
 }
 
 void
@@ -238,11 +242,12 @@ SectorTags::findBlock(Addr addr, bool is_secure) const
     const Addr offset = extractSectorOffset(addr);
 
     // Find all possible sector locations for the given address
-    const std::vector<SectorBlk*> locations = getPossibleLocations(addr);
+    const std::vector<ReplaceableEntry*> locations =
+        getPossibleLocations(addr);
 
     // Search for block
     for (const auto& sector : locations) {
-        auto blk = sector->blks[offset];
+        auto blk = static_cast<SectorBlk*>(sector)->blks[offset];
         if (blk->getTag() == tag && blk->isValid() &&
             blk->isSecure() == is_secure) {
             return blk;
@@ -264,16 +269,17 @@ SectorTags::findVictim(Addr addr, const bool is_secure,
                        std::vector<CacheBlk*>& evict_blks) const
 {
     // Get all possible locations of this sector
-    const std::vector<SectorBlk*> sector_locations =
+    const std::vector<ReplaceableEntry*> sector_locations =
         getPossibleLocations(addr);
 
     // Check if the sector this address belongs to has been allocated
     Addr tag = extractTag(addr);
     SectorBlk* victim_sector = nullptr;
-    for (const auto& sector : sector_locations){
-        if ((tag == sector->getTag()) && sector->isValid() &&
-            (is_secure == sector->isSecure())){
-            victim_sector = sector;
+    for (const auto& sector : sector_locations) {
+        SectorBlk* sector_blk = static_cast<SectorBlk*>(sector);
+        if ((tag == sector_blk->getTag()) && sector_blk->isValid() &&
+            (is_secure == sector_blk->isSecure())){
+            victim_sector = sector_blk;
             break;
         }
     }
@@ -282,8 +288,7 @@ SectorTags::findVictim(Addr addr, const bool is_secure,
     if (victim_sector == nullptr){
         // Choose replacement victim from replacement candidates
         victim_sector = static_cast<SectorBlk*>(replacementPolicy->getVictim(
-                          std::vector<ReplaceableEntry*>(
-                          sector_locations.begin(), sector_locations.end())));
+                                                sector_locations));
     }
 
     // Get the location of the victim block within the sector
index 7a2cddae97967141a36017ce6df3052b4d44ed50..c3c3bc8f9a2b6b197f04d15933925ae9a5e32b35 100644 (file)
@@ -100,6 +100,18 @@ class SectorTags : public BaseTags
     /** Mask out all bits that aren't part of the set index. */
     const unsigned setMask;
 
+    /**
+     * Find all possible block locations for insertion and replacement of
+     * an address. Should be called immediately before ReplacementPolicy's
+     * findVictim() not to break cache resizing.
+     * Returns sector blocks in all ways belonging to the set of the address.
+     *
+     * @param addr The addr to a find possible locations for.
+     * @return The possible locations.
+     */
+    std::vector<ReplaceableEntry*> getPossibleLocations(const Addr addr) const
+                                                                     override;
+
   public:
     /** Convenience typedef. */
      typedef SectorTagsParams Params;
@@ -142,18 +154,6 @@ class SectorTags : public BaseTags
      */
     CacheBlk* accessBlock(Addr addr, bool is_secure, Cycles &lat) override;
 
-    /**
-     * Find all possible block locations for insertion and replacement of
-     * an address. Should be called immediately before ReplacementPolicy's
-     * findVictim() not to break cache resizing.
-     * Returns sector blocks in all ways belonging to the set of the address.
-     *
-     * @param addr The addr to a find possible locations for.
-     * @return The possible locations.
-     */
-    virtual const std::vector<SectorBlk*> getPossibleLocations(Addr addr)
-                                                                   const;
-
     /**
      * Insert the new block into the cache and update replacement data.
      *
index b3945d0c4c6293d59bd3a083d56f49626469cc04..89ab6158828ce832e447d28ce5366bd49cc7eb7f 100644 (file)
@@ -204,15 +204,15 @@ SkewedAssoc::regenerateBlkAddr(const CacheBlk* blk) const
     return (blk->tag << tagShift) | (set << setShift);
 }
 
-const std::vector<CacheBlk*>
-SkewedAssoc::getPossibleLocations(Addr addr) const
+std::vector<ReplaceableEntry*>
+SkewedAssoc::getPossibleLocations(const Addr addr) const
 {
-    std::vector<CacheBlk*> locations;
+    std::vector<ReplaceableEntry*> locations;
 
     // Parse all ways
     for (int way = 0; way < assoc; ++way) {
         // Apply hash to get set, and get way entry in it
-        locations.push_back(sets[extractSet(addr, way)].blks[way]);
+        locations.push_back(sets[extractSet(addr, way)][way]);
     }
 
     return locations;
@@ -225,10 +225,11 @@ SkewedAssoc::findBlock(Addr addr, bool is_secure) const
     Addr tag = extractTag(addr);
 
     // Find possible locations for the given address
-    std::vector<CacheBlk*> locations = getPossibleLocations(addr);
+    std::vector<ReplaceableEntry*> locations = getPossibleLocations(addr);
 
     // Search for block
-    for (const auto& blk : locations) {
+    for (const auto& location : locations) {
+        CacheBlk* blk = static_cast<CacheBlk*>(location);
         if ((blk->tag == tag) && blk->isValid() &&
             (blk->isSecure() == is_secure)) {
             return blk;
index 9fc39e297963616e51464bae6f0cb1131ce8c44a..597c32fcdb3f771c40a257aed741e5cff36cd52e 100644 (file)
@@ -120,6 +120,19 @@ class SkewedAssoc : public BaseSetAssoc
      */
     unsigned extractSet(Addr addr, unsigned way) const;
 
+  protected:
+    /**
+     * Find all possible block locations for insertion and replacement of
+     * an address. Should be called immediately before ReplacementPolicy's
+     * findVictim() not to break cache resizing.
+     * Returns blocks in all ways belonging to the set of the address.
+     *
+     * @param addr The addr to a find possible locations for.
+     * @return The possible locations.
+     */
+    std::vector<ReplaceableEntry*> getPossibleLocations(const Addr addr) const
+                                                                     override;
+
   public:
     /** Convenience typedef. */
      typedef SkewedAssocParams Params;
@@ -134,18 +147,6 @@ class SkewedAssoc : public BaseSetAssoc
      */
     ~SkewedAssoc() {};
 
-    /**
-     * Find all possible block locations for insertion and replacement of
-     * an address. Should be called immediately before ReplacementPolicy's
-     * findVictim() not to break cache resizing.
-     * Returns blocks in all ways belonging to the set of the address.
-     *
-     * @param addr The addr to a find possible locations for.
-     * @return The possible locations.
-     */
-    const std::vector<CacheBlk*> getPossibleLocations(Addr addr) const
-                                                             override;
-
     /**
      * Finds the given address in the cache, do not update replacement data.
      * i.e. This is a no-side-effect find of a block.