summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy M. Jones <timothy.jones@cl.cam.ac.uk>2011-02-25 13:50:29 +0000
committerTimothy M. Jones <timothy.jones@cl.cam.ac.uk>2011-02-25 13:50:29 +0000
commita10685ad1e3077e6f4a059f984a4964e37dac807 (patch)
tree27280dff6fe21e0b15f0cf4d3f0adbdf56223842
parentaa0cd525048ef3e4b6db706d7852bd16729a807f (diff)
downloadgem5-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.hh18
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 ||