Skip to content

Commit f2eed78

Browse files
authored
Merge branch 'master' into jdupak-patch-1
2 parents 9d857af + d2b10ed commit f2eed78

File tree

5 files changed

+63
-4
lines changed

5 files changed

+63
-4
lines changed

src/gui/dialogs/new/NewDialogCache.ui

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@
9797
<string>Pseudo Least Recently Used (PLRU)</string>
9898
</property>
9999
</item>
100+
<item>
101+
<property name="text">
102+
<string>Not Most Recently Used (NMRU)</string>
103+
</property>
104+
</item>
100105
</widget>
101106
</item>
102107
<item row="4" column="0">

src/machine/machineconfig.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ class CacheConfig {
4646
RP_RAND, // Random
4747
RP_LRU, // Least recently used
4848
RP_LFU, // Least frequently used
49-
RP_PLRU // Pseudo Least recently used
49+
RP_PLRU, // Pseudo Least recently used
50+
RP_NMRU // Not most recently used
5051
};
5152

5253
enum WritePolicy {

src/machine/memory/cache/cache.test.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ constexpr array<uint64_t, 1> values { 0x4142434445464748 };
3434
* Cache configuration parameters for testing
3535
* (all combinations are tested)
3636
*/
37-
constexpr array<CacheConfig::ReplacementPolicy, 4> replacement_policies {
38-
CacheConfig::RP_RAND, CacheConfig::RP_LFU, CacheConfig::RP_LRU, CacheConfig::RP_PLRU
37+
constexpr array<CacheConfig::ReplacementPolicy, 5> replacement_policies {
38+
CacheConfig::RP_RAND, CacheConfig::RP_LFU, CacheConfig::RP_LRU, CacheConfig::RP_PLRU, CacheConfig::RP_NMRU
3939
};
4040
constexpr array<CacheConfig::WritePolicy, 3> write_policies {
4141
CacheConfig::WP_THROUGH_NOALLOC, // THIS
@@ -242,7 +242,7 @@ void TestCache::cache_correctness() {
242242
// stderr, "{ %d, %d }, ", cache.get_hit_count(),
243243
// cache.get_miss_count());
244244

245-
if (cache_config.replacement_policy() != CacheConfig::RP_RAND) {
245+
if ((cache_config.replacement_policy() != CacheConfig::RP_RAND) && (cache_config.replacement_policy() != CacheConfig::RP_NMRU)) {
246246
// Performance of random policy is implementation dependant and
247247
// meaningless.
248248
QCOMPARE(performance, cache_test_performance_data.at(case_number));

src/machine/memory/cache/cache_policy.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ CachePolicy::get_policy_instance(const CacheConfig *config) {
2222
config->associativity(), config->set_count());
2323
case CacheConfig::RP_PLRU:
2424
return std::make_unique<CachePolicyPLRU>(config->associativity(), config->set_count());
25+
case CacheConfig::RP_NMRU:
26+
return std::make_unique<CachePolicyNMRU>(config->associativity(), config->set_count());
2527
}
2628
} else {
2729
// Disabled cache will never use it.
@@ -172,4 +174,29 @@ size_t CachePolicyPLRU::select_way_to_evict(size_t row) const {
172174
}
173175
return (idx >= associativity) ? (associativity - 1) : idx;
174176
}
177+
178+
CachePolicyNMRU::CachePolicyNMRU(size_t associativity, size_t set_count)
179+
: associativity(associativity) {
180+
mru_ptr.resize(set_count);
181+
for (auto &row : mru_ptr) {
182+
row = 0; // Initially point to block 0
183+
}
184+
std::srand(1); // NOLINT(cert-msc51-cpp)
185+
}
186+
187+
void CachePolicyNMRU::update_stats(size_t way, size_t row, bool is_valid) {
188+
UNUSED(is_valid)
189+
auto &row_ptr = mru_ptr.at(row); // Set currently accessed block to most recently used
190+
row_ptr = way;
191+
}
192+
193+
size_t CachePolicyNMRU::select_way_to_evict(size_t row) const {
194+
if(associativity == 1) {
195+
return 0;
196+
}
197+
uint32_t idx = std::rand() % (associativity - 1);
198+
auto &row_ptr = mru_ptr.at(row);
199+
idx = (idx < row_ptr) ? idx : idx + 1;
200+
return idx;
201+
}
175202
} // namespace machine

src/machine/memory/cache/cache_policy.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,32 @@ class CachePolicyPLRU final : public CachePolicy {
129129
const size_t associativityCLog2;
130130
};
131131

132+
/**
133+
* Not Most Recently Used
134+
*
135+
* Select Randomly from Not Most
136+
* Recently Used Blocks
137+
*/
138+
class CachePolicyNMRU final : public CachePolicy {
139+
public:
140+
/**
141+
* @param associativity degree of assiciaivity
142+
* @param set_count number of blocks / rows in a way (or sets in
143+
* cache)
144+
*/
145+
CachePolicyNMRU(size_t associativity, size_t set_count);
146+
147+
[[nodiscard]] size_t select_way_to_evict(size_t row) const final;
148+
149+
void update_stats(size_t way, size_t row, bool is_valid) final;
150+
151+
private:
152+
/**
153+
* Pointer to Most Recently Used Block
154+
*/
155+
std::vector<uint32_t> mru_ptr;
156+
const size_t associativity;
157+
};
132158
} // namespace machine
133159

134160
#endif // CACHE_POLICY_H

0 commit comments

Comments
 (0)