gem5-dev@gem5.org

The gem5 Developer List

View all threads

[M] Change in gem5/gem5[develop]: mem-cache: De-virtualize forEachBlk() in tags

DC
Daniel Carvalho (Gerrit)
Thu, Jun 8, 2023 12:26 AM

Daniel Carvalho has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/70998?usp=email )

Change subject: mem-cache: De-virtualize forEachBlk() in tags
......................................................................

mem-cache: De-virtualize forEachBlk() in tags

Avoid code duplication by using the anyBlk function
with a lambda that always returns false, which forces
all blocks to be visited.

Change-Id: I25527602535c719f46699677a7f70f3e31157f26
Signed-off-by: Daniel R. Carvalho odanrc@yahoo.com.br
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/70998
Reviewed-by: Jason Lowe-Power power.jg@gmail.com
Maintainer: Jason Lowe-Power power.jg@gmail.com
Tested-by: kokoro noreply+kokoro@google.com

M src/mem/cache/tags/base.cc
M src/mem/cache/tags/base.hh
M src/mem/cache/tags/base_set_assoc.hh
M src/mem/cache/tags/compressed_tags.cc
M src/mem/cache/tags/compressed_tags.hh
M src/mem/cache/tags/fa_lru.hh
M src/mem/cache/tags/sector_tags.cc
M src/mem/cache/tags/sector_tags.hh
8 files changed, 10 insertions(+), 49 deletions(-)

Approvals:
kokoro: Regressions pass
Jason Lowe-Power: Looks good to me, approved; Looks good to me, approved

diff --git a/src/mem/cache/tags/base.cc b/src/mem/cache/tags/base.cc
index 560b041..8216f3d 100644
--- a/src/mem/cache/tags/base.cc
+++ b/src/mem/cache/tags/base.cc
@@ -215,6 +215,15 @@
return str;
}

