cpu: Fix BTB threading oversight

The extant BTB code doesn't hash on the thread id but does check the
thread id for 'btb hits'.  This results in 1-thread of a multi-threaded
workload taking a BTB entry, and all other threads missing for the same branch
missing.
This commit is contained in:
Mitch Hayenga 2016-04-05 11:44:27 -05:00
parent 1097aa1638
commit 3f6874cb29
3 changed files with 18 additions and 10 deletions

View file

@ -59,7 +59,8 @@ BPredUnit::BPredUnit(const Params *params)
predHist(numThreads), predHist(numThreads),
BTB(params->BTBEntries, BTB(params->BTBEntries,
params->BTBTagSize, params->BTBTagSize,
params->instShiftAmt), params->instShiftAmt,
params->numThreads),
RAS(numThreads), RAS(numThreads),
instShiftAmt(params->instShiftAmt) instShiftAmt(params->instShiftAmt)
{ {

View file

@ -35,10 +35,12 @@
DefaultBTB::DefaultBTB(unsigned _numEntries, DefaultBTB::DefaultBTB(unsigned _numEntries,
unsigned _tagBits, unsigned _tagBits,
unsigned _instShiftAmt) unsigned _instShiftAmt,
unsigned _num_threads)
: numEntries(_numEntries), : numEntries(_numEntries),
tagBits(_tagBits), tagBits(_tagBits),
instShiftAmt(_instShiftAmt) instShiftAmt(_instShiftAmt),
log2NumThreads(floorLog2(_num_threads))
{ {
DPRINTF(Fetch, "BTB: Creating BTB object.\n"); DPRINTF(Fetch, "BTB: Creating BTB object.\n");
@ -69,10 +71,12 @@ DefaultBTB::reset()
inline inline
unsigned unsigned
DefaultBTB::getIndex(Addr instPC) DefaultBTB::getIndex(Addr instPC, ThreadID tid)
{ {
// Need to shift PC over by the word offset. // Need to shift PC over by the word offset.
return (instPC >> instShiftAmt) & idxMask; return ((instPC >> instShiftAmt)
^ (tid << (tagShiftAmt - instShiftAmt - log2NumThreads)))
& idxMask;
} }
inline inline
@ -85,7 +89,7 @@ DefaultBTB::getTag(Addr instPC)
bool bool
DefaultBTB::valid(Addr instPC, ThreadID tid) DefaultBTB::valid(Addr instPC, ThreadID tid)
{ {
unsigned btb_idx = getIndex(instPC); unsigned btb_idx = getIndex(instPC, tid);
Addr inst_tag = getTag(instPC); Addr inst_tag = getTag(instPC);
@ -106,7 +110,7 @@ DefaultBTB::valid(Addr instPC, ThreadID tid)
TheISA::PCState TheISA::PCState
DefaultBTB::lookup(Addr instPC, ThreadID tid) DefaultBTB::lookup(Addr instPC, ThreadID tid)
{ {
unsigned btb_idx = getIndex(instPC); unsigned btb_idx = getIndex(instPC, tid);
Addr inst_tag = getTag(instPC); Addr inst_tag = getTag(instPC);
@ -124,7 +128,7 @@ DefaultBTB::lookup(Addr instPC, ThreadID tid)
void void
DefaultBTB::update(Addr instPC, const TheISA::PCState &target, ThreadID tid) DefaultBTB::update(Addr instPC, const TheISA::PCState &target, ThreadID tid)
{ {
unsigned btb_idx = getIndex(instPC); unsigned btb_idx = getIndex(instPC, tid);
assert(btb_idx < numEntries); assert(btb_idx < numEntries);

View file

@ -66,7 +66,7 @@ class DefaultBTB
* @param instShiftAmt Offset amount for instructions to ignore alignment. * @param instShiftAmt Offset amount for instructions to ignore alignment.
*/ */
DefaultBTB(unsigned numEntries, unsigned tagBits, DefaultBTB(unsigned numEntries, unsigned tagBits,
unsigned instShiftAmt); unsigned instShiftAmt, unsigned numThreads);
void reset(); void reset();
@ -97,7 +97,7 @@ class DefaultBTB
* @param inst_PC The branch to look up. * @param inst_PC The branch to look up.
* @return Returns the index into the BTB. * @return Returns the index into the BTB.
*/ */
inline unsigned getIndex(Addr instPC); inline unsigned getIndex(Addr instPC, ThreadID tid);
/** Returns the tag bits of a given address. /** Returns the tag bits of a given address.
* @param inst_PC The branch's address. * @param inst_PC The branch's address.
@ -125,6 +125,9 @@ class DefaultBTB
/** Number of bits to shift PC when calculating tag. */ /** Number of bits to shift PC when calculating tag. */
unsigned tagShiftAmt; unsigned tagShiftAmt;
/** Log2 NumThreads used for hashing threadid */
unsigned log2NumThreads;
}; };
#endif // __CPU_PRED_BTB_HH__ #endif // __CPU_PRED_BTB_HH__