base, mem-cache: Templatize the BaseIndexingPolicy

Change-Id: I4a7a0effd0100371afbd31c51d8ac643049dbdb1
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
This commit is contained in:
Giacomo Travaglini
2024-08-08 08:34:07 +01:00
parent 9661ca7708
commit 31d967b453
10 changed files with 97 additions and 136 deletions

View File

@@ -63,7 +63,6 @@
namespace gem5
{
class BaseIndexingPolicy;
namespace replacement_policy
{
class Base;

View File

@@ -56,6 +56,7 @@
#include "base/statistics.hh"
#include "base/types.hh"
#include "mem/cache/cache_blk.hh"
#include "mem/cache/tags/indexing_policies/base.hh"
#include "mem/packet.hh"
#include "params/BaseTags.hh"
#include "sim/clocked_object.hh"
@@ -64,7 +65,6 @@ namespace gem5
{
class System;
class IndexingPolicy;
class ReplaceableEntry;
/**

View File

@@ -1,3 +1,16 @@
# -*- mode:python -*-
# Copyright (c) 2024 Arm Limited
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
# not be construed as granting a license to any other intellectual
# property including but not limited to intellectual property relating
# to a hardware implementation of the functionality of the software
# licensed hereunder. You may use the software subject to the license
# terms below provided that you ensure that this notice is replicated
# unmodified and in its entirety in all distributions of the software,
# modified or unmodified, in source code or in binary form.
#
# Copyright (c) 2018 Inria
# All rights reserved.
#
@@ -32,8 +45,9 @@ from m5.SimObject import SimObject
class BaseIndexingPolicy(SimObject):
type = "BaseIndexingPolicy"
abstract = True
cxx_class = "gem5::BaseIndexingPolicy"
cxx_class = "gem5::IndexingPolicyTemplate<gem5::AddrTypes>"
cxx_header = "mem/cache/tags/indexing_policies/base.hh"
cxx_template_params = ["class Types"]
# Get the size from the parent (cache)
size = Param.MemorySize(Parent.size, "capacity in bytes")

View File

@@ -30,6 +30,5 @@ Import('*')
SimObject('IndexingPolicies.py', sim_objects=[
'BaseIndexingPolicy', 'SetAssociative', 'SkewedAssociative'])
Source('base.cc')
Source('set_associative.cc')
Source('skewed_associative.cc')

View File

@@ -1,104 +0,0 @@
/*
* Copyright (c) 2018 Inria
* Copyright (c) 2012-2014,2017 ARM Limited
* All rights reserved.
*
* The license below extends only to copyright in the software and shall
* not be construed as granting a license to any other intellectual
* property including but not limited to intellectual property relating
* to a hardware implementation of the functionality of the software
* licensed hereunder. You may use the software subject to the license
* terms below provided that you ensure that this notice is replicated
* unmodified and in its entirety in all distributions of the software,
* modified or unmodified, in source code or in binary form.
*
* Copyright (c) 2003-2005,2014 The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* 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;
* neither the name of the copyright holders 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
* OWNER 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.
*/
/**
* @file
* Definitions of a common framework for indexing policies.
*/
#include "mem/cache/tags/indexing_policies/base.hh"
#include <cstdlib>
#include "base/intmath.hh"
#include "base/logging.hh"
#include "mem/cache/replacement_policies/replaceable_entry.hh"
namespace gem5
{
BaseIndexingPolicy::BaseIndexingPolicy(const Params &p)
: SimObject(p), assoc(p.assoc),
numSets(p.size / (p.entry_size * assoc)),
setShift(floorLog2(p.entry_size)), setMask(numSets - 1), sets(numSets),
tagShift(setShift + floorLog2(numSets))
{
fatal_if(!isPowerOf2(numSets), "# of sets must be non-zero and a power " \
"of 2");
fatal_if(assoc <= 0, "associativity must be greater than zero");
// Make space for the entries
for (uint32_t i = 0; i < numSets; ++i) {
sets[i].resize(assoc);
}
}
ReplaceableEntry*
BaseIndexingPolicy::getEntry(const uint32_t set, const uint32_t way) const
{
return sets[set][way];
}
void
BaseIndexingPolicy::setEntry(ReplaceableEntry* entry, const uint64_t index)
{
// Calculate set and way from entry index
const std::lldiv_t div_result = std::div((long long)index, assoc);
const uint32_t set = div_result.quot;
const uint32_t way = div_result.rem;
// Sanity check
assert(set < numSets);
// Assign a free pointer
sets[set][way] = entry;
// Inform the entry its position
entry->setPosition(set, way);
}
Addr
BaseIndexingPolicy::extractTag(const Addr addr) const
{
return (addr >> tagShift);
}
} // namespace gem5

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2018 Inria
* Copyright (c) 2012-2014,2017 ARM Limited
* Copyright (c) 2012-2014,2017,2024 Arm Limited
* All rights reserved.
*
* The license below extends only to copyright in the software and shall
@@ -49,23 +49,32 @@
#include <vector>
#include "base/intmath.hh"
#include "base/logging.hh"
#include "mem/cache/replacement_policies/replaceable_entry.hh"
#include "params/BaseIndexingPolicy.hh"
#include "sim/sim_object.hh"
namespace gem5
{
class ReplaceableEntry;
/**
* A common base class for indexing table locations. Classes that inherit
* from it determine hash functions that should be applied based on the set
* and way. These functions are then applied to re-map the original values.
* @sa \ref gem5MemorySystem "gem5 Memory System"
* @tparam Types the Types template parameter shall contain the following type
* traits:
* - KeyType = The key/lookup data type
* - Params = The indexing policy Param type
*/
class BaseIndexingPolicy : public SimObject
template <class Types>
class IndexingPolicyTemplate : public SimObject
{
protected:
using KeyType = typename Types::KeyType;
using Params = typename Types::Params;
/**
* The associativity.
*/
@@ -97,20 +106,29 @@ class BaseIndexingPolicy : public SimObject
const int tagShift;
public:
/**
* Convenience typedef.
*/
typedef BaseIndexingPolicyParams Params;
/**
* Construct and initialize this policy.
*/
BaseIndexingPolicy(const Params &p);
IndexingPolicyTemplate(const Params &p)
: SimObject(p), assoc(p.assoc),
numSets(p.size / (p.entry_size * assoc)),
setShift(floorLog2(p.entry_size)), setMask(numSets - 1), sets(numSets),
tagShift(setShift + floorLog2(numSets))
{
fatal_if(!isPowerOf2(numSets), "# of sets must be non-zero and a power " \
"of 2");
fatal_if(assoc <= 0, "associativity must be greater than zero");
// Make space for the entries
for (uint32_t i = 0; i < numSets; ++i) {
sets[i].resize(assoc);
}
}
/**
* Destructor.
*/
~BaseIndexingPolicy() {};
~IndexingPolicyTemplate() {};
/**
* Associate a pointer to an entry to its physical counterpart.
@@ -118,7 +136,23 @@ class BaseIndexingPolicy : public SimObject
* @param entry The entry pointer.
* @param index An unique index for the entry.
*/
void setEntry(ReplaceableEntry* entry, const uint64_t index);
void
setEntry(ReplaceableEntry* entry, const uint64_t index)
{
// Calculate set and way from entry index
const std::lldiv_t div_result = std::div((long long)index, assoc);
const uint32_t set = div_result.quot;
const uint32_t way = div_result.rem;
// Sanity check
assert(set < numSets);
// Assign a free pointer
sets[set][way] = entry;
// Inform the entry its position
entry->setPosition(set, way);
}
/**
* Get an entry based on its set and way. All entries must have been set
@@ -128,7 +162,11 @@ class BaseIndexingPolicy : public SimObject
* @param way The way of the desired entry.
* @return entry The entry pointer.
*/
ReplaceableEntry* getEntry(const uint32_t set, const uint32_t way) const;
ReplaceableEntry*
getEntry(const uint32_t set, const uint32_t way) const
{
return sets[set][way];
}
/**
* Generate the tag from the given address.
@@ -136,7 +174,12 @@ class BaseIndexingPolicy : public SimObject
* @param addr The address to get the tag from.
* @return The tag of the address.
*/
virtual Addr extractTag(const Addr addr) const;
virtual Addr
extractTag(const Addr addr) const
{
return (addr >> tagShift);
}
/**
* Find all possible entries for insertion and replacement of an address.
@@ -146,7 +189,7 @@ class BaseIndexingPolicy : public SimObject
* @param addr The addr to a find possible entries for.
* @return The possible entries.
*/
virtual std::vector<ReplaceableEntry*> getPossibleEntries(const Addr addr)
virtual std::vector<ReplaceableEntry*> getPossibleEntries(const KeyType &key)
const = 0;
/**
@@ -156,10 +199,20 @@ class BaseIndexingPolicy : public SimObject
* @param entry The entry.
* @return the entry's original address.
*/
virtual Addr regenerateAddr(const Addr tag, const ReplaceableEntry* entry)
const = 0;
virtual Addr regenerateAddr(const KeyType &key,
const ReplaceableEntry* entry) const = 0;
};
class AddrTypes
{
public:
using KeyType = Addr;
using Params = BaseIndexingPolicyParams;
};
using BaseIndexingPolicy = IndexingPolicyTemplate<AddrTypes>;
template class IndexingPolicyTemplate<AddrTypes>;
} // namespace gem5
#endif //__MEM_CACHE_INDEXING_POLICIES_BASE_HH__

View File

@@ -63,14 +63,14 @@ SetAssociative::extractSet(const Addr addr) const
}
Addr
SetAssociative::regenerateAddr(const Addr tag, const ReplaceableEntry* entry)
const
SetAssociative::regenerateAddr(const Addr &tag,
const ReplaceableEntry* entry) const
{
return (tag << tagShift) | (entry->getSet() << setShift);
}
std::vector<ReplaceableEntry*>
SetAssociative::getPossibleEntries(const Addr addr) const
SetAssociative::getPossibleEntries(const Addr &addr) const
{
return sets[extractSet(addr)];
}

View File

@@ -115,7 +115,7 @@ class SetAssociative : public BaseIndexingPolicy
* @param addr The addr to a find possible entries for.
* @return The possible entries.
*/
std::vector<ReplaceableEntry*> getPossibleEntries(const Addr addr) const
std::vector<ReplaceableEntry*> getPossibleEntries(const Addr &addr) const
override;
/**
@@ -125,8 +125,8 @@ class SetAssociative : public BaseIndexingPolicy
* @param entry The entry.
* @return the entry's original addr value.
*/
Addr regenerateAddr(const Addr tag, const ReplaceableEntry* entry) const
override;
Addr regenerateAddr(const Addr &tag,
const ReplaceableEntry* entry) const override;
};
} // namespace gem5

