Daniel Carvalho has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/18872

Change subject: mem-ruby: Finish implementing BloomFilter merge
......................................................................

mem-ruby: Finish implementing BloomFilter merge

Not all Bloom Filters had their union functionality implemented.
This change adds them.

Change-Id: I86af18d3c5eabd0da8280b57a88789b3af803c04
Signed-off-by: Daniel R. Carvalho <[email protected]>
---
M src/mem/ruby/filters/AbstractBloomFilter.hh
M src/mem/ruby/filters/H3BloomFilter.cc
M src/mem/ruby/filters/H3BloomFilter.hh
M src/mem/ruby/filters/LSB_CountingBloomFilter.cc
M src/mem/ruby/filters/LSB_CountingBloomFilter.hh
M src/mem/ruby/filters/MultiBitSelBloomFilter.cc
M src/mem/ruby/filters/MultiBitSelBloomFilter.hh
7 files changed, 29 insertions(+), 24 deletions(-)



diff --git a/src/mem/ruby/filters/AbstractBloomFilter.hh b/src/mem/ruby/filters/AbstractBloomFilter.hh
index 79f9858..1c47da3 100644
--- a/src/mem/ruby/filters/AbstractBloomFilter.hh
+++ b/src/mem/ruby/filters/AbstractBloomFilter.hh
@@ -87,8 +87,20 @@
         }
     }

-    /** Merges the contents of both filters into this'. */
-    virtual void merge(const AbstractBloomFilter* other) {}
+    /**
+     * Merges the contents of both filters into this' (Bloom Filter union).
+     * Both must have the same number of entries.
+     *
+     * @param other The other bloom filter to merge with.
+     */
+    virtual void
+    merge(const AbstractBloomFilter* other)
+    {
+        assert(filter.size() == other->filter.size());
+        for (int i = 0; i < filter.size(); ++i){
+            filter[i] |= other->filter[i];
+        }
+    }

     /**
      * Perform the filter specific function to set the corresponding
diff --git a/src/mem/ruby/filters/H3BloomFilter.cc b/src/mem/ruby/filters/H3BloomFilter.cc
index fd4cc68..68a377a 100644
--- a/src/mem/ruby/filters/H3BloomFilter.cc
+++ b/src/mem/ruby/filters/H3BloomFilter.cc
@@ -366,16 +366,6 @@
 }

 void
-H3BloomFilter::merge(const AbstractBloomFilter *other)
-{
-    auto* cast_other = static_cast<const H3BloomFilter*>(other);
-    assert(filter.size() == cast_other->filter.size());
-    for (int i = 0; i < filter.size(); ++i){
-        filter[i] |= cast_other->filter[i];
-    }
-}
-
-void
 H3BloomFilter::set(Addr addr)
 {
     for (int i = 0; i < numHashes; i++) {
diff --git a/src/mem/ruby/filters/H3BloomFilter.hh b/src/mem/ruby/filters/H3BloomFilter.hh
index 3752a82..53e7752 100644
--- a/src/mem/ruby/filters/H3BloomFilter.hh
+++ b/src/mem/ruby/filters/H3BloomFilter.hh
@@ -43,7 +43,6 @@
     H3BloomFilter(const H3BloomFilterParams* p);
     ~H3BloomFilter();

-    void merge(const AbstractBloomFilter* other) override;
     void set(Addr addr) override;
     int getCount(Addr addr) const override;

diff --git a/src/mem/ruby/filters/LSB_CountingBloomFilter.cc b/src/mem/ruby/filters/LSB_CountingBloomFilter.cc
index 150da11..3493181 100644
--- a/src/mem/ruby/filters/LSB_CountingBloomFilter.cc
+++ b/src/mem/ruby/filters/LSB_CountingBloomFilter.cc
@@ -42,6 +42,20 @@
 }

 void
+LSB_CountingBloomFilter::merge(const AbstractBloomFilter* other)
+{
+    auto* cast_other = static_cast<const LSB_CountingBloomFilter*>(other);
+    assert(filter.size() == cast_other->filter.size());
+    for (int i = 0; i < filter.size(); ++i){
+        if (filter[i] < maxValue - cast_other->filter[i]) {
+            filter[i] += cast_other->filter[i];
+        } else {
+            filter[i] = maxValue;
+        }
+    }
+}
+
+void
 LSB_CountingBloomFilter::set(Addr addr)
 {
     const int i = hash(addr);
diff --git a/src/mem/ruby/filters/LSB_CountingBloomFilter.hh b/src/mem/ruby/filters/LSB_CountingBloomFilter.hh
index 4bc0441..410f22d 100644
--- a/src/mem/ruby/filters/LSB_CountingBloomFilter.hh
+++ b/src/mem/ruby/filters/LSB_CountingBloomFilter.hh
@@ -39,6 +39,7 @@
     LSB_CountingBloomFilter(const LSB_CountingBloomFilterParams* p);
     ~LSB_CountingBloomFilter();

+    void merge(const AbstractBloomFilter* other) override;
     void set(Addr addr) override;
     void unset(Addr addr) override;

diff --git a/src/mem/ruby/filters/MultiBitSelBloomFilter.cc b/src/mem/ruby/filters/MultiBitSelBloomFilter.cc
index 5f6b2a6..e777945 100644
--- a/src/mem/ruby/filters/MultiBitSelBloomFilter.cc
+++ b/src/mem/ruby/filters/MultiBitSelBloomFilter.cc
@@ -45,16 +45,6 @@
 }

 void
-MultiBitSelBloomFilter::merge(const AbstractBloomFilter *other)
-{
-    auto cast_other = static_cast<const MultiBitSelBloomFilter*>(other);
-    assert(filter.size() == cast_other->filter.size());
-    for (int i = 0; i < filter.size(); ++i){
-        filter[i] |= cast_other->filter[i];
-    }
-}
-
-void
 MultiBitSelBloomFilter::set(Addr addr)
 {
     for (int i = 0; i < numHashes; i++) {
diff --git a/src/mem/ruby/filters/MultiBitSelBloomFilter.hh b/src/mem/ruby/filters/MultiBitSelBloomFilter.hh
index 501483d..42ba94c 100644
--- a/src/mem/ruby/filters/MultiBitSelBloomFilter.hh
+++ b/src/mem/ruby/filters/MultiBitSelBloomFilter.hh
@@ -39,7 +39,6 @@
     MultiBitSelBloomFilter(const MultiBitSelBloomFilterParams* p);
     ~MultiBitSelBloomFilter();

-    void merge(const AbstractBloomFilter* other) override;
     void set(Addr addr) override;
     int getCount(Addr addr) const override;


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

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I86af18d3c5eabd0da8280b57a88789b3af803c04
Gerrit-Change-Number: 18872
Gerrit-PatchSet: 1
Gerrit-Owner: Daniel Carvalho <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to