# HG changeset patch
# User Taylor Lloyd <[email protected]>
# Date 1367606187 21600
# Fri May 03 12:36:27 2013 -0600
# Node ID d6a0c8ae2edbbd42d44a1a4084cff5b892a6418f
# Parent 00dca8a9b5606900410248f998d28d36e4faf75b
Added Global branch predictor, and updated associated files to allow its use.
diff -r 00dca8a9b560 -r d6a0c8ae2edb src/cpu/pred/SConscript
--- a/src/cpu/pred/SConscript Thu May 02 12:03:43 2013 +0200
+++ b/src/cpu/pred/SConscript Fri May 03 12:36:27 2013 -0600
@@ -35,6 +35,7 @@
Source('bpred_unit.cc')
Source('2bit_local.cc')
+ Source('global.cc')
Source('btb.cc')
Source('ras.cc')
Source('tournament.cc')
diff -r 00dca8a9b560 -r d6a0c8ae2edb src/cpu/pred/bpred_unit.cc
--- a/src/cpu/pred/bpred_unit.cc Thu May 02 12:03:43 2013 +0200
+++ b/src/cpu/pred/bpred_unit.cc Fri May 03 12:36:27 2013 -0600
@@ -33,6 +33,7 @@
#include "cpu/pred/2bit_local.hh"
#include "cpu/pred/bpred_unit_impl.hh"
+#include "cpu/pred/global.hh"
#include "cpu/pred/tournament.hh"
BPredUnit *
@@ -43,6 +44,8 @@
return new LocalBP(this);
} else if (predType == "tournament") {
return new TournamentBP(this);
+ } else if (predType == "global") {
+ return new GlobalBP(this);
} else {
fatal("Invalid BP selected!");
}
diff -r 00dca8a9b560 -r d6a0c8ae2edb src/cpu/pred/global.cc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cpu/pred/global.cc Fri May 03 12:36:27 2013 -0600
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2004-2006 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Kevin Lim, Taylor Lloyd
+ */
+
+#include "base/intmath.hh"
+#include "base/misc.hh"
+#include "base/trace.hh"
+#include "cpu/pred/global.hh"
+#include "debug/Fetch.hh"
+
+GlobalBP::GlobalBP(const Params *params)
+ : BPredUnit(params),
+ globalPredictorSize(params->globalPredictorSize),
+ globalHistoryBits(params->globalHistoryBits),
+ globalCtrBits(params->globalCtrBits)
+{
+ if (!isPowerOf2(globalPredictorSize)) {
+ fatal("Invalid global predictor size! (Must be power of 2)\n");
+ }
+
+ // Setup the array of counters for the global predictor.
+ globalCtrs.resize(globalPredictorSize);
+
+ for (unsigned i = 0; i < globalPredictorSize; ++i)
+ globalCtrs[i].setBits(globalCtrBits);
+
+ DPRINTF(Fetch, "Branch predictor: global predictor size: %i\n",
+ globalPredictorSize);
+ DPRINTF(Fetch, "Branch predictor: global history size: %i\n",
globalHistoryBits);
+ DPRINTF(Fetch, "Branch predictor: global counter bits: %i\n",
globalCtrBits);
+
+ //set the initial history
+ globalHistory = 0;
+ //setup the history mask
+ globalHistoryMask = (1 << globalHistoryBits) - 1;
+ //setup the 'predict taken' threshold
+ threshold = (1 << (globalCtrBits - 1)) - 1;
+}
+
+inline void GlobalBP::updateGlobalHistTaken()
+{
+ globalHistory = (globalHistory << 1) | 1;
+ globalHistory = globalHistory & globalHistoryMask;
+}
+
+inline void GlobalBP::updateGlobalHistNotTaken()
+{
+ globalHistory = globalHistory << 1;
+ globalHistory = globalHistory & globalHistoryMask;
+}
+
+void GlobalBP::btbUpdate(Addr branch_addr, void * &bp_history)
+{
+//Update Global History to Not Taken
+globalHistory = globalHistory & (globalHistoryMask - 1);
+}
+
+bool GlobalBP::lookup(Addr branch_addr, void * &bp_history)
+{
+ bool taken = globalCtrs[globalHistory].read() > threshold;
+
+ DPRINTF(Fetch, "Branch predictor: prediction is %i.\n",
+ (int)taken);
+ GlobalHistory *history = new GlobalHistory;
+ history->globalHistory = globalHistory;
+ history->predTaken = taken;
+ bp_history = (void *)history;
+
+ if(taken) {
+ updateGlobalHistTaken();
+ return true;
+ } else {
+ updateGlobalHistNotTaken();
+ return false;
+ }
+}
+
+void GlobalBP::uncondBranch(void * &bp_history)
+{
+ //Create the history
+ GlobalHistory *history = new GlobalHistory;
+ history->globalHistory = globalHistory;
+ history->predTaken = true;
+ bp_history = (void *)history;
+ updateGlobalHistTaken();
+}
+
+void GlobalBP::update(Addr branch_addr, bool taken, void *bp_history, bool
squashed)
+{
+ DPRINTF(Fetch, "Predictor: Updating predictive counters\n");
+ if (bp_history) {
+ GlobalHistory *history = (GlobalHistory *) bp_history;
+ if(taken) {
+ globalCtrs[history->globalHistory].increment();
+ } else {
+ globalCtrs[history->globalHistory].decrement();
+ }
+ if(squashed) {
+ // Recover using our past history
+ DPRINTF(Fetch, "Predictor: Update - recovering from squash\n");
+ globalHistory = (history->globalHistory << 1) | taken;
+ globalHistory = globalHistory & globalHistoryMask;
+ }
+ delete history;
+ bp_history = 0;
+ }
+}
+
+void GlobalBP::squash(void *bp_history)
+{
+ DPRINTF(Fetch, "Predictor: Recovering from squash\n");
+ GlobalHistory *history = (GlobalHistory *)bp_history;
+ globalHistory = history->globalHistory;
+ delete history;
+ bp_history = 0;
+}
diff -r 00dca8a9b560 -r d6a0c8ae2edb src/cpu/pred/global.hh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cpu/pred/global.hh Fri May 03 12:36:27 2013 -0600
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2004-2006 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Kevin Lim
+ * Taylor Lloyd
+ */
+
+#ifndef __CPU_PRED_GLOBAL_PRED_HH__
+#define __CPU_PRED_GLOBAL_PRED_HH__
+
+#include <vector>
+
+#include "base/types.hh"
+#include "cpu/pred/bpred_unit.hh"
+#include "cpu/pred/sat_counter.hh"
+
+/**
+ * Implements a set global-global (gAG) predictor. It uses the branch history
+ * to index into a table of counters. Global history is speculatively updated,
+ * and corrected during a squash.
+ */
+class GlobalBP : public BPredUnit
+{
+ public:
+ /**
+ * Default branch predictor constructor.
+ */
+ GlobalBP(const Params *params);
+ /**
+ * Looks up the given address in the branch predictor and returns
+ * a true/false value as to whether it is taken. Also creates a
+ * BPHistory object to store any state it will need on squash/update.
+ * @param branch_addr The address of the branch to look up.
+ * @param bp_history Pointer that will be set to the BPHistory object.
+ * @return Whether or not the branch is taken.
+ */
+ bool lookup(Addr branch_addr, void * &bp_history);
+
+ /**
+ * Records that there was an unconditional branch, and modifies
+ * the bp history to point to an object that has the previous
+ * global history stored in it.
+ * @param bp_history Pointer that will be set to the BPHistory object.
+ */
+ void uncondBranch(void * &bp_history);
+ /**
+ * Updates the branch predictor to Not Taken if a BTB entry is
+ * invalid or not found.
+ * @param branch_addr The address of the branch to look up.
+ * @param bp_history Pointer to any bp history state.
+ * @return Whether or not the branch is taken.
+ */
+ void btbUpdate(Addr branch_addr, void * &bp_history);
+ /**
+ * Updates the branch predictor with the actual result of a branch.
+ * @param branch_addr The address of the branch to update.
+ * @param taken Whether or not the branch was taken.
+ * @param bp_history Pointer to the BPHistory object that was created
+ * when the branch was predicted.
+ * @param squashed is set when this function is called during a squash
+ * operation.
+ */
+ void update(Addr branch_addr, bool taken, void *bp_history, bool squashed);
+
+ /**
+ * Restores the global branch history on a squash.
+ * @param bp_history Pointer to the BPHistory object that has the
+ * previous global branch history in it.
+ */
+ void squash(void *bp_history);
+
+ private:
+ /** Updates global history as taken. */
+ inline void updateGlobalHistTaken();
+
+ /** Updates global history as not taken. */
+ inline void updateGlobalHistNotTaken();
+
+ /**
+ * The branch history information that is created with a prediction.
+ * It's used for recovery upon a squash, and discarded for correct
+ * predictions.
+ */
+ struct GlobalHistory {
+ unsigned globalHistory;
+ bool predTaken;
+ };
+
+ /** Table of the global counters */
+ std::vector<SatCounter> globalCtrs;
+
+ /** Number of entries in the global predictor */
+ unsigned globalPredictorSize;
+
+ /** Number of bits required to index the predictor */
+ unsigned globalHistoryBits;
+
+ /** Number of bits in each counter of the global predictor */
+ unsigned globalCtrBits;
+
+ /** Global history register. */
+ unsigned globalHistory;
+
+ /** The mask to ensure no extra history is stored */
+ unsigned globalHistoryMask;
+
+ /** Counter threshold to decide taken/untaken */
+ unsigned threshold;
+};
+#endif // __CPU_PRED_GLOBAL_PRED_HH__
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev