diff --git a/src/cpu/pred/btb/btb_tage.cc b/src/cpu/pred/btb/btb_tage.cc index a0ffe5f472..7ae8e842fc 100644 --- a/src/cpu/pred/btb/btb_tage.cc +++ b/src/cpu/pred/btb/btb_tage.cc @@ -707,15 +707,25 @@ BTBTAGE::update(const FetchStream &stream) { } // Process each BTB entry + bool hasRecomputedVsActualDiff = false; + bool hasRecomputedVsOriginalDiff = false; for (auto &btb_entry : entries_to_update) { bool actual_taken = stream.exeTaken && stream.exeBranchInfo == btb_entry; TagePrediction recomputed; if (updateOnRead) { // if update on read is enabled, re-read providers using snapshot // Re-read providers using snapshot (do not rely on prediction-time main/alt) recomputed = generateSinglePrediction(btb_entry, startAddr, predMeta); + // Track differences for statistics + auto it = predMeta->preds.find(btb_entry.pc); + if (it != predMeta->preds.end() && recomputed.taken != it->second.taken) { + hasRecomputedVsOriginalDiff = true; + } } else { // otherwise, use the prediction from the prediction-time main/alt recomputed = predMeta->preds[btb_entry.pc]; } + if (recomputed.taken != actual_taken) { + hasRecomputedVsActualDiff = true; + } // Update predictor state and check if need to allocate new entry bool need_allocate = updatePredictorStateAndCheckAllocation(btb_entry, actual_taken, recomputed, stream); @@ -760,6 +770,13 @@ BTBTAGE::update(const FetchStream &stream) { } #endif } + // Update recomputed difference statistics (per fetchBlock) + if (hasRecomputedVsActualDiff) { + tageStats.recomputedVsActualDiff++; + } + if (hasRecomputedVsOriginalDiff) { + tageStats.recomputedVsOriginalDiff++; + } if (getDelay() <2){ checkUtageUpdateMisspred(stream); } @@ -1026,6 +1043,8 @@ BTBTAGE::TageStats::TageStats(statistics::Group* parent, int numPredictors, int ADD_STAT(updateAllocSuccess, statistics::units::Count::get(), "alloc success when update"), ADD_STAT(updateMispred, statistics::units::Count::get(), "mispred when update"), ADD_STAT(updateResetU, statistics::units::Count::get(), "reset u when update"), + ADD_STAT(recomputedVsActualDiff, statistics::units::Count::get(), "fetchBlocks where recomputed.taken != actual_taken"), + ADD_STAT(recomputedVsOriginalDiff, statistics::units::Count::get(), "fetchBlocks where recomputed.taken != original pred.taken"), ADD_STAT(updateBankConflict, statistics::units::Count::get(), "number of bank conflicts detected"), ADD_STAT(updateDeferredDueToConflict, statistics::units::Count::get(), "number of updates deferred due to bank conflict (retried later)"), ADD_STAT(updateBankConflictPerBank, statistics::units::Count::get(), "bank conflicts per bank"), diff --git a/src/cpu/pred/btb/btb_tage.hh b/src/cpu/pred/btb/btb_tage.hh index 92bcc0451d..d6d6fb2d7e 100644 --- a/src/cpu/pred/btb/btb_tage.hh +++ b/src/cpu/pred/btb/btb_tage.hh @@ -350,6 +350,10 @@ class BTBTAGE : public TimedBaseBTBPredictor Scalar updateMispred; Scalar updateResetU; + // Recomputed prediction difference statistics (per fetchBlock) + Scalar recomputedVsActualDiff; // recomputed.taken != actual_taken + Scalar recomputedVsOriginalDiff; // recomputed.taken != original pred.taken + // Bank conflict statistics Scalar updateBankConflict; // Number of bank conflicts detected Scalar updateDeferredDueToConflict; // Number of updates deferred due to bank conflict (retried later)