mem-cache: Use set and way for ReplaceableEntry
authorDaniel R. Carvalho <odanrc@yahoo.com.br>
Fri, 7 Sep 2018 12:33:00 +0000 (14:33 +0200)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Wed, 10 Oct 2018 18:17:42 +0000 (18:17 +0000)
Replaceable entries belong to table-like structures, and therefore
they should be indexable by combining a row and a column. These,
using conventional cache nomenclature translate to sets and ways.

Make these entries aware of their sets and ways. The idea is to
make indexing policies usable by other table-like structures. In
order to do so we move sets and ways to ReplaceableEntry, which
will be the common base among table entries.

Change-Id: If0e3dacf9ea2f523af9cface067469ccecf82648
Reviewed-on: https://gem5-review.googlesource.com/c/12764
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>

src/mem/cache/blk.hh
src/mem/cache/replacement_policies/base.hh
src/mem/cache/tags/base.cc
src/mem/cache/tags/base_set_assoc.cc
src/mem/cache/tags/base_set_assoc.hh
src/mem/cache/tags/fa_lru.cc
src/mem/cache/tags/sector_tags.cc
src/mem/cache/tags/skewed_assoc.cc

index 3bb0317cc43b7c4b6a9c6164ee86291036e67305..cc6d9057184240ee06a9a2046d911c9c588ea394 100644 (file)
@@ -108,12 +108,6 @@ class CacheBlk : public ReplaceableEntry
     /** Which curTick() will this block be accessible */
     Tick whenReady;
 
-    /**
-     * The set and way this block belongs to.
-     * @todo Move this into subclasses when we fix CacheTags to use them.
-     */
-    int set, way;
-
     /** Number of references to this block since it was brought in. */
     unsigned refCount;
 
