multiperspective_perceptron_tage_8KB.cc revision 14081
13569Sgblack@eecs.umich.edu/*
23569Sgblack@eecs.umich.edu * Copyright 2019 Texas A&M University
33569Sgblack@eecs.umich.edu *
43569Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
53569Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are met:
63569Sgblack@eecs.umich.edu *
73569Sgblack@eecs.umich.edu * 1. Redistributions of source code must retain the above copyright notice,
83569Sgblack@eecs.umich.edu *    this list of conditions and the following disclaimer.
93569Sgblack@eecs.umich.edu *
103569Sgblack@eecs.umich.edu * 2. Redistributions in binary form must reproduce the above copyright notice,
113569Sgblack@eecs.umich.edu *    this list of conditions and the following disclaimer in the documentation
123569Sgblack@eecs.umich.edu *    and/or other materials provided with the distribution.
133569Sgblack@eecs.umich.edu *
143569Sgblack@eecs.umich.edu * 3. Neither the name of the copyright holder nor the names of its
153569Sgblack@eecs.umich.edu *    contributors may be used to endorse or promote products derived from this
163569Sgblack@eecs.umich.edu *    software without specific prior written permission.
173569Sgblack@eecs.umich.edu *
183569Sgblack@eecs.umich.edu *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
193569Sgblack@eecs.umich.edu *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
203569Sgblack@eecs.umich.edu *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
213569Sgblack@eecs.umich.edu *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
223569Sgblack@eecs.umich.edu *  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
233569Sgblack@eecs.umich.edu *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
243569Sgblack@eecs.umich.edu *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
253569Sgblack@eecs.umich.edu *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
263569Sgblack@eecs.umich.edu *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
273569Sgblack@eecs.umich.edu *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
283804Ssaidi@eecs.umich.edu *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
293569Sgblack@eecs.umich.edu *
303569Sgblack@eecs.umich.edu *  Author: Daniel A. Jiménez
313918Ssaidi@eecs.umich.edu *  Adapted to gem5 by: Javier Bueno Hedo
323918Ssaidi@eecs.umich.edu *
333804Ssaidi@eecs.umich.edu */
343811Ssaidi@eecs.umich.edu
353569Sgblack@eecs.umich.edu/*
363824Ssaidi@eecs.umich.edu * Multiperspective Perceptron Predictor with TAGE (by Daniel A. Jiménez)
373811Ssaidi@eecs.umich.edu * 8 KB version
383811Ssaidi@eecs.umich.edu */
393823Ssaidi@eecs.umich.edu
403823Ssaidi@eecs.umich.edu#include "cpu/pred/multiperspective_perceptron_tage_8KB.hh"
413823Ssaidi@eecs.umich.edu
424103Ssaidi@eecs.umich.eduMPP_TAGE_8KB*
433569Sgblack@eecs.umich.eduMPP_TAGE_8KBParams::create()
443804Ssaidi@eecs.umich.edu{
453804Ssaidi@eecs.umich.edu    return new MPP_TAGE_8KB(this);
464088Sbinkertn@umich.edu}
473569Sgblack@eecs.umich.edu
485034Smilesck@eecs.umich.eduMPP_LoopPredictor_8KB*
495358Sgblack@eecs.umich.eduMPP_LoopPredictor_8KBParams::create()
503881Ssaidi@eecs.umich.edu{
513804Ssaidi@eecs.umich.edu    return new MPP_LoopPredictor_8KB(this);
523804Ssaidi@eecs.umich.edu}
533804Ssaidi@eecs.umich.edu
543804Ssaidi@eecs.umich.eduMPP_StatisticalCorrector_8KB::MPP_StatisticalCorrector_8KB(
553569Sgblack@eecs.umich.edu        const MPP_StatisticalCorrector_8KBParams *p)
563804Ssaidi@eecs.umich.edu  : MPP_StatisticalCorrector(p)
573918Ssaidi@eecs.umich.edu{
583881Ssaidi@eecs.umich.edu}
593881Ssaidi@eecs.umich.edu
603881Ssaidi@eecs.umich.eduMPP_StatisticalCorrector_8KB::SCThreadHistory*
614990Sgblack@eecs.umich.eduMPP_StatisticalCorrector_8KB::makeThreadHistory()
624990Sgblack@eecs.umich.edu{
634990Sgblack@eecs.umich.edu    MPP_SCThreadHistory *sh = new MPP_SCThreadHistory();
644990Sgblack@eecs.umich.edu
654990Sgblack@eecs.umich.edu    sh->setNumOrdinalHistories(1);
664990Sgblack@eecs.umich.edu    sh->initLocalHistory(1, numEntriesFirstLocalHistories, 4);
674990Sgblack@eecs.umich.edu
684990Sgblack@eecs.umich.edu    return sh;
694990Sgblack@eecs.umich.edu}
703804Ssaidi@eecs.umich.edu
713569Sgblack@eecs.umich.eduvoid
723804Ssaidi@eecs.umich.eduMPP_StatisticalCorrector_8KB::getBiasLSUM(Addr branch_pc,
733804Ssaidi@eecs.umich.edu        StatisticalCorrector::BranchInfo* bi, int &lsum) const
743804Ssaidi@eecs.umich.edu{
753804Ssaidi@eecs.umich.edu    int8_t ctr = bias[getIndBias(branch_pc, bi, false /* unused */)];
763881Ssaidi@eecs.umich.edu    lsum += 2 * ctr + 1;
773804Ssaidi@eecs.umich.edu    ctr = biasSK[getIndBiasSK(branch_pc, bi)];
783804Ssaidi@eecs.umich.edu    lsum += 2 * ctr + 1;
793804Ssaidi@eecs.umich.edu}
803804Ssaidi@eecs.umich.edu
813804Ssaidi@eecs.umich.eduint
823804Ssaidi@eecs.umich.eduMPP_StatisticalCorrector_8KB::gPredictions(ThreadID tid, Addr branch_pc,
833804Ssaidi@eecs.umich.edu        StatisticalCorrector::BranchInfo* bi, int & lsum, int64_t phist)
843569Sgblack@eecs.umich.edu{
853569Sgblack@eecs.umich.edu    MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory);
863804Ssaidi@eecs.umich.edu    unsigned int pc = branch_pc;
873804Ssaidi@eecs.umich.edu    lsum += gPredict((pc << 1) + bi->predBeforeSC, sh->globalHist << 11,
883826Ssaidi@eecs.umich.edu                     gm, ggehl, gnb, logGnb, wg);
893804Ssaidi@eecs.umich.edu
903569Sgblack@eecs.umich.edu    // Local History #1
913569Sgblack@eecs.umich.edu    lsum += 2 * gPredict(branch_pc, sh->getLocalHistory(1, branch_pc),
923804Ssaidi@eecs.umich.edu                         lm, lgehl, lnb, logLnb, wl);
933826Ssaidi@eecs.umich.edu    if (sh->getLocalHistory(1, branch_pc) == 2047) lsum += 4;
943907Ssaidi@eecs.umich.edu    if (sh->getLocalHistory(1, branch_pc) == 0) lsum -= 4;
953826Ssaidi@eecs.umich.edu
963811Ssaidi@eecs.umich.edu    lsum += gPredict(branch_pc, sh->getHistoryStackEntry(),
973836Ssaidi@eecs.umich.edu                     pm, pgehl, pnb, logPnb, wp);
983915Ssaidi@eecs.umich.edu
993907Ssaidi@eecs.umich.edu    int thres = pUpdateThreshold[getIndUpd(branch_pc)];
1003881Ssaidi@eecs.umich.edu
1013881Ssaidi@eecs.umich.edu    return thres;
1023881Ssaidi@eecs.umich.edu}
1033881Ssaidi@eecs.umich.edu
1043907Ssaidi@eecs.umich.eduvoid
1053881Ssaidi@eecs.umich.eduMPP_StatisticalCorrector_8KB::gUpdates(ThreadID tid, Addr pc, bool taken,
1063881Ssaidi@eecs.umich.edu        StatisticalCorrector::BranchInfo* bi, int64_t phist)
1073881Ssaidi@eecs.umich.edu{
1083881Ssaidi@eecs.umich.edu    MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory);
1093881Ssaidi@eecs.umich.edu
1103907Ssaidi@eecs.umich.edu    gUpdate((pc << 1) + bi->predBeforeSC, taken, sh->globalHist << 11,
1113907Ssaidi@eecs.umich.edu            gm, ggehl, gnb, logGnb, wg, bi);
1123907Ssaidi@eecs.umich.edu
1133907Ssaidi@eecs.umich.edu    gUpdate(pc, taken, sh->getLocalHistory(1, pc),
1143907Ssaidi@eecs.umich.edu            lm, lgehl, lnb, logLnb, wl, bi);
1153907Ssaidi@eecs.umich.edu
1163907Ssaidi@eecs.umich.edu    gUpdate(pc, taken, sh->getHistoryStackEntry(),
1173907Ssaidi@eecs.umich.edu            pm, pgehl, pnb, logPnb, wp, bi);
1183907Ssaidi@eecs.umich.edu}
1193907Ssaidi@eecs.umich.edu
1203907Ssaidi@eecs.umich.eduvoid
1213907Ssaidi@eecs.umich.eduMPP_StatisticalCorrector_8KB::scHistoryUpdate(Addr branch_pc,
1223907Ssaidi@eecs.umich.edu        const StaticInstPtr &inst, bool taken,
1233907Ssaidi@eecs.umich.edu        StatisticalCorrector::BranchInfo *bi, Addr corrTarget)
1243907Ssaidi@eecs.umich.edu{
1253907Ssaidi@eecs.umich.edu    int brtype = inst->isDirectCtrl() ? 0 : 2;
1263907Ssaidi@eecs.umich.edu    if (! inst->isUncondCtrl()) {
1273907Ssaidi@eecs.umich.edu        ++brtype;
1283907Ssaidi@eecs.umich.edu    }
1293907Ssaidi@eecs.umich.edu
1303907Ssaidi@eecs.umich.edu    MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory);
1313907Ssaidi@eecs.umich.edu
1323907Ssaidi@eecs.umich.edu    if (brtype & 1) {
1333881Ssaidi@eecs.umich.edu        sh->globalHist = (sh->globalHist << 1) + taken;
1343881Ssaidi@eecs.umich.edu    }
1353881Ssaidi@eecs.umich.edu    sh->updateHistoryStack(corrTarget, taken, inst->isCall(),
1363881Ssaidi@eecs.umich.edu                           inst->isReturn());
1373881Ssaidi@eecs.umich.edu
1383881Ssaidi@eecs.umich.edu    StatisticalCorrector::scHistoryUpdate(branch_pc, inst, taken, bi,
1393881Ssaidi@eecs.umich.edu                                          corrTarget);
1403881Ssaidi@eecs.umich.edu}
1413881Ssaidi@eecs.umich.edu
1423881Ssaidi@eecs.umich.edusize_t
1433881Ssaidi@eecs.umich.eduMPP_StatisticalCorrector_8KB::getSizeInBits() const
1443881Ssaidi@eecs.umich.edu{
1453907Ssaidi@eecs.umich.edu    size_t bits = 16; //global histories
1463811Ssaidi@eecs.umich.edu
1473826Ssaidi@eecs.umich.edu    bits += (1 << logSizeUp) * pUpdateThresholdWidth;
1483826Ssaidi@eecs.umich.edu
1493826Ssaidi@eecs.umich.edu    bits += scCountersWidth * 2 * (1 << logBias); //2 bias arrays
1503826Ssaidi@eecs.umich.edu
1513881Ssaidi@eecs.umich.edu    bits += (gnb - 2) * (1 << logGnb) * (scCountersWidth - 1) +
1523881Ssaidi@eecs.umich.edu            (1 << (logGnb - 1)) * (2 * scCountersWidth - 1);
1533881Ssaidi@eecs.umich.edu
1543881Ssaidi@eecs.umich.edu    bits += (pnb - 2) * (1 << logPnb) * (scCountersWidth - 1) +
1553881Ssaidi@eecs.umich.edu            (1 << (logPnb - 1)) * (2 * scCountersWidth - 1);
1563881Ssaidi@eecs.umich.edu
1573881Ssaidi@eecs.umich.edu    bits += (lnb - 2) * (1 << logLnb) * (scCountersWidth - 1) +
1583881Ssaidi@eecs.umich.edu            (1 << (logLnb - 1)) * (2 * scCountersWidth - 1);
1593881Ssaidi@eecs.umich.edu
1603881Ssaidi@eecs.umich.edu    bits += numEntriesFirstLocalHistories * lm[0];
1613881Ssaidi@eecs.umich.edu
1623881Ssaidi@eecs.umich.edu    bits += 16 * 16; // History stack
1633881Ssaidi@eecs.umich.edu    bits += 4;       // History stack pointer
1643881Ssaidi@eecs.umich.edu
1653881Ssaidi@eecs.umich.edu    bits += 3 * chooserConfWidth; // 3 chooser counters
1663826Ssaidi@eecs.umich.edu
1673826Ssaidi@eecs.umich.edu    return bits;
1683826Ssaidi@eecs.umich.edu}
1693826Ssaidi@eecs.umich.edu
1703826Ssaidi@eecs.umich.eduMPP_StatisticalCorrector_8KB*
1713881Ssaidi@eecs.umich.eduMPP_StatisticalCorrector_8KBParams::create()
1723569Sgblack@eecs.umich.edu{
1733569Sgblack@eecs.umich.edu    return new MPP_StatisticalCorrector_8KB(this);
1743881Ssaidi@eecs.umich.edu}
1753804Ssaidi@eecs.umich.edu
1763881Ssaidi@eecs.umich.eduMultiperspectivePerceptronTAGE8KB::MultiperspectivePerceptronTAGE8KB(
1773826Ssaidi@eecs.umich.edu        const MultiperspectivePerceptronTAGE8KBParams *p)
1783881Ssaidi@eecs.umich.edu    : MultiperspectivePerceptronTAGE(p)
1793881Ssaidi@eecs.umich.edu{
1803881Ssaidi@eecs.umich.edu}
1813907Ssaidi@eecs.umich.edu
1823907Ssaidi@eecs.umich.eduvoid
1833929Ssaidi@eecs.umich.eduMultiperspectivePerceptronTAGE8KB::createSpecs()
1843929Ssaidi@eecs.umich.edu{
1853907Ssaidi@eecs.umich.edu    addSpec(new BLURRYPATH(5, 15, -1, 2.25, 0, 6, *this));
1863907Ssaidi@eecs.umich.edu    addSpec(new RECENCYPOS(31, 3.5, 0, 6, *this));
1873804Ssaidi@eecs.umich.edu    addSpec(new GHISTMODPATH(3, 7, 1, 2.24, 0, 6, *this));
1883804Ssaidi@eecs.umich.edu    addSpec(new IMLI(1, 2.23, 0, 6, *this));
1893881Ssaidi@eecs.umich.edu    addSpec(new IMLI(4, 1.98, 0, 6, *this));
1903804Ssaidi@eecs.umich.edu}
1913804Ssaidi@eecs.umich.edu
1923804Ssaidi@eecs.umich.eduMultiperspectivePerceptronTAGE8KB*
1933804Ssaidi@eecs.umich.eduMultiperspectivePerceptronTAGE8KBParams::create()
1943804Ssaidi@eecs.umich.edu{
1953804Ssaidi@eecs.umich.edu    return new MultiperspectivePerceptronTAGE8KB(this);
1963804Ssaidi@eecs.umich.edu}
1973569Sgblack@eecs.umich.edu