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:
parent
1097aa1638
commit
3f6874cb29
3 changed files with 18 additions and 10 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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__
|
||||||
|
|
Loading…
Reference in a new issue