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

Change subject: base: Make bloom filter deletability a parameter
......................................................................

base: Make bloom filter deletability a parameter

Bloom Filters do not support deletion by default to avoid having
false negatives, however some systems may not have a problem
with having false negatives, and may benefit from deleting older
entries.

As such the missing deletion functions have been added.

Change-Id: I24f3f0a16d4743e6fb3c0fa76850996f258acb8f
Signed-off-by: Daniel R. Carvalho <[email protected]>
---
M src/base/filters/BloomFilters.py
M src/base/filters/base.hh
M src/base/filters/block_bloom_filter.cc
M src/base/filters/block_bloom_filter.hh
M src/base/filters/multi_bit_sel_bloom_filter.cc
M src/base/filters/multi_bit_sel_bloom_filter.hh
M src/base/filters/multi_bloom_filter.cc
M src/base/filters/multi_bloom_filter.hh
8 files changed, 44 insertions(+), 9 deletions(-)



diff --git a/src/base/filters/BloomFilters.py b/src/base/filters/BloomFilters.py
index 99cbb1d..967df06 100644
--- a/src/base/filters/BloomFilters.py
+++ b/src/base/filters/BloomFilters.py
@@ -45,6 +45,9 @@
     num_bits = Param.Int(1, "Number of bits in a filter entry")
threshold = Param.Int(1, "Value at which an entry is considered as set")

+    # By default bloom filters do not support deletion
+    deletable = Param.Bool(False, "Whether the filter supports deletion")
+
 class BloomFilterBlock(BloomFilterBase):
     type = 'BloomFilterBlock'
     cxx_class = 'BloomFilter::Block'
diff --git a/src/base/filters/base.hh b/src/base/filters/base.hh
index d5935dc..e0db698 100644
--- a/src/base/filters/base.hh
+++ b/src/base/filters/base.hh
@@ -68,6 +68,19 @@
/** Threshold at which a filter entry starts being considered as set. */
     const int setThreshold;

+    /** Whether filter entries can be deleted or not. */
+    const bool deletable;
+
+    /**
+     * Perform the filter specific function to clear the corresponding
+     * entries (can be multiple) of an address. By default a bloom filter
+     * does not support element deletion. Should be overridden by the
+     * classes that inherit from it.
+     *
+     * @param addr The address being parsed.
+     */
+    virtual void erase(Addr addr) {}
+
   public:
     /**
      * Create and clear the filter.
@@ -75,7 +88,8 @@
     Base(const BloomFilterBaseParams* p)
         : SimObject(p), blkBits(p->block_bits),
           filter(p->size, SatCounter(p->num_bits)),
-          sizeBits(floorLog2(p->size)), setThreshold(p->threshold)
+          sizeBits(floorLog2(p->size)), setThreshold(p->threshold),
+          deletable(p->deletable)
     {
         clear();
     }
@@ -115,13 +129,17 @@
     virtual void set(Addr addr) = 0;

     /**
-     * Perform the filter specific function to clear the corresponding
-     * entries (can be multiple) of an address. By default a bloom
-     * filter does not support element deletion.
+     * Unset the corresponding filter entries, if the filter is deletable.
      *
      * @param addr The address being parsed.
      */
-    virtual void unset(Addr addr) {};
+    void
+    unset(Addr addr)
+    {
+        if (deletable) {
+            erase(addr);
+        }
+    }

     /**
      * Check if the corresponding filter entries of an address should be
diff --git a/src/base/filters/block_bloom_filter.cc b/src/base/filters/block_bloom_filter.cc
index 00d7910..e3dd64b 100644
--- a/src/base/filters/block_bloom_filter.cc
+++ b/src/base/filters/block_bloom_filter.cc
@@ -74,7 +74,7 @@
 }

 void
-Block::unset(Addr addr)
+Block::erase(Addr addr)
 {
     filter[hash(addr)]--;
 }
diff --git a/src/base/filters/block_bloom_filter.hh b/src/base/filters/block_bloom_filter.hh
index fda05c5..55de559 100644
--- a/src/base/filters/block_bloom_filter.hh
+++ b/src/base/filters/block_bloom_filter.hh
@@ -61,9 +61,11 @@
     ~Block();

     void set(Addr addr) override;
-    void unset(Addr addr) override;
     int getCount(Addr addr) const override;

+  protected:
+    void erase(Addr addr) override;
+
   private:
     /**
      * XOR hash between two bitfields of an address. The address is divided
diff --git a/src/base/filters/multi_bit_sel_bloom_filter.cc b/src/base/filters/multi_bit_sel_bloom_filter.cc
index 873f6f7..d0dc1e6 100644
--- a/src/base/filters/multi_bit_sel_bloom_filter.cc
+++ b/src/base/filters/multi_bit_sel_bloom_filter.cc
@@ -70,6 +70,14 @@
     }
 }

+void
+MultiBitSel::erase(Addr addr)
+{
+    for (int i = 0; i < numHashes; i++) {
+        filter[hash(addr, i)]--;
+    }
+}
+
 int
 MultiBitSel::getCount(Addr addr) const
 {
diff --git a/src/base/filters/multi_bit_sel_bloom_filter.hh b/src/base/filters/multi_bit_sel_bloom_filter.hh
index 2d7402a..070ce33 100644
--- a/src/base/filters/multi_bit_sel_bloom_filter.hh
+++ b/src/base/filters/multi_bit_sel_bloom_filter.hh
@@ -80,6 +80,8 @@
     /** Whether hashing should be performed in parallel. */
     const bool isParallel;

+    void erase(Addr addr) override;
+
   private:
     /**
      * Bit offset from block number. Used to simulate bit selection hashing
diff --git a/src/base/filters/multi_bloom_filter.cc b/src/base/filters/multi_bloom_filter.cc
index a41680a..1123f09 100644
--- a/src/base/filters/multi_bloom_filter.cc
+++ b/src/base/filters/multi_bloom_filter.cc
@@ -85,7 +85,7 @@
 }

 void
-Multi::unset(Addr addr)
+Multi::erase(Addr addr)
 {
     for (auto& sub_filter : filters) {
         sub_filter->unset(addr);
diff --git a/src/base/filters/multi_bloom_filter.hh b/src/base/filters/multi_bloom_filter.hh
index 43cb94b..eaa2ca0 100644
--- a/src/base/filters/multi_bloom_filter.hh
+++ b/src/base/filters/multi_bloom_filter.hh
@@ -64,12 +64,14 @@

     void clear() override;
     void set(Addr addr) override;
-    void unset(Addr addr) override;

     void merge(const Base* other) override;
     int getCount(Addr addr) const override;
     int getTotalCount() const override;

+  protected:
+    void erase(Addr addr) override;
+
   private:
     /** Sub-filters used by this filter. */
     std::vector<Base*> filters;

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/18878
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: I24f3f0a16d4743e6fb3c0fa76850996f258acb8f
Gerrit-Change-Number: 18878
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