2 * Copyright (c) 2013-2015 Advanced Micro Devices, Inc.
5 * For use for simulation and test purposes only
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
10 * 1. Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright notice,
14 * this list of conditions and the following disclaimer in the documentation
15 * and/or other materials provided with the distribution.
17 * 3. Neither the name of the copyright holder nor the names of its
18 * contributors may be used to endorse or promote products derived from this
19 * software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
34 #include "mem/cache/replacement_policies/weighted_lru_rp.hh"
38 #include "params/WeightedLRURP.hh"
39 #include "sim/core.hh"
41 WeightedLRUPolicy::WeightedLRUPolicy(const Params
* p
)
42 : BaseReplacementPolicy(p
)
47 WeightedLRURPParams::create()
49 return new WeightedLRUPolicy(this);
53 WeightedLRUPolicy::touch(const std::shared_ptr
<ReplacementData
>&
54 replacement_data
) const
56 std::static_pointer_cast
<WeightedLRUReplData
>(replacement_data
)->
57 last_touch_tick
= curTick();
61 WeightedLRUPolicy::touch(const std::shared_ptr
<ReplacementData
>&
62 replacement_data
, int occupancy
) const
64 std::static_pointer_cast
<WeightedLRUReplData
>(replacement_data
)->
65 last_touch_tick
= curTick();
66 std::static_pointer_cast
<WeightedLRUReplData
>(replacement_data
)->
67 last_occ_ptr
= occupancy
;
71 WeightedLRUPolicy::getVictim(const ReplacementCandidates
& candidates
) const
73 assert(candidates
.size() > 0);
75 ReplaceableEntry
* victim
= candidates
[0];
76 // Use weight (last_occ_ptr) to find victim.
77 // Evict the block that has the smallest weight.
78 // If two blocks have the same weight, evict the oldest one.
79 for (const auto& candidate
: candidates
) {
80 // candidate's replacement_data
81 std::shared_ptr
<WeightedLRUReplData
> candidate_replacement_data
=
82 std::static_pointer_cast
<WeightedLRUReplData
>(
83 candidate
->replacementData
);
84 // victim's replacement_data
85 std::shared_ptr
<WeightedLRUReplData
> victim_replacement_data
=
86 std::static_pointer_cast
<WeightedLRUReplData
>(
87 victim
->replacementData
);
89 if (candidate_replacement_data
->last_occ_ptr
<
90 victim_replacement_data
->last_occ_ptr
) {
92 } else if (candidate_replacement_data
->last_occ_ptr
==
93 victim_replacement_data
->last_occ_ptr
) {
94 // Evict the block with a smaller tick.
95 Tick time
= candidate_replacement_data
->last_touch_tick
;
96 if (time
< victim_replacement_data
->last_touch_tick
) {
104 std::shared_ptr
<ReplacementData
>
105 WeightedLRUPolicy::instantiateEntry()
107 return std::shared_ptr
<ReplacementData
>(new WeightedLRUReplData
);
111 WeightedLRUPolicy::reset(const std::shared_ptr
<ReplacementData
>&
112 replacement_data
) const
114 // Set last touch timestamp
115 std::static_pointer_cast
<WeightedLRUReplData
>(
116 replacement_data
)->last_touch_tick
= curTick();
120 WeightedLRUPolicy::invalidate(const std::shared_ptr
<ReplacementData
>&
121 replacement_data
) const
123 // Reset last touch timestamp
124 std::static_pointer_cast
<WeightedLRUReplData
>(
125 replacement_data
)->last_touch_tick
= Tick(0);