View File

@@ -198,7 +198,7 @@ SkewedAssociative::extractSet(const Addr addr, const uint32_t way) const
}
Addr
SkewedAssociative::regenerateAddr(const Addr tag,
SkewedAssociative::regenerateAddr(const Addr &tag,
const ReplaceableEntry* entry) const
{
const Addr addr_set = (tag << (msbShift + 1)) | entry->getSet();
@@ -207,7 +207,7 @@ SkewedAssociative::regenerateAddr(const Addr tag,
}
std::vector<ReplaceableEntry*>
SkewedAssociative::getPossibleEntries(const Addr addr) const
SkewedAssociative::getPossibleEntries(const Addr &addr) const
{
std::vector<ReplaceableEntry*> entries;

View File

@@ -160,7 +160,7 @@ class SkewedAssociative : public BaseIndexingPolicy
* @param addr The addr to a find possible entries for.
* @return The possible entries.
*/
std::vector<ReplaceableEntry*> getPossibleEntries(const Addr addr) const
std::vector<ReplaceableEntry*> getPossibleEntries(const Addr &addr) const
override;
/**
@@ -171,8 +171,8 @@ class SkewedAssociative : public BaseIndexingPolicy
* @param entry The entry.
* @return the entry's address.
*/
Addr regenerateAddr(const Addr tag, const ReplaceableEntry* entry) const
override;
Addr regenerateAddr(const Addr &tag,
const ReplaceableEntry* entry) const override;
};
} // namespace gem5