Move the WeightedLRUReplacementPolicy to the replacement policies folder.
Change-Id: I9902faefb6de33343bb65f994be70bd9e1dd4e14
Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/22445
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: John Alsop <johnathan.alsop@amd.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
cxx_class = 'TreePLRURP'
cxx_header = "mem/cache/replacement_policies/tree_plru_rp.hh"
num_leaves = Param.Int(Parent.assoc, "Number of leaves in each tree")
+
+class WeightedLRURP(BaseReplacementPolicy):
+ type = "WeightedLRURP"
+ cxx_class = "WeightedLRUPolicy"
+ cxx_header = "mem/cache/replacement_policies/weighted_lru_rp.hh"
Source('random_rp.cc')
Source('second_chance_rp.cc')
Source('tree_plru_rp.cc')
+Source('weighted_lru_rp.cc')
--- /dev/null
+/*
+ * Copyright (c) 2013-2015 Advanced Micro Devices, Inc.
+ * All rights reserved.
+ *
+ * For use for simulation and test purposes only
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Derek Hower
+ */
+
+#include "mem/cache/replacement_policies/weighted_lru_rp.hh"
+
+#include <cassert>
+
+#include "params/WeightedLRURP.hh"
+
+WeightedLRUPolicy::WeightedLRUPolicy(const Params* p)
+ : BaseReplacementPolicy(p)
+{
+}
+
+WeightedLRUPolicy *
+WeightedLRURPParams::create()
+{
+ return new WeightedLRUPolicy(this);
+}
+
+void
+WeightedLRUPolicy::touch(const std::shared_ptr<ReplacementData>&
+ replacement_data) const
+{
+ std::static_pointer_cast<WeightedLRUReplData>(replacement_data)->
+ last_touch_tick = curTick();
+}
+
+void
+WeightedLRUPolicy::touch(const std::shared_ptr<ReplacementData>&
+ replacement_data, int occupancy) const
+{
+ std::static_pointer_cast<WeightedLRUReplData>(replacement_data)->
+ last_touch_tick = curTick();
+ std::static_pointer_cast<WeightedLRUReplData>(replacement_data)->
+ last_occ_ptr = occupancy;
+}
+
+ReplaceableEntry*
+WeightedLRUPolicy::getVictim(const ReplacementCandidates& candidates) const
+{
+ assert(candidates.size() > 0);
+
+ ReplaceableEntry* victim = candidates[0];
+ // Use weight (last_occ_ptr) to find victim.
+ // Evict the block that has the smallest weight.
+ // If two blocks have the same weight, evict the oldest one.
+ for (const auto& candidate : candidates) {
+ // candidate's replacement_data
+ std::shared_ptr<WeightedLRUReplData> candidate_replacement_data =
+ std::static_pointer_cast<WeightedLRUReplData>(
+ candidate->replacementData);
+ // victim's replacement_data
+ std::shared_ptr<WeightedLRUReplData> victim_replacement_data =
+ std::static_pointer_cast<WeightedLRUReplData>(
+ victim->replacementData);
+
+ if (candidate_replacement_data->last_occ_ptr <
+ victim_replacement_data->last_occ_ptr) {
+ victim = candidate;
+ } else if (candidate_replacement_data->last_occ_ptr ==
+ victim_replacement_data->last_occ_ptr) {
+ // Evict the block with a smaller tick.
+ Tick time = candidate_replacement_data->last_touch_tick;
+ if (time < victim_replacement_data->last_touch_tick) {
+ victim = candidate;
+ }
+ }
+ }
+ return victim;
+}
+
+std::shared_ptr<ReplacementData>
+WeightedLRUPolicy::instantiateEntry()
+{
+ return std::shared_ptr<ReplacementData>(new WeightedLRUReplData);
+}
+
+void
+WeightedLRUPolicy::reset(const std::shared_ptr<ReplacementData>&
+ replacement_data) const
+{
+ // Set last touch timestamp
+ std::static_pointer_cast<WeightedLRUReplData>(
+ replacement_data)->last_touch_tick = curTick();
+}
+
+void
+WeightedLRUPolicy::invalidate(const std::shared_ptr<ReplacementData>&
+ replacement_data) const
+{
+ // Reset last touch timestamp
+ std::static_pointer_cast<WeightedLRUReplData>(
+ replacement_data)->last_touch_tick = Tick(0);
+}
--- /dev/null
+/*
+ * Copyright (c) 2013-2015 Advanced Micro Devices, Inc.
+ * All rights reserved.
+ *
+ * For use for simulation and test purposes only
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Sooraj Puthoor
+ */
+
+#ifndef __MEM_CACHE_REPLACEMENT_POLICIES_WEIGHTED_LRU_RP_HH__
+#define __MEM_CACHE_REPLACEMENT_POLICIES_WEIGHTED_LRU_RP_HH__
+
+#include <memory>
+
+#include "base/types.hh"
+#include "mem/cache/replacement_policies/base.hh"
+
+struct WeightedLRURPParams;
+
+class WeightedLRUPolicy : public BaseReplacementPolicy
+{
+ protected:
+ /** Weighted LRU implementation of replacement data. */
+ struct WeightedLRUReplData : ReplacementData
+ {
+ /** pointer for last occupancy */
+ int last_occ_ptr;
+
+ /** Tick on which the entry was last touched. */
+ Tick last_touch_tick;
+
+ /**
+ * Default constructor. Invalidate data.
+ */
+ WeightedLRUReplData() : ReplacementData(),
+ last_occ_ptr(0), last_touch_tick(0) {}
+ };
+ public:
+ typedef WeightedLRURPParams Params;
+ WeightedLRUPolicy(const Params* p);
+ ~WeightedLRUPolicy() {}
+
+ /**
+ * Invalidate replacement data to set it as the next probable victim.
+ * Sets its last touch tick as the starting tick.
+ *
+ * @param replacement_data Replacement data to be invalidated.
+ */
+ void invalidate(const std::shared_ptr<ReplacementData>& replacement_data)
+ const override;
+ /**
+ * Touch an entry to update its replacement data.
+ * Sets its last touch tick as the current tick.
+ *
+ * @param replacement_data Replacement data to be touched.
+ */
+ void touch(const std::shared_ptr<ReplacementData>&
+ replacement_data) const override;
+ void touch(const std::shared_ptr<ReplacementData>& replacement_data,
+ int occupancy) const;
+
+ /**
+ * Reset replacement data. Used when an entry is inserted.
+ * Sets its last touch tick as the current tick.
+ *
+ * @param replacement_data Replacement data to be reset.
+ */
+ void reset(const std::shared_ptr<ReplacementData>& replacement_data) const
+ override;
+
+ /**
+ * Instantiate a replacement data entry.
+ *
+ * @return A shared pointer to the new replacement data.
+ */
+ std::shared_ptr<ReplacementData> instantiateEntry() override;
+
+ /**
+ * Find replacement victim using weight.
+ *
+ * @param candidates Replacement candidates, selected by indexing policy.
+ * @return Replacement entry to be replaced.
+ */
+ ReplaceableEntry* getVictim(const ReplacementCandidates&
+ candidates) const override;
+};
+
+#endif // __MEM_CACHE_REPLACEMENT_POLICIES_WEIGHTED_LRU_RP_HH__
#include "debug/RubyCacheTrace.hh"
#include "debug/RubyResourceStalls.hh"
#include "debug/RubyStats.hh"
+#include "mem/cache/replacement_policies/weighted_lru_rp.hh"
#include "mem/ruby/protocol/AccessPermission.hh"
#include "mem/ruby/system/RubySystem.hh"
-#include "mem/ruby/system/WeightedLRUPolicy.hh"
using namespace std;
SimObject('GPUCoalescer.py')
SimObject('RubySystem.py')
SimObject('Sequencer.py')
-SimObject('WeightedLRUReplacementPolicy.py')
if env['BUILD_GPU']:
SimObject('VIPERCoalescer.py')
Source('Sequencer.cc')
if env['BUILD_GPU']:
Source('VIPERCoalescer.cc')
-Source('WeightedLRUPolicy.cc')
+++ /dev/null
-/*
- * Copyright (c) 2013-2015 Advanced Micro Devices, Inc.
- * All rights reserved.
- *
- * For use for simulation and test purposes only
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the copyright holder nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Derek Hower
- */
-
-#include "mem/ruby/system/WeightedLRUPolicy.hh"
-
-#include <cassert>
-#include <memory>
-
-WeightedLRUPolicy::WeightedLRUPolicy(const Params* p)
- : BaseReplacementPolicy(p)
-{
-}
-
-WeightedLRUPolicy *
-WeightedLRUReplacementPolicyParams::create()
-{
- return new WeightedLRUPolicy(this);
-}
-
-void
-WeightedLRUPolicy::touch(const std::shared_ptr<ReplacementData>&
- replacement_data) const
-{
- std::static_pointer_cast<WeightedLRUReplData>(replacement_data)->
- last_touch_tick = curTick();
-}
-
-void
-WeightedLRUPolicy::touch(const std::shared_ptr<ReplacementData>&
- replacement_data, int occupancy) const
-{
- std::static_pointer_cast<WeightedLRUReplData>(replacement_data)->
- last_touch_tick = curTick();
- std::static_pointer_cast<WeightedLRUReplData>(replacement_data)->
- last_occ_ptr = occupancy;
-}
-
-ReplaceableEntry*
-WeightedLRUPolicy::getVictim(const ReplacementCandidates& candidates) const
-{
- assert(candidates.size() > 0);
-
- ReplaceableEntry* victim = candidates[0];
- // Use weight (last_occ_ptr) to find victim.
- // Evict the block that has the smallest weight.
- // If two blocks have the same weight, evict the oldest one.
- for (const auto& candidate : candidates) {
- // candidate's replacement_data
- std::shared_ptr<WeightedLRUReplData> candidate_replacement_data =
- std::static_pointer_cast<WeightedLRUReplData>(
- candidate->replacementData);
- // victim's replacement_data
- std::shared_ptr<WeightedLRUReplData> victim_replacement_data =
- std::static_pointer_cast<WeightedLRUReplData>(
- victim->replacementData);
-
- if (candidate_replacement_data->last_occ_ptr <
- victim_replacement_data->last_occ_ptr) {
- victim = candidate;
- } else if (candidate_replacement_data->last_occ_ptr ==
- victim_replacement_data->last_occ_ptr) {
- // Evict the block with a smaller tick.
- Tick time = candidate_replacement_data->last_touch_tick;
- if (time < victim_replacement_data->last_touch_tick) {
- victim = candidate;
- }
- }
- }
- return victim;
-}
-
-std::shared_ptr<ReplacementData>
-WeightedLRUPolicy::instantiateEntry()
-{
- return std::shared_ptr<ReplacementData>(new WeightedLRUReplData);
-}
-
-void
-WeightedLRUPolicy::reset(const std::shared_ptr<ReplacementData>&
- replacement_data) const
-{
- // Set last touch timestamp
- std::static_pointer_cast<WeightedLRUReplData>(
- replacement_data)->last_touch_tick = curTick();
-}
-
-void
-WeightedLRUPolicy::invalidate(const std::shared_ptr<ReplacementData>&
- replacement_data) const
-{
- // Reset last touch timestamp
- std::static_pointer_cast<WeightedLRUReplData>(
- replacement_data)->last_touch_tick = Tick(0);
-}
+++ /dev/null
-/*
- * Copyright (c) 2013-2015 Advanced Micro Devices, Inc.
- * All rights reserved.
- *
- * For use for simulation and test purposes only
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the copyright holder nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Sooraj Puthoor
- */
-
-#ifndef __MEM_RUBY_SYSTEM_WEIGHTEDLRUPOLICY_HH__
-#define __MEM_RUBY_SYSTEM_WEIGHTEDLRUPOLICY_HH__
-
-#include "mem/cache/replacement_policies/base.hh"
-#include "mem/ruby/structures/CacheMemory.hh"
-#include "params/WeightedLRUReplacementPolicy.hh"
-
-/* Simple true LRU replacement policy */
-
-class WeightedLRUPolicy : public BaseReplacementPolicy
-{
- protected:
- /** Weighted LRU implementation of replacement data. */
- struct WeightedLRUReplData : ReplacementData
- {
- /** pointer for last occupancy */
- int last_occ_ptr;
-
- /** Tick on which the entry was last touched. */
- Tick last_touch_tick;
-
- /**
- * Default constructor. Invalidate data.
- */
- WeightedLRUReplData() : ReplacementData(),
- last_occ_ptr(0), last_touch_tick(0) {}
- };
- public:
- typedef WeightedLRUReplacementPolicyParams Params;
- WeightedLRUPolicy(const Params* p);
- ~WeightedLRUPolicy() {}
-
- /**
- * Invalidate replacement data to set it as the next probable victim.
- * Sets its last touch tick as the starting tick.
- *
- * @param replacement_data Replacement data to be invalidated.
- */
- void invalidate(const std::shared_ptr<ReplacementData>& replacement_data)
- const override;
- /**
- * Touch an entry to update its replacement data.
- * Sets its last touch tick as the current tick.
- *
- * @param replacement_data Replacement data to be touched.
- */
- void touch(const std::shared_ptr<ReplacementData>&
- replacement_data) const override;
- void touch(const std::shared_ptr<ReplacementData>& replacement_data,
- int occupancy) const;
-
- /**
- * Reset replacement data. Used when an entry is inserted.
- * Sets its last touch tick as the current tick.
- *
- * @param replacement_data Replacement data to be reset.
- */
- void reset(const std::shared_ptr<ReplacementData>& replacement_data) const
- override;
-
- /**
- * Instantiate a replacement data entry.
- *
- * @return A shared pointer to the new replacement data.
- */
- std::shared_ptr<ReplacementData> instantiateEntry() override;
-
- /**
- * Find replacement victim using weight.
- *
- * @param candidates Replacement candidates, selected by indexing policy.
- * @return Replacement entry to be replaced.
- */
- ReplaceableEntry* getVictim(const ReplacementCandidates&
- candidates) const override;
-};
-
-#endif // __MEM_RUBY_SYSTEM_WeightedLRUPolicy_HH__
+++ /dev/null
-# Copyright (c) 2013-2015 Advanced Micro Devices, Inc.
-# All rights reserved.
-#
-# For use for simulation and test purposes only
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# 1. Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-#
-# 3. Neither the name of the copyright holder nor the names of its
-# contributors may be used to endorse or promote products derived from this
-# software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# Authors: Derek Hower
-
-from m5.params import *
-from m5.proxy import *
-from m5.objects.ReplacementPolicies import BaseReplacementPolicy
-
-class WeightedLRUReplacementPolicy(BaseReplacementPolicy):
- type = "WeightedLRUReplacementPolicy"
- cxx_class = "WeightedLRUPolicy"
- cxx_header = "mem/ruby/system/WeightedLRUPolicy.hh"