index 0ce86d091c3024bae091c678cd6393c503aa6867..6ac7dca853fda050ff96bf2ce22020fb01520bcc 100644 (file)
@@ -50,12 +50,48 @@ struct ReplacementData {};
  */
 class ReplaceableEntry
 {
-  public:
+  private:
+    /**
+     * Set to which this entry belongs.
+     */
+    uint32_t _set;
+
+    /**
+     * Way (relative position within the set) to which this entry belongs.
+     */
+    uint32_t _way;
+
+   public:
+     /**
+      * Replacement data associated to this entry.
+      * It is instantiated by the replacement policy.
+      */
+     std::shared_ptr<ReplacementData> replacementData;
+
     /**
-     * Replacement data associated to this entry.
-     * It is instantiated by the replacement policy.
+     * Set both the set and way. Should be called only once.
+     *
+     * @param set The set of this entry.
+     * @param way The way of this entry.
+     */
+    void setPosition(const uint32_t set, const uint32_t way) {
+        _set = set;
+        _way = way;
+    }
+
+    /**
+     * Get set number.
+     *
+     * @return The set to which this entry belongs.
+     */
+    uint32_t getSet() const { return _set; }
+
+    /**
+     * Get way number.
+     *
+     * @return The way to which this entry belongs.
      */
-    std::shared_ptr<ReplacementData> replacementData;
+    uint32_t getWay() const { return _way; }
 };
 
 /**
index 9358652bf337b155ab910f105037a36f96ea1c4a..303eb04e220aa27c9e777628585c886c953b8546 100644 (file)
@@ -194,8 +194,8 @@ BaseTags::print()
 
     auto print_blk = [&str](CacheBlk &blk) {
         if (blk.isValid())
-            str += csprintf("\tset: %d way: %d %s\n", blk.set, blk.way,
-                            blk.print());
+            str += csprintf("\tset: %x, way: %x %s\n", blk.getSet(),
+                            blk.getWay(), blk.print());
     };
     forEachBlk(print_blk);
 
index 05712ec8f2c06db3fc4c9292733fe6e4c45cc52c..543231cd91d74f2880e40cab36dce80ef87222a9 100644 (file)
@@ -104,9 +104,8 @@ BaseSetAssoc::init(BaseCache* cache)
             // hash table; won't matter because the block is invalid
             blk->tag = j;
 
-            // Set its set and way
-            blk->set = i;
-            blk->way = j;
+            // Set its index
+            blk->setPosition(i, j);
 
             // Update block index
             ++blkIndex;
index 26cc6bcf02d541bc9ef74f3f422dd67390cf78fb..2f4f7309d6831cf3d213d9a5bdd91cc58eae549a 100644 (file)
@@ -237,7 +237,7 @@ class BaseSetAssoc : public BaseTags
         evict_blks.push_back(victim);
 
         DPRINTF(CacheRepl, "set %x, way %x: selecting blk for replacement\n",
-            victim->set, victim->way);
+                victim->getSet(), victim->getWay());
 
         return victim;
     }
@@ -302,7 +302,8 @@ class BaseSetAssoc : public BaseTags
      */
     Addr regenerateBlkAddr(const CacheBlk* blk) const override
     {
-        return ((blk->tag << tagShift) | ((Addr)blk->set << setShift));
+        const Addr set = blk->getSet() << setShift;
+        return ((blk->tag << tagShift) | set);
     }
 
     void forEachBlk(std::function<void(CacheBlk &)> visitor) override {
index d35e37c7b4da8e02ab958a13804e08274b79fd47..fa7c6595f177cbb4dbb19dcec71ec70bb9adc741 100644 (file)
@@ -85,15 +85,13 @@ FALRU::init(BaseCache* cache)
     head = &(blks[0]);
     head->prev = nullptr;
     head->next = &(blks[1]);
-    head->set = 0;
-    head->way = 0;
+    head->setPosition(0, 0);
     head->data = &dataBlks[0];
 
     for (unsigned i = 1; i < numBlocks - 1; i++) {
         blks[i].prev = &(blks[i-1]);
         blks[i].next = &(blks[i+1]);
-        blks[i].set = 0;
-        blks[i].way = i;
+        blks[i].setPosition(0, i);
 
         // Associate a data chunk to the block
         blks[i].data = &dataBlks[blkSize*i];
@@ -102,8 +100,7 @@ FALRU::init(BaseCache* cache)
     tail = &(blks[numBlocks - 1]);
     tail->prev = &(blks[numBlocks - 2]);
     tail->next = nullptr;
-    tail->set = 0;
-    tail->way = numBlocks - 1;
+    tail->setPosition(0, numBlocks - 1);
     tail->data = &dataBlks[(numBlocks - 1) * blkSize];
 
     cacheTracking.init(head, tail);
index ef3fec2b9f1d9cb8fe3e4ccb292e74da035b1178..90b31b64bd0eed9c04499dc4918927039a39b6fd 100644 (file)
@@ -92,6 +92,9 @@ SectorTags::init(BaseCache* cache)
             // Associate a replacement data entry to the sector
             sec_blk->replacementData = replacementPolicy->instantiateEntry();
 
+            // Set its index
+            sec_blk->setPosition(i, j);
+
             // Initialize all blocks in this sector
             sec_blk->blks.resize(numBlocksPerSector);
             for (unsigned k = 0; k < numBlocksPerSector; ++k){
@@ -110,9 +113,8 @@ SectorTags::init(BaseCache* cache)
                 // Associate the sector replacement data to this block
                 blk->replacementData = sec_blk->replacementData;
 
-                // Set its set, way and sector offset
-                blk->set = i;
-                blk->way = j;
+                // Set its index and sector offset
+                blk->setPosition(i, j);
                 blk->setSectorOffset(k);
 
                 // Update block index
@@ -308,8 +310,8 @@ SectorTags::findVictim(Addr addr, const bool is_secure,
         }
     }
 
-    DPRINTF(CacheRepl, "set %x, way %x, sector offset %x: %s\n",
-            "selecting blk for replacement\n", victim->set, victim->way,
+    DPRINTF(CacheRepl, "set %x, way %x, sector offset %x: selecting blk " \
+            "for replacement\n", victim->getSet(), victim->getWay(),
             victim->getSectorOffset());
 
     return victim;
@@ -337,7 +339,8 @@ Addr
 SectorTags::regenerateBlkAddr(const CacheBlk* blk) const
 {
     const SectorSubBlk* blk_cast = static_cast<const SectorSubBlk*>(blk);
-    return ((blk_cast->getTag() << tagShift) | ((Addr)blk->set << setShift) |
+    const Addr set = blk_cast->getSectorBlock()->getSet() << setShift;
+    return ((blk_cast->getTag() << tagShift) | set |
             ((Addr)blk_cast->getSectorOffset() << sectorShift));
 }
 
index 89ab6158828ce832e447d28ce5366bd49cc7eb7f..d92ab469a18e3235a37206c51f6c7a9d2ac35b92 100644 (file)
@@ -199,8 +199,8 @@ SkewedAssoc::extractSet(Addr addr, unsigned way) const
 Addr
 SkewedAssoc::regenerateBlkAddr(const CacheBlk* blk) const
 {
-    const Addr addr = (blk->tag << (msbShift + 1)) | blk->set;
-    const Addr set = deskew(addr, blk->way) & setMask;
+    const Addr addr = (blk->tag << (msbShift + 1)) | blk->getSet();
+    const Addr set = deskew(addr, blk->getWay()) & setMask;
     return (blk->tag << tagShift) | (set << setShift);
 }