/** Number of bits needed to represent the size of the filter. */
const int sizeBits;
+ /** Threshold at which a filter entry starts being considered as set. */
+ const int setThreshold;
+
public:
/**
* Create and clear the filter.
+ *
+ * @param size The number of filter entries.
+ * @param threshold The threshold that limits a set entry.
*/
- AbstractBloomFilter(std::size_t size)
- : filter(size), sizeBits(floorLog2(size))
+ AbstractBloomFilter(std::size_t size, int threshold)
+ : filter(size), sizeBits(floorLog2(size)), setThreshold(threshold)
{
clear();
}
* @param addr The address being parsed.
* @return Whether the respective filter entry is set.
*/
- virtual bool isSet(Addr addr) = 0;
+ virtual bool
+ isSet(Addr addr) const
+ {
+ return getCount(addr) >= setThreshold;
+ }
/**
* Get the value stored in the corresponding filter entry of an address.
* @param addr The address being parsed.
* @param Get the value stored in the respective filter entry.
*/
- virtual int getCount(Addr addr) { return 0; }
+ virtual int getCount(Addr addr) const { return 0; }
/**
* Get the total value stored in the filter entries.
#include "mem/ruby/system/RubySystem.hh"
BlockBloomFilter::BlockBloomFilter(int size)
- : AbstractBloomFilter(size)
+ : AbstractBloomFilter(size, 1)
{
}
filter[hash(addr)] = 0;
}
-bool
-BlockBloomFilter::isSet(Addr addr)
-{
- return filter[hash(addr)];
-}
-
int
-BlockBloomFilter::getCount(Addr addr)
+BlockBloomFilter::getCount(Addr addr) const
{
return filter[hash(addr)];
}
void set(Addr addr) override;
void unset(Addr addr) override;
-
- bool isSet(Addr addr);
- int getCount(Addr addr);
+ int getCount(Addr addr) const override;
private:
int hash(Addr addr) const;
#include "mem/ruby/system/RubySystem.hh"
BulkBloomFilter::BulkBloomFilter(int size)
- : AbstractBloomFilter(size), sectorBits(sizeBits - 1)
+ : AbstractBloomFilter(size, 1), sectorBits(sizeBits - 1)
{
}
}
bool
-BulkBloomFilter::isSet(Addr addr)
+BulkBloomFilter::isSet(Addr addr) const
{
// c0 contains the cache index bits
const int filter_size = filter.size();
}
int
-BulkBloomFilter::getCount(Addr addr)
+BulkBloomFilter::getCount(Addr addr) const
{
- // not used
+ // TODO as in the multi-hashed filters
return 0;
}
void set(Addr addr) override;
- bool isSet(Addr addr);
- int getCount(Addr addr);
+ bool isSet(Addr addr) const override;
+ int getCount(Addr addr) const override;
private:
/** Permutes the address to generate its signature. */
};
H3BloomFilter::H3BloomFilter(int size, int num_hashes, bool parallel)
- : AbstractBloomFilter(size), numHashes(num_hashes), isParallel(parallel),
- parFilterSize(filter.size() / numHashes)
+ : AbstractBloomFilter(size, num_hashes), numHashes(num_hashes),
+ isParallel(parallel), parFilterSize(filter.size() / numHashes)
{
fatal_if(numHashes > 16, "There are only 16 hash functions implemented.");
}
}
}
-bool
-H3BloomFilter::isSet(Addr addr)
-{
- bool res = true;
-
- for (int i = 0; i < numHashes; i++) {
- int idx = hash(addr, i);
- res = res && filter[idx];
- }
- return res;
-}
-
int
-H3BloomFilter::getCount(Addr addr)
+H3BloomFilter::getCount(Addr addr) const
{
- return isSet(addr)? 1: 0;
+ int count = 0;
+ for (int i=0; i < numHashes; i++) {
+ count += filter[hash(addr, i)];
+ }
+ return count;
}
int
void merge(const AbstractBloomFilter* other) override;
void set(Addr addr) override;
- bool isSet(Addr addr);
- int getCount(Addr addr) override;
+ int getCount(Addr addr) const override;
private:
/**
LSB_CountingBloomFilter::LSB_CountingBloomFilter(std::size_t filter_size,
int max_value)
- : AbstractBloomFilter(filter_size), maxValue(max_value)
+ // Here we assume that isSet will return true only when the counter
+ // saturates
+ : AbstractBloomFilter(filter_size, max_value), maxValue(max_value)
{
}
filter[i] -= 1;
}
-bool
-LSB_CountingBloomFilter::isSet(Addr addr)
-{
- // TODO
- return false;
-}
-
int
-LSB_CountingBloomFilter::getCount(Addr addr)
+LSB_CountingBloomFilter::getCount(Addr addr) const
{
return filter[hash(addr)];
}
void set(Addr addr) override;
void unset(Addr addr) override;
- bool isSet(Addr addr);
- int getCount(Addr addr);
+ int getCount(Addr addr) const override;
private:
int hash(Addr addr) const;
MultiBitSelBloomFilter::MultiBitSelBloomFilter(std::size_t filter_size,
int num_hashes, int skip_bits, bool is_parallel)
- : AbstractBloomFilter(filter_size), numHashes(num_hashes),
+ : AbstractBloomFilter(filter_size, num_hashes), numHashes(num_hashes),
skipBits(skip_bits),
parFilterSize(filter_size / numHashes),
isParallel(is_parallel)
}
}
-bool
-MultiBitSelBloomFilter::isSet(Addr addr)
+int
+MultiBitSelBloomFilter::getCount(Addr addr) const
{
- bool res = true;
-
+ int count = 0;
for (int i=0; i < numHashes; i++) {
- int idx = hash(addr, i);
- res = res && filter[idx];
+ count += filter[hash(addr, i)];
}
- return res;
-}
-
-int
-MultiBitSelBloomFilter::getCount(Addr addr)
-{
- return isSet(addr)? 1: 0;
+ return count;
}
int
void merge(const AbstractBloomFilter* other) override;
void set(Addr addr) override;
- bool isSet(Addr addr);
- int getCount(Addr addr);
+ int getCount(Addr addr) const override;
private:
int hash(Addr addr, int hash_number) const;
#include "mem/ruby/system/RubySystem.hh"
MultiGrainBloomFilter::MultiGrainBloomFilter(int head, int tail)
- : AbstractBloomFilter(head),
+ : AbstractBloomFilter(head, 2),
pageFilter(tail), pageFilterSizeBits(floorLog2(tail))
{
}
}
-bool
-MultiGrainBloomFilter::isSet(Addr addr)
+int
+MultiGrainBloomFilter::getCount(Addr addr) const
{
int i = hash(addr);
assert(i < filter.size());
assert(pageHash(addr) < pageFilter.size());
- // we have to have both indices set
- return (filter[i] && pageFilter[i]);
-}
-
-int
-MultiGrainBloomFilter::getCount(Addr addr)
-{
- // not used
- return 0;
+ return filter[i] + pageFilter[i];
}
int
void clear() override;
void set(Addr addr) override;
- bool isSet(Addr addr);
- int getCount(Addr addr);
+ int getCount(Addr addr) const override;
int getTotalCount() const override;
private:
#include "mem/ruby/system/RubySystem.hh"
NonCountingBloomFilter::NonCountingBloomFilter(std::size_t size, int skip_bits)
- : AbstractBloomFilter(size), skipBits(skip_bits)
+ : AbstractBloomFilter(size, 1), skipBits(skip_bits)
{
}
filter[hash(addr)] = 0;
}
-bool
-NonCountingBloomFilter::isSet(Addr addr)
-{
- return filter[hash(addr)];
-}
-
-
int
-NonCountingBloomFilter::getCount(Addr addr)
+NonCountingBloomFilter::getCount(Addr addr) const
{
return filter[hash(addr)];
}
void set(Addr addr) override;
void unset(Addr addr) override;
- bool isSet(Addr addr);
- int getCount(Addr addr);
+ int getCount(Addr addr) const override;
private:
int hash(Addr addr) const;