+void
+BaseTags::forEachBlk(std::function<void(CacheBlk &)> visitor)
+{

  • anyBlk([visitor](CacheBlk &blk) {
  •    visitor(blk);
    
  •    return false;
    
  • });
    +}
  • BaseTags::BaseTagStats::BaseTagStats(BaseTags &_tags)
    : statistics::Group(&_tags),
    tags(_tags),
    diff --git a/src/mem/cache/tags/base.hh b/src/mem/cache/tags/base.hh
    index e270277..c491881 100644
    --- a/src/mem/cache/tags/base.hh
    +++ b/src/mem/cache/tags/base.hh
    @@ -336,7 +336,7 @@
    *
    * @param visitor Visitor to call on each block.
    */
  • virtual void forEachBlk(std::function<void(CacheBlk &)> visitor) = 0;
  • void forEachBlk(std::function<void(CacheBlk &)> visitor);

    /**

    • Find if any of the blocks satisfies a condition
      diff --git a/src/mem/cache/tags/base_set_assoc.hh
      b/src/mem/cache/tags/base_set_assoc.hh
      index 22695d2..8ffb718 100644
      --- a/src/mem/cache/tags/base_set_assoc.hh
      +++ b/src/mem/cache/tags/base_set_assoc.hh
      @@ -233,12 +233,6 @@
      return indexingPolicy->regenerateAddr(blk->getTag(), blk);
      }
  • void forEachBlk(std::function<void(CacheBlk &)> visitor) override {
  •    for (CacheBlk& blk : blks) {
    
  •        visitor(blk);
    
  •    }
    
  • }
  • bool anyBlk(std::function<bool(CacheBlk &)> visitor) override {
        for (CacheBlk& blk : blks) {
            if (visitor(blk)) {
    

diff --git a/src/mem/cache/tags/compressed_tags.cc
b/src/mem/cache/tags/compressed_tags.cc
index 32d7401..c84718f 100644
--- a/src/mem/cache/tags/compressed_tags.cc
+++ b/src/mem/cache/tags/compressed_tags.cc
@@ -163,14 +163,6 @@
return victim;
}

-void
-CompressedTags::forEachBlk(std::function<void(CacheBlk &)> visitor)
-{

  • for (CompressionBlk& blk : blks) {

  •    visitor(blk);
    
  • }
    -}

  • bool
    CompressedTags::anyBlk(std::function<bool(CacheBlk &)> visitor)
    {
    diff --git a/src/mem/cache/tags/compressed_tags.hh
    b/src/mem/cache/tags/compressed_tags.hh
    index b54efb0..6e5b62d 100644
    --- a/src/mem/cache/tags/compressed_tags.hh
    +++ b/src/mem/cache/tags/compressed_tags.hh
    @@ -109,16 +109,6 @@
    std::vector<CacheBlk*>& evict_blks) override;

    /**
    
  • * Visit each sub-block in the tags and apply a visitor.
    
  • *
    
  • * The visitor should be a std::function that takes a cache block.
    
  • * reference as its parameter.
    
  • *
    
  • * @param visitor Visitor to call on each block.
    
  • */
    
  • void forEachBlk(std::function<void(CacheBlk &)> visitor) override;

  • /**

    • Find if any of the sub-blocks satisfies a condition.
    • The visitor should be a std::function that takes a cache block
      diff --git a/src/mem/cache/tags/fa_lru.hh b/src/mem/cache/tags/fa_lru.hh
      index deffd72..cd07817 100644
      --- a/src/mem/cache/tags/fa_lru.hh
      +++ b/src/mem/cache/tags/fa_lru.hh
      @@ -253,12 +253,6 @@
      return blk->getTag();
      }
  • void forEachBlk(std::function<void(CacheBlk &)> visitor) override {

  •    for (int i = 0; i < numBlocks; i++) {
    
  •        visitor(blks[i]);
    
  •    }
    
  • }

  • bool anyBlk(std::function<bool(CacheBlk &)> visitor) override {
        for (int i = 0; i < numBlocks; i++) {
            if (visitor(blks[i])) {
    

diff --git a/src/mem/cache/tags/sector_tags.cc
b/src/mem/cache/tags/sector_tags.cc
index cb121eb..6a9ffd0 100644
--- a/src/mem/cache/tags/sector_tags.cc
+++ b/src/mem/cache/tags/sector_tags.cc
@@ -359,14 +359,6 @@
}
}

-void
-SectorTags::forEachBlk(std::function<void(CacheBlk &)> visitor)
-{

  • for (SectorSubBlk& blk : blks) {

  •    visitor(blk);
    
  • }
    -}

  • bool
    SectorTags::anyBlk(std::function<bool(CacheBlk &)> visitor)
    {
    diff --git a/src/mem/cache/tags/sector_tags.hh
    b/src/mem/cache/tags/sector_tags.hh
    index bad1321..035b085 100644
    --- a/src/mem/cache/tags/sector_tags.hh
    +++ b/src/mem/cache/tags/sector_tags.hh
    @@ -194,16 +194,6 @@
    Addr regenerateBlkAddr(const CacheBlk* blk) const override;

    /**
    
  • * Visit each sub-block in the tags and apply a visitor.
    
  • *
    
  • * The visitor should be a std::function that takes a cache block.
    
  • * reference as its parameter.
    
  • *
    
  • * @param visitor Visitor to call on each block.
    
  • */
    
  • void forEachBlk(std::function<void(CacheBlk &)> visitor) override;

  • /**

    • Find if any of the sub-blocks satisfies a condition.
    • The visitor should be a std::function that takes a cache block

--
To view, visit
https://gem5-review.googlesource.com/c/public/gem5/+/70998?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I25527602535c719f46699677a7f70f3e31157f26
Gerrit-Change-Number: 70998
Gerrit-PatchSet: 2
Gerrit-Owner: Daniel Carvalho odanrc@yahoo.com.br
Gerrit-Reviewer: Daniel Carvalho odanrc@yahoo.com.br
Gerrit-Reviewer: Jason Lowe-Power power.jg@gmail.com
Gerrit-Reviewer: Nikos Nikoleris nikos.nikoleris@arm.com
Gerrit-Reviewer: kokoro noreply+kokoro@google.com

Daniel Carvalho has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/70998?usp=email ) Change subject: mem-cache: De-virtualize forEachBlk() in tags ...................................................................... mem-cache: De-virtualize forEachBlk() in tags Avoid code duplication by using the anyBlk function with a lambda that always returns false, which forces all blocks to be visited. Change-Id: I25527602535c719f46699677a7f70f3e31157f26 Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/70998 Reviewed-by: Jason Lowe-Power <power.jg@gmail.com> Maintainer: Jason Lowe-Power <power.jg@gmail.com> Tested-by: kokoro <noreply+kokoro@google.com> --- M src/mem/cache/tags/base.cc M src/mem/cache/tags/base.hh M src/mem/cache/tags/base_set_assoc.hh M src/mem/cache/tags/compressed_tags.cc M src/mem/cache/tags/compressed_tags.hh M src/mem/cache/tags/fa_lru.hh M src/mem/cache/tags/sector_tags.cc M src/mem/cache/tags/sector_tags.hh 8 files changed, 10 insertions(+), 49 deletions(-) Approvals: kokoro: Regressions pass Jason Lowe-Power: Looks good to me, approved; Looks good to me, approved diff --git a/src/mem/cache/tags/base.cc b/src/mem/cache/tags/base.cc index 560b041..8216f3d 100644 --- a/src/mem/cache/tags/base.cc +++ b/src/mem/cache/tags/base.cc @@ -215,6 +215,15 @@ return str; } +void +BaseTags::forEachBlk(std::function<void(CacheBlk &)> visitor) +{ + anyBlk([visitor](CacheBlk &blk) { + visitor(blk); + return false; + }); +} + BaseTags::BaseTagStats::BaseTagStats(BaseTags &_tags) : statistics::Group(&_tags), tags(_tags), diff --git a/src/mem/cache/tags/base.hh b/src/mem/cache/tags/base.hh index e270277..c491881 100644 --- a/src/mem/cache/tags/base.hh +++ b/src/mem/cache/tags/base.hh @@ -336,7 +336,7 @@ * * @param visitor Visitor to call on each block. */ - virtual void forEachBlk(std::function<void(CacheBlk &)> visitor) = 0; + void forEachBlk(std::function<void(CacheBlk &)> visitor); /** * Find if any of the blocks satisfies a condition diff --git a/src/mem/cache/tags/base_set_assoc.hh b/src/mem/cache/tags/base_set_assoc.hh index 22695d2..8ffb718 100644 --- a/src/mem/cache/tags/base_set_assoc.hh +++ b/src/mem/cache/tags/base_set_assoc.hh @@ -233,12 +233,6 @@ return indexingPolicy->regenerateAddr(blk->getTag(), blk); } - void forEachBlk(std::function<void(CacheBlk &)> visitor) override { - for (CacheBlk& blk : blks) { - visitor(blk); - } - } - bool anyBlk(std::function<bool(CacheBlk &)> visitor) override { for (CacheBlk& blk : blks) { if (visitor(blk)) { diff --git a/src/mem/cache/tags/compressed_tags.cc b/src/mem/cache/tags/compressed_tags.cc index 32d7401..c84718f 100644 --- a/src/mem/cache/tags/compressed_tags.cc +++ b/src/mem/cache/tags/compressed_tags.cc @@ -163,14 +163,6 @@ return victim; } -void -CompressedTags::forEachBlk(std::function<void(CacheBlk &)> visitor) -{ - for (CompressionBlk& blk : blks) { - visitor(blk); - } -} - bool CompressedTags::anyBlk(std::function<bool(CacheBlk &)> visitor) { diff --git a/src/mem/cache/tags/compressed_tags.hh b/src/mem/cache/tags/compressed_tags.hh index b54efb0..6e5b62d 100644 --- a/src/mem/cache/tags/compressed_tags.hh +++ b/src/mem/cache/tags/compressed_tags.hh @@ -109,16 +109,6 @@ std::vector<CacheBlk*>& evict_blks) override; /** - * Visit each sub-block in the tags and apply a visitor. - * - * The visitor should be a std::function that takes a cache block. - * reference as its parameter. - * - * @param visitor Visitor to call on each block. - */ - void forEachBlk(std::function<void(CacheBlk &)> visitor) override; - - /** * Find if any of the sub-blocks satisfies a condition. * * The visitor should be a std::function that takes a cache block diff --git a/src/mem/cache/tags/fa_lru.hh b/src/mem/cache/tags/fa_lru.hh index deffd72..cd07817 100644 --- a/src/mem/cache/tags/fa_lru.hh +++ b/src/mem/cache/tags/fa_lru.hh @@ -253,12 +253,6 @@ return blk->getTag(); } - void forEachBlk(std::function<void(CacheBlk &)> visitor) override { - for (int i = 0; i < numBlocks; i++) { - visitor(blks[i]); - } - } - bool anyBlk(std::function<bool(CacheBlk &)> visitor) override { for (int i = 0; i < numBlocks; i++) { if (visitor(blks[i])) { diff --git a/src/mem/cache/tags/sector_tags.cc b/src/mem/cache/tags/sector_tags.cc index cb121eb..6a9ffd0 100644 --- a/src/mem/cache/tags/sector_tags.cc +++ b/src/mem/cache/tags/sector_tags.cc @@ -359,14 +359,6 @@ } } -void -SectorTags::forEachBlk(std::function<void(CacheBlk &)> visitor) -{ - for (SectorSubBlk& blk : blks) { - visitor(blk); - } -} - bool SectorTags::anyBlk(std::function<bool(CacheBlk &)> visitor) { diff --git a/src/mem/cache/tags/sector_tags.hh b/src/mem/cache/tags/sector_tags.hh index bad1321..035b085 100644 --- a/src/mem/cache/tags/sector_tags.hh +++ b/src/mem/cache/tags/sector_tags.hh @@ -194,16 +194,6 @@ Addr regenerateBlkAddr(const CacheBlk* blk) const override; /** - * Visit each sub-block in the tags and apply a visitor. - * - * The visitor should be a std::function that takes a cache block. - * reference as its parameter. - * - * @param visitor Visitor to call on each block. - */ - void forEachBlk(std::function<void(CacheBlk &)> visitor) override; - - /** * Find if any of the sub-blocks satisfies a condition. * * The visitor should be a std::function that takes a cache block -- To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/70998?usp=email To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings?usp=email Gerrit-MessageType: merged Gerrit-Project: public/gem5 Gerrit-Branch: develop Gerrit-Change-Id: I25527602535c719f46699677a7f70f3e31157f26 Gerrit-Change-Number: 70998 Gerrit-PatchSet: 2 Gerrit-Owner: Daniel Carvalho <odanrc@yahoo.com.br> Gerrit-Reviewer: Daniel Carvalho <odanrc@yahoo.com.br> Gerrit-Reviewer: Jason Lowe-Power <power.jg@gmail.com> Gerrit-Reviewer: Nikos Nikoleris <nikos.nikoleris@arm.com> Gerrit-Reviewer: kokoro <noreply+kokoro@google.com>