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 <odanrc@yahoo.com.br> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18872 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com> Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
This commit is contained in:
committed by
Daniel Carvalho
parent
a6643d6174
commit
8d482dfeb6
@@ -76,8 +76,20 @@ class AbstractBloomFilter : public SimObject
|
||||
}
|
||||
}
|
||||
|
||||
/** 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
|
||||
|
||||
@@ -367,16 +367,6 @@ H3BloomFilter::~H3BloomFilter()
|
||||
{
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -43,7 +43,6 @@ class H3BloomFilter : public AbstractBloomFilter
|
||||
H3BloomFilter(const H3BloomFilterParams* p);
|
||||
~H3BloomFilter();
|
||||
|
||||
void merge(const AbstractBloomFilter* other) override;
|
||||
void set(Addr addr) override;
|
||||
int getCount(Addr addr) const override;
|
||||
|
||||
|
||||
@@ -41,6 +41,20 @@ LSB_CountingBloomFilter::~LSB_CountingBloomFilter()
|
||||
{
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -39,6 +39,7 @@ class LSB_CountingBloomFilter : public AbstractBloomFilter
|
||||
LSB_CountingBloomFilter(const LSB_CountingBloomFilterParams* p);
|
||||
~LSB_CountingBloomFilter();
|
||||
|
||||
void merge(const AbstractBloomFilter* other) override;
|
||||
void set(Addr addr) override;
|
||||
void unset(Addr addr) override;
|
||||
|
||||
|
||||
@@ -46,16 +46,6 @@ MultiBitSelBloomFilter::~MultiBitSelBloomFilter()
|
||||
{
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -39,7 +39,6 @@ class MultiBitSelBloomFilter : public AbstractBloomFilter
|
||||
MultiBitSelBloomFilter(const MultiBitSelBloomFilterParams* p);
|
||||
~MultiBitSelBloomFilter();
|
||||
|
||||
void merge(const AbstractBloomFilter* other) override;
|
||||
void set(Addr addr) override;
|
||||
int getCount(Addr addr) const override;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user