From 1e9f65343c79b2c3b081e785cfec070d25292be7 Mon Sep 17 00:00:00 2001 From: Nikos Nikoleris Date: Thu, 3 Jan 2019 19:01:04 +0000 Subject: cpu-o3: Make the smtCommitPolicy a Param.ScopedEnum The smtCommitPolicy is a parameter in the o3 cpu that can have 3 different values. Previously this setting was done through a string and a parser function would turn it into a c++ enum value. This changeset turns the string into a python Param.ScopedEnum. Change-Id: I3625f2c08a1ae0c3b0dce7a641c6ae1ce3fd79a5 Signed-off-by: Nikos Nikoleris Reviewed-by: Giacomo Travaglini Reviewed-on: https://gem5-review.googlesource.com/c/15400 Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power --- src/cpu/o3/O3CPU.py | 5 ++++- src/cpu/o3/commit.hh | 8 +------- src/cpu/o3/commit_impl.hh | 32 ++++++-------------------------- 3 files changed, 11 insertions(+), 34 deletions(-) diff --git a/src/cpu/o3/O3CPU.py b/src/cpu/o3/O3CPU.py index e3704c0fa..32cc19010 100644 --- a/src/cpu/o3/O3CPU.py +++ b/src/cpu/o3/O3CPU.py @@ -54,6 +54,9 @@ class FetchPolicy(ScopedEnum): class SMTQueuePolicy(ScopedEnum): vals = [ 'Dynamic', 'Partitioned', 'Threshold' ] +class CommitPolicy(ScopedEnum): + vals = [ 'Aggressive', 'RoundRobin', 'OldestReady' ] + class DerivO3CPU(BaseCPU): type = 'DerivO3CPU' cxx_header = 'cpu/o3/deriv.hh' @@ -163,7 +166,7 @@ class DerivO3CPU(BaseCPU): smtROBPolicy = Param.SMTQueuePolicy('Partitioned', "SMT ROB Sharing Policy") smtROBThreshold = Param.Int(100, "SMT ROB Threshold Sharing Parameter") - smtCommitPolicy = Param.String('RoundRobin', "SMT Commit Policy") + smtCommitPolicy = Param.CommitPolicy('RoundRobin', "SMT Commit Policy") branchPred = Param.BranchPredictor(TournamentBP(numThreads = Parent.numThreads), diff --git a/src/cpu/o3/commit.hh b/src/cpu/o3/commit.hh index b74917da3..2d7a23e5d 100644 --- a/src/cpu/o3/commit.hh +++ b/src/cpu/o3/commit.hh @@ -50,6 +50,7 @@ #include "cpu/exetrace.hh" #include "cpu/inst_seq.hh" #include "cpu/timebuf.hh" +#include "enums/CommitPolicy.hh" #include "sim/probe/probe.hh" struct DerivO3CPUParams; @@ -119,13 +120,6 @@ class DefaultCommit SquashAfterPending, //< Committing instructions before a squash. }; - /** Commit policy for SMT mode. */ - enum CommitPolicy { - Aggressive, - RoundRobin, - OldestReady - }; - private: /** Overall commit status. */ CommitStatus _status; diff --git a/src/cpu/o3/commit_impl.hh b/src/cpu/o3/commit_impl.hh index 40ce8480e..879fad292 100644 --- a/src/cpu/o3/commit_impl.hh +++ b/src/cpu/o3/commit_impl.hh @@ -82,7 +82,8 @@ DefaultCommit::processTrapEvent(ThreadID tid) template DefaultCommit::DefaultCommit(O3CPU *_cpu, DerivO3CPUParams *params) - : cpu(_cpu), + : commitPolicy(params->smtCommitPolicy), + cpu(_cpu), iewToCommitDelay(params->iewToCommitDelay), commitToIEWDelay(params->commitToIEWDelay), renameToROBDelay(params->renameToROBDelay), @@ -103,33 +104,12 @@ DefaultCommit::DefaultCommit(O3CPU *_cpu, DerivO3CPUParams *params) _status = Active; _nextStatus = Inactive; - std::string policy = params->smtCommitPolicy; - - //Convert string to lowercase - std::transform(policy.begin(), policy.end(), policy.begin(), - (int(*)(int)) tolower); - - //Assign commit policy - if (policy == "aggressive"){ - commitPolicy = Aggressive; - - DPRINTF(Commit,"Commit Policy set to Aggressive.\n"); - } else if (policy == "roundrobin"){ - commitPolicy = RoundRobin; + if (commitPolicy == CommitPolicy::RoundRobin) { //Set-Up Priority List for (ThreadID tid = 0; tid < numThreads; tid++) { priority_list.push_back(tid); } - - DPRINTF(Commit,"Commit Policy set to Round Robin.\n"); - } else if (policy == "oldestready"){ - commitPolicy = OldestReady; - - DPRINTF(Commit,"Commit Policy set to Oldest Ready."); - } else { - panic("Invalid SMT commit policy. Options are: Aggressive, " - "RoundRobin, OldestReady"); } for (ThreadID tid = 0; tid < Impl::MaxThreads; tid++) { @@ -1431,16 +1411,16 @@ DefaultCommit::getCommittingThread() if (numThreads > 1) { switch (commitPolicy) { - case Aggressive: + case CommitPolicy::Aggressive: //If Policy is Aggressive, commit will call //this function multiple times per //cycle return oldestReady(); - case RoundRobin: + case CommitPolicy::RoundRobin: return roundRobin(); - case OldestReady: + case CommitPolicy::OldestReady: return oldestReady(); default: -- cgit v1.2.3