misc: Updated the RELEASE-NOTES and version number
[gem5.git] / src / mem / cache / replacement_policies / weighted_lru_rp.cc
1 /*
2 * Copyright (c) 2013-2015 Advanced Micro Devices, Inc.
3 * All rights reserved.
4 *
5 * For use for simulation and test purposes only
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 *
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.
16 *
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.
20 *
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.
32 */
33
34 #include "mem/cache/replacement_policies/weighted_lru_rp.hh"
35
36 #include <cassert>
37
38 #include "params/WeightedLRURP.hh"
39 #include "sim/core.hh"
40
41 WeightedLRUPolicy::WeightedLRUPolicy(const Params* p)
42 : BaseReplacementPolicy(p)
43 {
44 }
45
46 WeightedLRUPolicy *
47 WeightedLRURPParams::create()
48 {
49 return new WeightedLRUPolicy(this);
50 }
51
52 void
53 WeightedLRUPolicy::touch(const std::shared_ptr<ReplacementData>&
54 replacement_data) const
55 {
56 std::static_pointer_cast<WeightedLRUReplData>(replacement_data)->
57 last_touch_tick = curTick();
58 }
59
60 void
61 WeightedLRUPolicy::touch(const std::shared_ptr<ReplacementData>&
62 replacement_data, int occupancy) const
63 {
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;
68 }
69
70 ReplaceableEntry*
71 WeightedLRUPolicy::getVictim(const ReplacementCandidates& candidates) const
72 {
73 assert(candidates.size() > 0);
74
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);
88
89 if (candidate_replacement_data->last_occ_ptr <
90 victim_replacement_data->last_occ_ptr) {
91 victim = candidate;
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) {
97 victim = candidate;
98 }
99 }
100 }
101 return victim;
102 }
103
104 std::shared_ptr<ReplacementData>
105 WeightedLRUPolicy::instantiateEntry()
106 {
107 return std::shared_ptr<ReplacementData>(new WeightedLRUReplData);
108 }
109
110 void
111 WeightedLRUPolicy::reset(const std::shared_ptr<ReplacementData>&
112 replacement_data) const
113 {
114 // Set last touch timestamp
115 std::static_pointer_cast<WeightedLRUReplData>(
116 replacement_data)->last_touch_tick = curTick();
117 }
118
119 void
120 WeightedLRUPolicy::invalidate(const std::shared_ptr<ReplacementData>&
121 replacement_data) const
122 {
123 // Reset last touch timestamp
124 std::static_pointer_cast<WeightedLRUReplData>(
125 replacement_data)->last_touch_tick = Tick(0);
126 }