[gem5-dev] Change in gem5/gem5[develop]: mem-cache: Allow sending packet information to replacement policy
Daniel Carvalho has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/38117 ) Change subject: mem-cache: Allow sending packet information to replacement policy .. mem-cache: Allow sending packet information to replacement policy Some replacement policies can use information such as address or PC to improve their re-reference prediction. Change-Id: I412eee09efa2f3511ca1ece76fc2732509df4745 Signed-off-by: Daniel R. Carvalho Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/38117 Tested-by: kokoro Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power --- M src/mem/cache/replacement_policies/base.hh M src/mem/cache/replacement_policies/dueling_rp.cc M src/mem/cache/replacement_policies/dueling_rp.hh M src/mem/cache/tags/base_set_assoc.hh M src/mem/cache/tags/sector_tags.cc 5 files changed, 50 insertions(+), 7 deletions(-) Approvals: Jason Lowe-Power: Looks good to me, approved; Looks good to me, approved kokoro: Regressions pass diff --git a/src/mem/cache/replacement_policies/base.hh b/src/mem/cache/replacement_policies/base.hh index 0393629..0851287 100644 --- a/src/mem/cache/replacement_policies/base.hh +++ b/src/mem/cache/replacement_policies/base.hh @@ -33,6 +33,7 @@ #include "base/compiler.hh" #include "mem/cache/replacement_policies/replaceable_entry.hh" +#include "mem/packet.hh" #include "params/BaseReplacementPolicy.hh" #include "sim/sim_object.hh" @@ -67,17 +68,29 @@ * Update replacement data. * * @param replacement_data Replacement data to be touched. + * @param pkt Packet that generated this access. */ virtual void touch(const std::shared_ptr& -replacement_data) const = 0; +replacement_data, const PacketPtr pkt) +{ +touch(replacement_data); +} +virtual void touch(const std::shared_ptr& +replacement_data) const = 0; /** * Reset replacement data. Used when it's holder is inserted/validated. * * @param replacement_data Replacement data to be reset. + * @param pkt Packet that generated this access. */ virtual void reset(const std::shared_ptr& -replacement_data) const = 0; +replacement_data, const PacketPtr pkt) +{ +reset(replacement_data); +} +virtual void reset(const std::shared_ptr& +replacement_data) const = 0; /** * Find replacement victim among candidates. diff --git a/src/mem/cache/replacement_policies/dueling_rp.cc b/src/mem/cache/replacement_policies/dueling_rp.cc index e691141..3565017 100644 --- a/src/mem/cache/replacement_policies/dueling_rp.cc +++ b/src/mem/cache/replacement_policies/dueling_rp.cc @@ -54,6 +54,16 @@ } void +Dueling::touch(const std::shared_ptr& replacement_data, +const PacketPtr pkt) +{ +std::shared_ptr casted_replacement_data = +std::static_pointer_cast(replacement_data); +replPolicyA->touch(casted_replacement_data->replDataA, pkt); +replPolicyB->touch(casted_replacement_data->replDataB, pkt); +} + +void Dueling::touch(const std::shared_ptr& replacement_data) const { std::shared_ptr casted_replacement_data = @@ -63,6 +73,22 @@ } void +Dueling::reset(const std::shared_ptr& replacement_data, +const PacketPtr pkt) +{ +std::shared_ptr casted_replacement_data = +std::static_pointer_cast(replacement_data); +replPolicyA->reset(casted_replacement_data->replDataA, pkt); +replPolicyB->reset(casted_replacement_data->replDataB, pkt); + +// A miss in a set is a sample to the duel. A call to this function +// implies in the replacement of an entry, which was either caused by +// a miss, an external invalidation, or the initialization of the table +// entry (when warming up) + duelingMonitor.sample(static_cast(casted_replacement_data.get())); +} + +void Dueling::reset(const std::shared_ptr& replacement_data) const { std::shared_ptr casted_replacement_data = diff --git a/src/mem/cache/replacement_policies/dueling_rp.hh b/src/mem/cache/replacement_policies/dueling_rp.hh index 0c96ca7..314042e 100644 --- a/src/mem/cache/replacement_policies/dueling_rp.hh +++ b/src/mem/cache/replacement_policies/dueling_rp.hh @@ -97,8 +97,12 @@ void invalidate(const std::shared_ptr& replacement_data) override; +void touch(const std::shared_ptr& replacement_data, +const PacketPtr pkt) override; void touch(const std::shared_ptr& replacement_data) const override; +void reset(const std::shared_ptr& replacement_data, +const PacketPtr pkt) override; void reset(const std::shared_ptr& replacement_data) const
[gem5-dev] Change in gem5/gem5[develop]: mem-cache: Allow sending packet information to replacement policy
Daniel Carvalho has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/38117 ) Change subject: mem-cache: Allow sending packet information to replacement policy .. mem-cache: Allow sending packet information to replacement policy Some replacement policies can use information such as address or PC to improve their re-reference prediction. Change-Id: I412eee09efa2f3511ca1ece76fc2732509df4745 Signed-off-by: Daniel R. Carvalho --- M src/mem/cache/replacement_policies/base.hh M src/mem/cache/replacement_policies/dueling_rp.cc M src/mem/cache/replacement_policies/dueling_rp.hh M src/mem/cache/tags/base_set_assoc.hh M src/mem/cache/tags/sector_tags.cc 5 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/mem/cache/replacement_policies/base.hh b/src/mem/cache/replacement_policies/base.hh index 7d09a4a..f873926 100644 --- a/src/mem/cache/replacement_policies/base.hh +++ b/src/mem/cache/replacement_policies/base.hh @@ -34,6 +34,7 @@ #include #include "mem/cache/replacement_policies/replaceable_entry.hh" +#include "mem/packet.hh" #include "params/BaseReplacementPolicy.hh" #include "sim/sim_object.hh" @@ -112,17 +113,29 @@ * Update replacement data. * * @param replacement_data Replacement data to be touched. + * @param pkt Packet that generated this access. */ virtual void touch(const std::shared_ptr& -replacement_data) const = 0; +replacement_data, const PacketPtr pkt) +{ +touch(replacement_data); +} +virtual void touch(const std::shared_ptr& +replacement_data) const = 0; /** * Reset replacement data. Used when it's holder is inserted/validated. * * @param replacement_data Replacement data to be reset. + * @param pkt Packet that generated this access. */ virtual void reset(const std::shared_ptr& -replacement_data) const = 0; +replacement_data, const PacketPtr pkt) +{ +reset(replacement_data); +} +virtual void reset(const std::shared_ptr& +replacement_data) const = 0; /** * Find replacement victim among candidates. diff --git a/src/mem/cache/replacement_policies/dueling_rp.cc b/src/mem/cache/replacement_policies/dueling_rp.cc index f3cce39..3e2e604 100644 --- a/src/mem/cache/replacement_policies/dueling_rp.cc +++ b/src/mem/cache/replacement_policies/dueling_rp.cc @@ -53,6 +53,16 @@ } void +Dueling::touch(const std::shared_ptr& replacement_data, +const PacketPtr pkt) +{ +std::shared_ptr casted_replacement_data = +std::static_pointer_cast(replacement_data); +replPolicyA->touch(casted_replacement_data->replDataA, pkt); +replPolicyB->touch(casted_replacement_data->replDataB, pkt); +} + +void Dueling::touch(const std::shared_ptr& replacement_data) const { std::shared_ptr casted_replacement_data = @@ -62,6 +72,22 @@ } void +Dueling::reset(const std::shared_ptr& replacement_data, +const PacketPtr pkt) +{ +std::shared_ptr casted_replacement_data = +std::static_pointer_cast(replacement_data); +replPolicyA->reset(casted_replacement_data->replDataA, pkt); +replPolicyB->reset(casted_replacement_data->replDataB, pkt); + +// A miss in a set is a sample to the duel. A call to this function +// implies in the replacement of an entry, which was either caused by +// a miss, an external invalidation, or the initialization of the table +// entry (when warming up) + duelingMonitor.sample(static_cast(casted_replacement_data.get())); +} + +void Dueling::reset(const std::shared_ptr& replacement_data) const { std::shared_ptr casted_replacement_data = diff --git a/src/mem/cache/replacement_policies/dueling_rp.hh b/src/mem/cache/replacement_policies/dueling_rp.hh index 0bd0d95..3077744 100644 --- a/src/mem/cache/replacement_policies/dueling_rp.hh +++ b/src/mem/cache/replacement_policies/dueling_rp.hh @@ -97,8 +97,12 @@ void invalidate(const std::shared_ptr& replacement_data) override; +void touch(const std::shared_ptr& replacement_data, +const PacketPtr pkt) override; void touch(const std::shared_ptr& replacement_data) const override; +void reset(const std::shared_ptr& replacement_data, +const PacketPtr pkt) override; void reset(const std::shared_ptr& replacement_data) const override; ReplaceableEntry* getVictim( diff --git a/src/mem/cache/tags/base_set_assoc.hh b/src/mem/cache/tags/base_set_assoc.hh index 07e19a5..38baa6d 100644 --- a/src/mem/cache/tags/base_set_assoc.hh +++ b/src/me