diff options
author | Timothy M. Jones <timothy.jones@cl.cam.ac.uk> | 2011-02-25 13:50:29 +0000 |
---|---|---|
committer | Timothy M. Jones <timothy.jones@cl.cam.ac.uk> | 2011-02-25 13:50:29 +0000 |
commit | a10685ad1e3077e6f4a059f984a4964e37dac807 (patch) | |
tree | 27280dff6fe21e0b15f0cf4d3f0adbdf56223842 | |
parent | aa0cd525048ef3e4b6db706d7852bd16729a807f (diff) | |
download | gem5-a10685ad1e3077e6f4a059f984a4964e37dac807.tar.xz |
O3CPU: Fix iqCount and lsqCount SMT fetch policies.
Fixes two of the SMT fetch policies in O3CPU that were returning the count
of instructions in the IQ or LSQ rather than the thread ID to fetch from.
-rw-r--r-- | src/cpu/o3/fetch_impl.hh | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/cpu/o3/fetch_impl.hh b/src/cpu/o3/fetch_impl.hh index 2c4906760..a2f2b4f8a 100644 --- a/src/cpu/o3/fetch_impl.hh +++ b/src/cpu/o3/fetch_impl.hh @@ -1404,19 +1404,22 @@ template<class Impl> ThreadID DefaultFetch<Impl>::iqCount() { - std::priority_queue<ThreadID> PQ; + std::priority_queue<unsigned> PQ; + std::map<unsigned, ThreadID> threadMap; list<ThreadID>::iterator threads = activeThreads->begin(); list<ThreadID>::iterator end = activeThreads->end(); while (threads != end) { ThreadID tid = *threads++; + unsigned iqCount = fromIEW->iewInfo[tid].iqCount; - PQ.push(fromIEW->iewInfo[tid].iqCount); + PQ.push(iqCount); + threadMap[iqCount] = tid; } while (!PQ.empty()) { - ThreadID high_pri = PQ.top(); + ThreadID high_pri = threadMap[PQ.top()]; if (fetchStatus[high_pri] == Running || fetchStatus[high_pri] == IcacheAccessComplete || @@ -1434,19 +1437,22 @@ template<class Impl> ThreadID DefaultFetch<Impl>::lsqCount() { - std::priority_queue<ThreadID> PQ; + std::priority_queue<unsigned> PQ; + std::map<unsigned, ThreadID> threadMap; list<ThreadID>::iterator threads = activeThreads->begin(); list<ThreadID>::iterator end = activeThreads->end(); while (threads != end) { ThreadID tid = *threads++; + unsigned ldstqCount = fromIEW->iewInfo[tid].ldstqCount; - PQ.push(fromIEW->iewInfo[tid].ldstqCount); + PQ.push(ldstqCount); + threadMap[ldstqCount] = tid; } while (!PQ.empty()) { - ThreadID high_pri = PQ.top(); + ThreadID high_pri = threadMap[PQ.top()]; if (fetchStatus[high_pri] == Running || fetchStatus[high_pri] == IcacheAccessComplete || |