114081Sjavier.bueno@metempsy.com/* 214081Sjavier.bueno@metempsy.com * Copyright 2019 Texas A&M University 314081Sjavier.bueno@metempsy.com * 414081Sjavier.bueno@metempsy.com * Redistribution and use in source and binary forms, with or without 514081Sjavier.bueno@metempsy.com * modification, are permitted provided that the following conditions are met: 614081Sjavier.bueno@metempsy.com * 714081Sjavier.bueno@metempsy.com * 1. Redistributions of source code must retain the above copyright notice, 814081Sjavier.bueno@metempsy.com * this list of conditions and the following disclaimer. 914081Sjavier.bueno@metempsy.com * 1014081Sjavier.bueno@metempsy.com * 2. Redistributions in binary form must reproduce the above copyright notice, 1114081Sjavier.bueno@metempsy.com * this list of conditions and the following disclaimer in the documentation 1214081Sjavier.bueno@metempsy.com * and/or other materials provided with the distribution. 1314081Sjavier.bueno@metempsy.com * 1414081Sjavier.bueno@metempsy.com * 3. Neither the name of the copyright holder nor the names of its 1514081Sjavier.bueno@metempsy.com * contributors may be used to endorse or promote products derived from this 1614081Sjavier.bueno@metempsy.com * software without specific prior written permission. 1714081Sjavier.bueno@metempsy.com * 1814081Sjavier.bueno@metempsy.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1914081Sjavier.bueno@metempsy.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2014081Sjavier.bueno@metempsy.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2114081Sjavier.bueno@metempsy.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2214081Sjavier.bueno@metempsy.com * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2314081Sjavier.bueno@metempsy.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2414081Sjavier.bueno@metempsy.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2514081Sjavier.bueno@metempsy.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2614081Sjavier.bueno@metempsy.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2714081Sjavier.bueno@metempsy.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2814081Sjavier.bueno@metempsy.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2914081Sjavier.bueno@metempsy.com * 3014081Sjavier.bueno@metempsy.com * Author: Daniel A. Jiménez 3114081Sjavier.bueno@metempsy.com * Adapted to gem5 by: Javier Bueno Hedo 3214081Sjavier.bueno@metempsy.com * 3314081Sjavier.bueno@metempsy.com */ 3414081Sjavier.bueno@metempsy.com 3514081Sjavier.bueno@metempsy.com/* 3614081Sjavier.bueno@metempsy.com * Multiperspective Perceptron Predictor with TAGE (by Daniel A. Jiménez) 3714081Sjavier.bueno@metempsy.com * 64 KB version 3814081Sjavier.bueno@metempsy.com */ 3914081Sjavier.bueno@metempsy.com 4014081Sjavier.bueno@metempsy.com#include "cpu/pred/multiperspective_perceptron_tage_64KB.hh" 4114081Sjavier.bueno@metempsy.com 4214081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_64KB::MPP_StatisticalCorrector_64KB( 4314081Sjavier.bueno@metempsy.com const MPP_StatisticalCorrector_64KBParams *p) 4414081Sjavier.bueno@metempsy.com : MPP_StatisticalCorrector(p), 4514081Sjavier.bueno@metempsy.com numEntriesSecondLocalHistories(p->numEntriesSecondLocalHistories), 4614081Sjavier.bueno@metempsy.com numEntriesThirdLocalHistories(p->numEntriesThirdLocalHistories), 4714081Sjavier.bueno@metempsy.com snb(p->snb), 4814081Sjavier.bueno@metempsy.com logSnb(p->logSnb), 4914081Sjavier.bueno@metempsy.com sm(p->sm), 5014081Sjavier.bueno@metempsy.com tnb(p->tnb), 5114081Sjavier.bueno@metempsy.com logTnb(p->logTnb), 5214081Sjavier.bueno@metempsy.com tm(p->tm) 5314081Sjavier.bueno@metempsy.com{ 5414081Sjavier.bueno@metempsy.com initGEHLTable(snb, sm, sgehl, logSnb, ws, -1); 5514081Sjavier.bueno@metempsy.com initGEHLTable(tnb, tm, tgehl, logTnb, wt, -1); 5614081Sjavier.bueno@metempsy.com} 5714081Sjavier.bueno@metempsy.com 5814081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_64KB::SCThreadHistory* 5914081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_64KB::makeThreadHistory() 6014081Sjavier.bueno@metempsy.com{ 6114081Sjavier.bueno@metempsy.com MPP_SCThreadHistory *sh = new MPP_SCThreadHistory(); 6214081Sjavier.bueno@metempsy.com 6314081Sjavier.bueno@metempsy.com sh->setNumOrdinalHistories(3); 6414081Sjavier.bueno@metempsy.com sh->initLocalHistory(1, numEntriesFirstLocalHistories, 4); 6514081Sjavier.bueno@metempsy.com sh->initLocalHistory(2, numEntriesSecondLocalHistories, 5); 6614081Sjavier.bueno@metempsy.com sh->initLocalHistory(3, numEntriesThirdLocalHistories, 3); 6714081Sjavier.bueno@metempsy.com 6814081Sjavier.bueno@metempsy.com return sh; 6914081Sjavier.bueno@metempsy.com} 7014081Sjavier.bueno@metempsy.com 7114081Sjavier.bueno@metempsy.com 7214081Sjavier.bueno@metempsy.comvoid 7314081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_64KB::getBiasLSUM(Addr branch_pc, 7414081Sjavier.bueno@metempsy.com StatisticalCorrector::BranchInfo* bi, int &lsum) const 7514081Sjavier.bueno@metempsy.com{ 7614081Sjavier.bueno@metempsy.com int8_t ctr = bias[getIndBias(branch_pc, bi, false /* unused */)]; 7714081Sjavier.bueno@metempsy.com lsum += 2.09 * ctr; 7814081Sjavier.bueno@metempsy.com ctr = biasSK[getIndBiasSK(branch_pc, bi)]; 7914081Sjavier.bueno@metempsy.com lsum += 2.08 * ctr; 8014081Sjavier.bueno@metempsy.com} 8114081Sjavier.bueno@metempsy.com 8214081Sjavier.bueno@metempsy.comint 8314081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_64KB::gPredictions(ThreadID tid, Addr branch_pc, 8414081Sjavier.bueno@metempsy.com StatisticalCorrector::BranchInfo* bi, int & lsum, int64_t phist) 8514081Sjavier.bueno@metempsy.com{ 8614081Sjavier.bueno@metempsy.com MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory); 8714081Sjavier.bueno@metempsy.com unsigned int pc = branch_pc; 8814081Sjavier.bueno@metempsy.com lsum += gPredict((pc << 1) + bi->predBeforeSC, sh->globalHist << 11, 8914081Sjavier.bueno@metempsy.com gm, ggehl, gnb, logGnb, wg); 9014081Sjavier.bueno@metempsy.com 9114081Sjavier.bueno@metempsy.com // Local History #1 9214081Sjavier.bueno@metempsy.com lsum += 2.02 * gPredict(branch_pc, sh->getLocalHistory(1, branch_pc), 9314081Sjavier.bueno@metempsy.com lm, lgehl, lnb, logLnb, wl); 9414081Sjavier.bueno@metempsy.com if (sh->getLocalHistory(1, branch_pc) == 2047) lsum += 4; 9514081Sjavier.bueno@metempsy.com if (sh->getLocalHistory(1, branch_pc) == 0) lsum -= 4; 9614081Sjavier.bueno@metempsy.com 9714081Sjavier.bueno@metempsy.com // Local History #3 9814081Sjavier.bueno@metempsy.com lsum += gPredict(branch_pc, sh->getLocalHistory(3, branch_pc) << 11, 9914081Sjavier.bueno@metempsy.com tm, tgehl, tnb, logTnb, wt); 10014081Sjavier.bueno@metempsy.com 10114081Sjavier.bueno@metempsy.com // Local History #2 10214081Sjavier.bueno@metempsy.com lsum += gPredict(branch_pc, sh->getLocalHistory(2, branch_pc), 10314081Sjavier.bueno@metempsy.com sm, sgehl, snb, logSnb, ws); 10414081Sjavier.bueno@metempsy.com 10514081Sjavier.bueno@metempsy.com lsum += gPredict(branch_pc, sh->getHistoryStackEntry(), 10614081Sjavier.bueno@metempsy.com pm, pgehl, pnb, logPnb, wp); 10714081Sjavier.bueno@metempsy.com 10814081Sjavier.bueno@metempsy.com int thres = pUpdateThreshold[getIndUpd(branch_pc)]; 10914081Sjavier.bueno@metempsy.com 11014081Sjavier.bueno@metempsy.com return thres; 11114081Sjavier.bueno@metempsy.com} 11214081Sjavier.bueno@metempsy.com 11314081Sjavier.bueno@metempsy.comvoid 11414081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_64KB::gUpdates(ThreadID tid, Addr pc, bool taken, 11514081Sjavier.bueno@metempsy.com StatisticalCorrector::BranchInfo* bi, int64_t phist) 11614081Sjavier.bueno@metempsy.com{ 11714081Sjavier.bueno@metempsy.com MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory); 11814081Sjavier.bueno@metempsy.com 11914081Sjavier.bueno@metempsy.com gUpdate((pc << 1) + bi->predBeforeSC, taken, sh->globalHist << 11, 12014081Sjavier.bueno@metempsy.com gm, ggehl, gnb, logGnb, wg, bi); 12114081Sjavier.bueno@metempsy.com 12214081Sjavier.bueno@metempsy.com gUpdate(pc, taken, sh->getLocalHistory(1, pc), 12314081Sjavier.bueno@metempsy.com lm, lgehl, lnb, logLnb, wl, bi); 12414081Sjavier.bueno@metempsy.com 12514081Sjavier.bueno@metempsy.com gUpdate(pc, taken, sh->getLocalHistory(2, pc), 12614081Sjavier.bueno@metempsy.com sm, sgehl, snb, logSnb, ws, bi); 12714081Sjavier.bueno@metempsy.com 12814081Sjavier.bueno@metempsy.com gUpdate(pc, taken, sh->getLocalHistory(3, pc) << 11, 12914081Sjavier.bueno@metempsy.com tm, tgehl, tnb, logTnb, wt, bi); 13014081Sjavier.bueno@metempsy.com 13114081Sjavier.bueno@metempsy.com gUpdate(pc, taken, sh->getHistoryStackEntry(), 13214081Sjavier.bueno@metempsy.com pm, pgehl, pnb, logPnb, wp, bi); 13314081Sjavier.bueno@metempsy.com} 13414081Sjavier.bueno@metempsy.com 13514081Sjavier.bueno@metempsy.comvoid 13614081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_64KB::scHistoryUpdate(Addr branch_pc, 13714081Sjavier.bueno@metempsy.com const StaticInstPtr &inst, bool taken, 13814081Sjavier.bueno@metempsy.com StatisticalCorrector::BranchInfo *bi, Addr corrTarget) 13914081Sjavier.bueno@metempsy.com{ 14014081Sjavier.bueno@metempsy.com int brtype = inst->isDirectCtrl() ? 0 : 2; 14114081Sjavier.bueno@metempsy.com if (! inst->isUncondCtrl()) { 14214081Sjavier.bueno@metempsy.com ++brtype; 14314081Sjavier.bueno@metempsy.com } 14414081Sjavier.bueno@metempsy.com 14514081Sjavier.bueno@metempsy.com MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory); 14614081Sjavier.bueno@metempsy.com 14714081Sjavier.bueno@metempsy.com if (brtype & 1) { 14814081Sjavier.bueno@metempsy.com sh->globalHist = (sh->globalHist << 1) + taken; 14914081Sjavier.bueno@metempsy.com sh->updateLocalHistory(2, branch_pc, taken, 15014081Sjavier.bueno@metempsy.com (branch_pc ^ (branch_pc >> 4)) & 15); 15114081Sjavier.bueno@metempsy.com sh->updateLocalHistory(3, branch_pc, taken); 15214081Sjavier.bueno@metempsy.com } 15314081Sjavier.bueno@metempsy.com sh->updateHistoryStack(corrTarget, taken, inst->isCall(), 15414081Sjavier.bueno@metempsy.com inst->isReturn()); 15514081Sjavier.bueno@metempsy.com 15614081Sjavier.bueno@metempsy.com StatisticalCorrector::scHistoryUpdate(branch_pc, inst, taken, bi, 15714081Sjavier.bueno@metempsy.com corrTarget); 15814081Sjavier.bueno@metempsy.com} 15914081Sjavier.bueno@metempsy.com 16014081Sjavier.bueno@metempsy.comsize_t 16114081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_64KB::getSizeInBits() const 16214081Sjavier.bueno@metempsy.com{ 16314081Sjavier.bueno@metempsy.com size_t bits = 16; //global histories 16414081Sjavier.bueno@metempsy.com 16514081Sjavier.bueno@metempsy.com bits += (1 << logSizeUp) * pUpdateThresholdWidth; 16614081Sjavier.bueno@metempsy.com 16714081Sjavier.bueno@metempsy.com bits += scCountersWidth * 2 * (1 << logBias); //2 bias arrays 16814081Sjavier.bueno@metempsy.com 16914081Sjavier.bueno@metempsy.com bits += (gnb - 2) * (1 << logGnb) * (scCountersWidth - 1) + 17014081Sjavier.bueno@metempsy.com (1 << (logGnb - 1)) * (2 * scCountersWidth - 1); 17114081Sjavier.bueno@metempsy.com 17214081Sjavier.bueno@metempsy.com bits += (pnb - 2) * (1 << logPnb) * (scCountersWidth - 1) + 17314081Sjavier.bueno@metempsy.com (1 << (logPnb - 1)) * (2 * scCountersWidth - 1); 17414081Sjavier.bueno@metempsy.com 17514081Sjavier.bueno@metempsy.com bits += (lnb - 2) * (1 << logLnb) * (scCountersWidth - 1) + 17614081Sjavier.bueno@metempsy.com (1 << (logLnb - 1)) * (2 * scCountersWidth - 1); 17714081Sjavier.bueno@metempsy.com 17814081Sjavier.bueno@metempsy.com bits += numEntriesFirstLocalHistories * lm[0]; 17914081Sjavier.bueno@metempsy.com 18014081Sjavier.bueno@metempsy.com bits += (snb - 2) * (1 << logSnb) * (scCountersWidth - 1) + 18114081Sjavier.bueno@metempsy.com (1 << (logSnb - 1)) * (2 * scCountersWidth - 1); 18214081Sjavier.bueno@metempsy.com 18314081Sjavier.bueno@metempsy.com bits += numEntriesSecondLocalHistories * sm[0]; 18414081Sjavier.bueno@metempsy.com 18514081Sjavier.bueno@metempsy.com bits += (tnb - 2) * (1 << logTnb) * (scCountersWidth - 1) + 18614081Sjavier.bueno@metempsy.com (1 << (logTnb - 1)) * (2 * scCountersWidth - 1); 18714081Sjavier.bueno@metempsy.com 18814081Sjavier.bueno@metempsy.com /* tm[0] is artificially increased by 11 to accomodate IMLI */ 18914081Sjavier.bueno@metempsy.com bits += numEntriesThirdLocalHistories * (tm[0] - 11); 19014081Sjavier.bueno@metempsy.com 19114081Sjavier.bueno@metempsy.com bits += 16 * 16; // History stack 19214081Sjavier.bueno@metempsy.com bits += 4; // History stack pointer 19314081Sjavier.bueno@metempsy.com 19414081Sjavier.bueno@metempsy.com bits += 3 * chooserConfWidth; // 3 chooser counters 19514081Sjavier.bueno@metempsy.com 19614081Sjavier.bueno@metempsy.com return bits; 19714081Sjavier.bueno@metempsy.com} 19814081Sjavier.bueno@metempsy.com 19914081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_64KB* 20014081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_64KBParams::create() 20114081Sjavier.bueno@metempsy.com{ 20214081Sjavier.bueno@metempsy.com return new MPP_StatisticalCorrector_64KB(this); 20314081Sjavier.bueno@metempsy.com} 20414081Sjavier.bueno@metempsy.com 20514081Sjavier.bueno@metempsy.com 20614081Sjavier.bueno@metempsy.comMultiperspectivePerceptronTAGE64KB::MultiperspectivePerceptronTAGE64KB( 20714081Sjavier.bueno@metempsy.com const MultiperspectivePerceptronTAGE64KBParams *p) 20814081Sjavier.bueno@metempsy.com : MultiperspectivePerceptronTAGE(p) 20914081Sjavier.bueno@metempsy.com{ 21014081Sjavier.bueno@metempsy.com} 21114081Sjavier.bueno@metempsy.com 21214081Sjavier.bueno@metempsy.comvoid 21314081Sjavier.bueno@metempsy.comMultiperspectivePerceptronTAGE64KB::createSpecs() 21414081Sjavier.bueno@metempsy.com{ 21514081Sjavier.bueno@metempsy.com addSpec(new BLURRYPATH(5, 15, -1, 2.25, 0, 6, *this)); 21614081Sjavier.bueno@metempsy.com addSpec(new BLURRYPATH(8, 10, -1, 2.25, 0, 6, *this)); 21714081Sjavier.bueno@metempsy.com addSpec(new RECENCYPOS(31, 3.5, 0, 6, *this)); 21814081Sjavier.bueno@metempsy.com addSpec(new GHISTMODPATH(3, 7, 1, 2.24, 0, 6, *this)); 21914081Sjavier.bueno@metempsy.com addSpec(new MODPATH(3, 20, 3, 2.24, 0, 6, *this)); 22014081Sjavier.bueno@metempsy.com addSpec(new IMLI(1, 2.23, 0, 6, *this)); 22114081Sjavier.bueno@metempsy.com addSpec(new IMLI(4, 1.98, 0, 6, *this)); 22214081Sjavier.bueno@metempsy.com addSpec(new RECENCY(9, 3, -1, 2.51, 0, 6, *this)); 22314081Sjavier.bueno@metempsy.com addSpec(new ACYCLIC(12, -1, -1, 2.0, 0, 6, *this)); 22414081Sjavier.bueno@metempsy.com} 22514081Sjavier.bueno@metempsy.com 22614081Sjavier.bueno@metempsy.comMultiperspectivePerceptronTAGE64KB* 22714081Sjavier.bueno@metempsy.comMultiperspectivePerceptronTAGE64KBParams::create() 22814081Sjavier.bueno@metempsy.com{ 22914081Sjavier.bueno@metempsy.com return new MultiperspectivePerceptronTAGE64KB(this); 23014081Sjavier.bueno@metempsy.com} 231