Skip to content

Commit 12d1d24

Browse files
authored
Merge pull request #626 from OpenXiangShan/resolve-queue-align
Resolve Queue Alignment in Kunminghu-v3
2 parents 868f116 + 3969088 commit 12d1d24

File tree

3 files changed

+30
-10
lines changed

3 files changed

+30
-10
lines changed

src/cpu/o3/BaseO3CPU.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ def support_take_over(cls):
239239

240240
branchPred = Param.BranchPredictor(DecoupledBPUWithBTB(),
241241
"Branch Predictor")
242+
resolveQueueSize = Param.Unsigned(16, "Number of entries in the branch resolution queue")
242243
needsTSO = Param.Bool(False, "Enable TSO Memory model")
243244

244245
scheduler = Param.Scheduler("")

src/cpu/o3/iew.cc

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ IEW::IEW(CPU *_cpu, const BaseO3CPUParams &params)
9292
wbWidth(params.wbWidth),
9393
enableStoreSetTrain(params.enable_storeSet_train),
9494
numThreads(params.numThreads),
95+
resolveQueueSize(params.resolveQueueSize),
9596
iewStats(cpu)
9697
{
9798
if (wbWidth > MaxWidth)
@@ -179,6 +180,13 @@ IEW::IEWStats::IEWStats(CPU *cpu)
179180
"Number of branches that were predicted taken incorrectly"),
180181
ADD_STAT(predictedNotTakenIncorrect, statistics::units::Count::get(),
181182
"Number of branches that were predicted not taken incorrectly"),
183+
ADD_STAT(resolveQueueFullCycles, statistics::units::Count::get(),
184+
"Number of cycles the resolve queue is full"),
185+
ADD_STAT(resolveQueueFullEvents, statistics::units::Count::get(),
186+
"Number of events the resolve queue becomes full"),
187+
ADD_STAT(resolveEnqueueFailEvent, statistics::units::Count::get(),
188+
"Number of times an instruction could not be enqueued to the "
189+
"resolve queue"),
182190
ADD_STAT(branchMispredicts, statistics::units::Count::get(),
183191
"Number of branch mispredicts detected at execute",
184192
predictedTakenIncorrect + predictedNotTakenIncorrect),
@@ -1573,11 +1581,21 @@ IEW::SquashCheckAfterExe(DynInstPtr inst)
15731581
}
15741582
}
15751583

1576-
if (!found) {
1584+
if (!found && resolveQueue.size() < resolveQueueSize) {
15771585
ResolveQueueEntry newEntry;
15781586
newEntry.resolvedFSQId = fsqId;
15791587
newEntry.resolvedInstPC.push_back(pc);
15801588
resolveQueue.push_back(newEntry);
1589+
if (resolveQueue.size() == resolveQueueSize) {
1590+
iewStats.resolveQueueFullEvents++;
1591+
}
1592+
}
1593+
1594+
if (resolveQueue.size() >= resolveQueueSize) {
1595+
if (!found) {
1596+
iewStats.resolveEnqueueFailEvent++;
1597+
}
1598+
iewStats.resolveQueueFullCycles++;
15811599
}
15821600

15831601
if (!fetchRedirect[tid] ||
@@ -1793,10 +1811,9 @@ IEW::executeInsts()
17931811
}
17941812
}
17951813

1796-
sortResolveQueue();
17971814
if (!resolveQueue.empty()) {
1798-
ResolveQueueEntry entry = resolveQueue.back();
1799-
resolveQueue.pop_back();
1815+
ResolveQueueEntry entry = resolveQueue.front();
1816+
resolveQueue.erase(resolveQueue.begin());
18001817
toFetch->iewInfo[tid].resolveQueue.push_back(entry);
18011818
}
18021819

src/cpu/o3/iew.hh

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#ifndef __CPU_O3_IEW_HH__
4242
#define __CPU_O3_IEW_HH__
4343

44+
#include <cstdint>
4445
#include <deque>
4546
#include <map>
4647
#include <queue>
@@ -494,13 +495,8 @@ class IEW
494495
/** Maximum size of the skid buffer. */
495496
unsigned skidBufferMax;
496497

498+
unsigned resolveQueueSize;
497499
std::vector<ResolveQueueEntry> resolveQueue;
498-
static inline bool resolveQueueEntryCompare(const ResolveQueueEntry &a, const ResolveQueueEntry &b)
499-
{
500-
return a.resolvedFSQId > b.resolvedFSQId;
501-
};
502-
inline void sortResolveQueue() { std::sort(resolveQueue.begin(), resolveQueue.end(), resolveQueueEntryCompare); };
503-
504500

505501
struct IEWStats : public statistics::Group
506502
{
@@ -534,6 +530,12 @@ class IEW
534530
statistics::Scalar predictedTakenIncorrect;
535531
/** Stat for total number of incorrect predicted not taken branches. */
536532
statistics::Scalar predictedNotTakenIncorrect;
533+
/** Stat for total cycles the resolve queue is full. */
534+
statistics::Scalar resolveQueueFullCycles;
535+
/** Stat for total events of the resolve queue becomes full. */
536+
statistics::Scalar resolveQueueFullEvents;
537+
/** Stat for total number of enqueue fail events. */
538+
statistics::Scalar resolveEnqueueFailEvent;
537539
/** Stat for total number of mispredicted branches detected at
538540
* execute. */
539541
statistics::Formula branchMispredicts;

0 commit comments

Comments
 (0)