diff options
Diffstat (limited to 'src/cpu/o3')
-rw-r--r-- | src/cpu/o3/O3CPU.py | 7 | ||||
-rw-r--r-- | src/cpu/o3/deriv.cc | 10 | ||||
-rw-r--r-- | src/cpu/o3/fetch.hh | 14 | ||||
-rw-r--r-- | src/cpu/o3/fetch_impl.hh | 53 |
4 files changed, 21 insertions, 63 deletions
diff --git a/src/cpu/o3/O3CPU.py b/src/cpu/o3/O3CPU.py index b8152f663..f6c395aed 100644 --- a/src/cpu/o3/O3CPU.py +++ b/src/cpu/o3/O3CPU.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 ARM Limited +# Copyright (c) 2016, 2019 ARM Limited # All rights reserved. # # The license below extends only to copyright in the software and shall @@ -48,6 +48,9 @@ from FUPool import * from O3Checker import O3Checker from BranchPredictor import * +class FetchPolicy(ScopedEnum): + vals = [ 'SingleThread', 'RoundRobin', 'Branch', 'IQCount', 'LSQCount' ] + class DerivO3CPU(BaseCPU): type = 'DerivO3CPU' cxx_header = 'cpu/o3/deriv.hh' @@ -147,7 +150,7 @@ class DerivO3CPU(BaseCPU): numROBEntries = Param.Unsigned(192, "Number of reorder buffer entries") smtNumFetchingThreads = Param.Unsigned(1, "SMT Number of Fetching Threads") - smtFetchPolicy = Param.String('SingleThread', "SMT Fetch policy") + smtFetchPolicy = Param.FetchPolicy('SingleThread', "SMT Fetch policy") smtLSQPolicy = Param.String('Partitioned', "SMT LSQ Sharing Policy") smtLSQThreshold = Param.Int(100, "SMT LSQ Threshold Sharing Parameter") smtIQPolicy = Param.String('Partitioned', "SMT IQ Sharing Policy") diff --git a/src/cpu/o3/deriv.cc b/src/cpu/o3/deriv.cc index 6b2af76e0..e8ff66913 100644 --- a/src/cpu/o3/deriv.cc +++ b/src/cpu/o3/deriv.cc @@ -57,14 +57,8 @@ DerivO3CPUParams::create() numThreads = actual_num_threads; - // Default smtFetchPolicy to "RoundRobin", if necessary. - std::string round_robin_policy = "RoundRobin"; - std::string single_thread = "SingleThread"; - - if (actual_num_threads > 1 && single_thread.compare(smtFetchPolicy) == 0) - smtFetchPolicy = round_robin_policy; - else - smtFetchPolicy = smtFetchPolicy; + if (actual_num_threads > 1 && smtFetchPolicy == FetchPolicy::SingleThread) + smtFetchPolicy = FetchPolicy::RoundRobin; return new DerivO3CPU(this); } diff --git a/src/cpu/o3/fetch.hh b/src/cpu/o3/fetch.hh index ce4f8b6b0..ee1932bec 100644 --- a/src/cpu/o3/fetch.hh +++ b/src/cpu/o3/fetch.hh @@ -52,6 +52,7 @@ #include "cpu/pred/bpred_unit.hh" #include "cpu/timebuf.hh" #include "cpu/translation.hh" +#include "enums/FetchPolicy.hh" #include "mem/packet.hh" #include "mem/port.hh" #include "sim/eventq.hh" @@ -172,15 +173,6 @@ class DefaultFetch NoGoodAddr }; - /** Fetching Policy, Add new policies here.*/ - enum FetchPriority { - SingleThread, - RoundRobin, - Branch, - IQ, - LSQ - }; - private: /** Fetch status. */ FetchStatus _status; @@ -189,7 +181,7 @@ class DefaultFetch ThreadStatus fetchStatus[Impl::MaxThreads]; /** Fetch policy. */ - FetchPriority fetchPolicy; + FetchPolicy fetchPolicy; /** List that has the threads organized by priority. */ std::list<ThreadID> priorityList; @@ -364,7 +356,7 @@ class DefaultFetch TheISA::PCState nextPC, bool trace); /** Returns the appropriate thread to fetch, given the fetch policy. */ - ThreadID getFetchingThread(FetchPriority &fetch_priority); + ThreadID getFetchingThread(); /** Returns the appropriate thread to fetch using a round robin policy. */ ThreadID roundRobin(); diff --git a/src/cpu/o3/fetch_impl.hh b/src/cpu/o3/fetch_impl.hh index 537f93089..73c1ed156 100644 --- a/src/cpu/o3/fetch_impl.hh +++ b/src/cpu/o3/fetch_impl.hh @@ -79,7 +79,8 @@ using namespace std; template<class Impl> DefaultFetch<Impl>::DefaultFetch(O3CPU *_cpu, DerivO3CPUParams *params) - : cpu(_cpu), + : fetchPolicy(params->smtFetchPolicy), + cpu(_cpu), branchPred(nullptr), decodeToFetchDelay(params->decodeToFetchDelay), renameToFetchDelay(params->renameToFetchDelay), @@ -112,33 +113,9 @@ DefaultFetch<Impl>::DefaultFetch(O3CPU *_cpu, DerivO3CPUParams *params) fatal("cache block (%u bytes) is not a multiple of the " "fetch buffer (%u bytes)\n", cacheBlkSize, fetchBufferSize); - std::string policy = params->smtFetchPolicy; - - // Convert string to lowercase - std::transform(policy.begin(), policy.end(), policy.begin(), - (int(*)(int)) tolower); - // Figure out fetch policy - if (policy == "singlethread") { - fetchPolicy = SingleThread; - if (numThreads > 1) - panic("Invalid Fetch Policy for a SMT workload."); - } else if (policy == "roundrobin") { - fetchPolicy = RoundRobin; - DPRINTF(Fetch, "Fetch policy set to Round Robin\n"); - } else if (policy == "branch") { - fetchPolicy = Branch; - DPRINTF(Fetch, "Fetch policy set to Branch Count\n"); - } else if (policy == "iqcount") { - fetchPolicy = IQ; - DPRINTF(Fetch, "Fetch policy set to IQ count\n"); - } else if (policy == "lsqcount") { - fetchPolicy = LSQ; - DPRINTF(Fetch, "Fetch policy set to LSQ count\n"); - } else { - fatal("Invalid Fetch Policy. Options Are: {SingleThread," - " RoundRobin,LSQcount,IQcount}\n"); - } + panic_if(fetchPolicy == FetchPolicy::SingleThread && numThreads > 1, + "Invalid Fetch Policy for a SMT workload."); // Get the size of an instruction. instSize = sizeof(TheISA::MachInst); @@ -1157,7 +1134,7 @@ DefaultFetch<Impl>::fetch(bool &status_change) ////////////////////////////////////////// // Start actual fetch ////////////////////////////////////////// - ThreadID tid = getFetchingThread(fetchPolicy); + ThreadID tid = getFetchingThread(); assert(!cpu->switchedOut()); @@ -1446,26 +1423,18 @@ DefaultFetch<Impl>::recvReqRetry() /////////////////////////////////////// template<class Impl> ThreadID -DefaultFetch<Impl>::getFetchingThread(FetchPriority &fetch_priority) +DefaultFetch<Impl>::getFetchingThread() { if (numThreads > 1) { - switch (fetch_priority) { - - case SingleThread: - return 0; - - case RoundRobin: + switch (fetchPolicy) { + case FetchPolicy::RoundRobin: return roundRobin(); - - case IQ: + case FetchPolicy::IQCount: return iqCount(); - - case LSQ: + case FetchPolicy::LSQCount: return lsqCount(); - - case Branch: + case FetchPolicy::Branch: return branchCount(); - default: return InvalidThreadID; } |