From fdcfc28cf4aaea6fbb50bc350b5d5861ac82d6a8 Mon Sep 17 00:00:00 2001 From: Giacomo Travaglini Date: Fri, 5 Apr 2024 10:46:40 +0100 Subject: [PATCH] mem-cache: Allow dynamic configuration of MaxCapacity pp This will allow gem5 to configure the maximum capacity of a partition dynamically during simulation, rather than having it statically defined at construction time Change-Id: Ib55c9990a6bc2930abaf2438c13337acc643520f Signed-off-by: Giacomo Travaglini --- .../partitioning_policies/max_capacity_pp.cc | 36 +++++++++++-------- .../partitioning_policies/max_capacity_pp.hh | 8 +++++ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/mem/cache/tags/partitioning_policies/max_capacity_pp.cc b/src/mem/cache/tags/partitioning_policies/max_capacity_pp.cc index 47cd085869..2180cc12b2 100644 --- a/src/mem/cache/tags/partitioning_policies/max_capacity_pp.cc +++ b/src/mem/cache/tags/partitioning_policies/max_capacity_pp.cc @@ -68,24 +68,30 @@ MaxCapacityPartitioningPolicy::MaxCapacityPartitioningPolicy const uint64_t partition_id = this->partitionIDs[i]; const double cap_frac = capacities[i]; - // check Capacity Fraction (cap_frac) is actually a fraction in [0,1] - if (!(cap_frac >= 0 && cap_frac <= 1)) { - fatal("MaxCapacity Partitioning Policy for PartitionID %d has " - "Capacity Fraction %f outside of [0,1] range", partition_id, - cap_frac); - } - - const uint64_t allocated_block_cnt = cap_frac * totalBlockCount; - partitionIdMaxCapacity.emplace(partition_id, allocated_block_cnt); - - DPRINTF(PartitionPolicy, "Configured MaxCapacity Partitioning Policy " - "for PartitionID: %d to use portion of size %f (%d cache blocks " - "of %d total)\n", partition_id, cap_frac, allocated_block_cnt, - totalBlockCount); - + // Configure partition + configurePartition(partition_id, cap_frac); } } +void +MaxCapacityPartitioningPolicy::configurePartition(uint64_t partition_id, + double cap_frac) +{ + // check Capacity Fraction (cap_frac) is actually a fraction in [0,1] + panic_if(!(cap_frac >= 0 && cap_frac <= 1), + "MaxCapacity Partitioning Policy for PartitionID %d has " + "Capacity Fraction %f outside of [0,1] range", partition_id, + cap_frac); + + const uint64_t allocated_block_cnt = cap_frac * totalBlockCount; + partitionIdMaxCapacity.emplace(partition_id, allocated_block_cnt); + + DPRINTF(PartitionPolicy, "Configured MaxCapacity Partitioning Policy " + "for PartitionID: %d to use portion of size %f (%d cache blocks " + "of %d total)\n", partition_id, cap_frac, allocated_block_cnt, + totalBlockCount); +} + void MaxCapacityPartitioningPolicy::filterByPartition( std::vector &entries, diff --git a/src/mem/cache/tags/partitioning_policies/max_capacity_pp.hh b/src/mem/cache/tags/partitioning_policies/max_capacity_pp.hh index b8fe12bcdc..669a2202da 100644 --- a/src/mem/cache/tags/partitioning_policies/max_capacity_pp.hh +++ b/src/mem/cache/tags/partitioning_policies/max_capacity_pp.hh @@ -79,6 +79,14 @@ class MaxCapacityPartitioningPolicy : public BasePartitioningPolicy void notifyRelease(const uint64_t partition_id) override; + /** + * Set the maximum capacity (as a fraction) for the provided partition + * + * param partion_id partition to be configured + * param cap_frac max capacity for the partition (0 < cap_frac < 1) + */ + void configurePartition(uint64_t partition_id, double cap_frac); + private: /** * Total number of cache blocks