17 #ifndef MSL_LRU_TABLE_H
18 #define MSL_LRU_TABLE_H
44 template <
typename T,
typename SetProj = detail::table_indexer<T>,
typename TagProj = detail::table_tagger<T>>
66 using diff_type =
typename block_vec_type::difference_type;
68 auto set_begin = std::next(std::begin(
block), set_idx *
static_cast<diff_type
>(
NUM_WAY));
69 auto set_end = std::next(set_begin,
static_cast<diff_type
>(
NUM_WAY));
70 return std::pair{set_begin, set_end};
76 return x.last_used > 0 && proj(x.data) == tag;
83 return [tag, proj = this->
tag_projection](
const auto& x,
const auto& y) {
84 auto x_valid = x.last_used > 0;
85 auto y_valid = y.last_used > 0;
86 auto x_match = proj(x.data) == tag;
87 auto y_match = proj(y.data) == tag;
88 auto cmp_lru = x.last_used < y.last_used;
89 return !x_valid || (y_valid && ((!x_match && y_match) || ((x_match == y_match) && cmp_lru)));
97 auto hit = std::find_if(set_begin, set_end,
match_func(elem));
110 if (set_begin != set_end) {
111 auto [miss, hit] = std::minmax_element(set_begin, set_end,
match_and_check(tag));
123 auto hit = std::find_if(set_begin, set_end,
match_func(elem));
128 return std::exchange(*hit, {}).data;
131 lru_table(std::size_t sets, std::size_t ways, SetProj set_proj, TagProj tag_proj)
134 assert(sets == 0 || sets == (1ull <<
lg2(sets)));
137 lru_table(std::size_t sets, std::size_t ways, SetProj set_proj) :
lru_table(sets, ways, set_proj, {}) {}
Definition: lru_table.h:46
SetProj set_projection
Definition: lru_table.h:57
T value_type
Definition: lru_table.h:48
TagProj tag_projection
Definition: lru_table.h:58
uint64_t access_count
Definition: lru_table.h:61
block_vec_type block
Definition: lru_table.h:62
lru_table(std::size_t sets, std::size_t ways, SetProj set_proj, TagProj tag_proj)
Definition: lru_table.h:131
std::optional< value_type > check_hit(const value_type &elem)
Definition: lru_table.h:94
std::size_t NUM_WAY
Definition: lru_table.h:60
std::optional< value_type > invalidate(const value_type &elem)
Definition: lru_table.h:120
void fill(const value_type &elem)
Definition: lru_table.h:106
std::vector< block_t > block_vec_type
Definition: lru_table.h:55
lru_table(std::size_t sets, std::size_t ways)
Definition: lru_table.h:138
std::size_t NUM_SET
Definition: lru_table.h:60
auto get_set_span(const value_type &elem)
Definition: lru_table.h:64
auto match_and_check(U tag)
Definition: lru_table.h:81
lru_table(std::size_t sets, std::size_t ways, SetProj set_proj)
Definition: lru_table.h:137
auto match_func(const value_type &elem)
Definition: lru_table.h:73
constexpr uint64_t bitmask(std::size_t begin, std::size_t end=0)
Definition: bits.h:27
constexpr unsigned lg2(uint64_t n)
Definition: bits.h:25
Definition: lru_table.h:34
auto operator()(const T &t) const
Definition: lru_table.h:35
Definition: lru_table.h:39
auto operator()(const T &t) const
Definition: lru_table.h:40
Definition: lru_table.h:51
uint64_t last_used
Definition: lru_table.h:52
value_type data
Definition: lru_table.h:53