1/* 2 * Copyright 2019 Texas A&M University 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are met: 6 * 7 * 1. Redistributions of source code must retain the above copyright notice, 8 * this list of conditions and the following disclaimer. 9 * 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 14 * 3. Neither the name of the copyright holder nor the names of its 15 * contributors may be used to endorse or promote products derived from this 16 * software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 * Author: Daniel A. Jiménez 31 * Adapted to gem5 by: Javier Bueno Hedo 32 * 33 */ 34 35/* 36 * Multiperspective Perceptron Predictor with TAGE (by Daniel A. Jiménez) 37 * 64 KB version 38 */ 39 40#include "cpu/pred/multiperspective_perceptron_tage_64KB.hh" 41 42MPP_StatisticalCorrector_64KB::MPP_StatisticalCorrector_64KB( 43 const MPP_StatisticalCorrector_64KBParams *p) 44 : MPP_StatisticalCorrector(p), 45 numEntriesSecondLocalHistories(p->numEntriesSecondLocalHistories), 46 numEntriesThirdLocalHistories(p->numEntriesThirdLocalHistories), 47 snb(p->snb), 48 logSnb(p->logSnb), 49 sm(p->sm), 50 tnb(p->tnb), 51 logTnb(p->logTnb), 52 tm(p->tm) 53{ 54 initGEHLTable(snb, sm, sgehl, logSnb, ws, -1); 55 initGEHLTable(tnb, tm, tgehl, logTnb, wt, -1); 56} 57 58MPP_StatisticalCorrector_64KB::SCThreadHistory* 59MPP_StatisticalCorrector_64KB::makeThreadHistory() 60{ 61 MPP_SCThreadHistory *sh = new MPP_SCThreadHistory(); 62 63 sh->setNumOrdinalHistories(3); 64 sh->initLocalHistory(1, numEntriesFirstLocalHistories, 4); 65 sh->initLocalHistory(2, numEntriesSecondLocalHistories, 5); 66 sh->initLocalHistory(3, numEntriesThirdLocalHistories, 3); 67 68 return sh; 69} 70 71 72void 73MPP_StatisticalCorrector_64KB::getBiasLSUM(Addr branch_pc, 74 StatisticalCorrector::BranchInfo* bi, int &lsum) const 75{ 76 int8_t ctr = bias[getIndBias(branch_pc, bi, false /* unused */)]; 77 lsum += 2.09 * ctr; 78 ctr = biasSK[getIndBiasSK(branch_pc, bi)]; 79 lsum += 2.08 * ctr; 80} 81 82int 83MPP_StatisticalCorrector_64KB::gPredictions(ThreadID tid, Addr branch_pc, 84 StatisticalCorrector::BranchInfo* bi, int & lsum, int64_t phist) 85{ 86 MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory); 87 unsigned int pc = branch_pc; 88 lsum += gPredict((pc << 1) + bi->predBeforeSC, sh->globalHist << 11, 89 gm, ggehl, gnb, logGnb, wg); 90 91 // Local History #1 92 lsum += 2.02 * gPredict(branch_pc, sh->getLocalHistory(1, branch_pc), 93 lm, lgehl, lnb, logLnb, wl); 94 if (sh->getLocalHistory(1, branch_pc) == 2047) lsum += 4; 95 if (sh->getLocalHistory(1, branch_pc) == 0) lsum -= 4; 96 97 // Local History #3 98 lsum += gPredict(branch_pc, sh->getLocalHistory(3, branch_pc) << 11, 99 tm, tgehl, tnb, logTnb, wt); 100 101 // Local History #2 102 lsum += gPredict(branch_pc, sh->getLocalHistory(2, branch_pc), 103 sm, sgehl, snb, logSnb, ws); 104 105 lsum += gPredict(branch_pc, sh->getHistoryStackEntry(), 106 pm, pgehl, pnb, logPnb, wp); 107 108 int thres = pUpdateThreshold[getIndUpd(branch_pc)]; 109 110 return thres; 111} 112 113void 114MPP_StatisticalCorrector_64KB::gUpdates(ThreadID tid, Addr pc, bool taken, 115 StatisticalCorrector::BranchInfo* bi, int64_t phist) 116{ 117 MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory); 118 119 gUpdate((pc << 1) + bi->predBeforeSC, taken, sh->globalHist << 11, 120 gm, ggehl, gnb, logGnb, wg, bi); 121 122 gUpdate(pc, taken, sh->getLocalHistory(1, pc), 123 lm, lgehl, lnb, logLnb, wl, bi); 124 125 gUpdate(pc, taken, sh->getLocalHistory(2, pc), 126 sm, sgehl, snb, logSnb, ws, bi); 127 128 gUpdate(pc, taken, sh->getLocalHistory(3, pc) << 11, 129 tm, tgehl, tnb, logTnb, wt, bi); 130 131 gUpdate(pc, taken, sh->getHistoryStackEntry(), 132 pm, pgehl, pnb, logPnb, wp, bi); 133} 134 135void 136MPP_StatisticalCorrector_64KB::scHistoryUpdate(Addr branch_pc, 137 const StaticInstPtr &inst, bool taken, 138 StatisticalCorrector::BranchInfo *bi, Addr corrTarget) 139{ 140 int brtype = inst->isDirectCtrl() ? 0 : 2; 141 if (! inst->isUncondCtrl()) { 142 ++brtype; 143 } 144 145 MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory); 146 147 if (brtype & 1) { 148 sh->globalHist = (sh->globalHist << 1) + taken; 149 sh->updateLocalHistory(2, branch_pc, taken, 150 (branch_pc ^ (branch_pc >> 4)) & 15); 151 sh->updateLocalHistory(3, branch_pc, taken); 152 } 153 sh->updateHistoryStack(corrTarget, taken, inst->isCall(), 154 inst->isReturn()); 155 156 StatisticalCorrector::scHistoryUpdate(branch_pc, inst, taken, bi, 157 corrTarget); 158} 159 160size_t 161MPP_StatisticalCorrector_64KB::getSizeInBits() const 162{ 163 size_t bits = 16; //global histories 164 165 bits += (1 << logSizeUp) * pUpdateThresholdWidth; 166 167 bits += scCountersWidth * 2 * (1 << logBias); //2 bias arrays 168 169 bits += (gnb - 2) * (1 << logGnb) * (scCountersWidth - 1) + 170 (1 << (logGnb - 1)) * (2 * scCountersWidth - 1); 171 172 bits += (pnb - 2) * (1 << logPnb) * (scCountersWidth - 1) + 173 (1 << (logPnb - 1)) * (2 * scCountersWidth - 1); 174 175 bits += (lnb - 2) * (1 << logLnb) * (scCountersWidth - 1) + 176 (1 << (logLnb - 1)) * (2 * scCountersWidth - 1); 177 178 bits += numEntriesFirstLocalHistories * lm[0]; 179 180 bits += (snb - 2) * (1 << logSnb) * (scCountersWidth - 1) + 181 (1 << (logSnb - 1)) * (2 * scCountersWidth - 1); 182 183 bits += numEntriesSecondLocalHistories * sm[0]; 184 185 bits += (tnb - 2) * (1 << logTnb) * (scCountersWidth - 1) + 186 (1 << (logTnb - 1)) * (2 * scCountersWidth - 1); 187 188 /* tm[0] is artificially increased by 11 to accomodate IMLI */ 189 bits += numEntriesThirdLocalHistories * (tm[0] - 11); 190 191 bits += 16 * 16; // History stack 192 bits += 4; // History stack pointer 193 194 bits += 3 * chooserConfWidth; // 3 chooser counters 195 196 return bits; 197} 198 199MPP_StatisticalCorrector_64KB* 200MPP_StatisticalCorrector_64KBParams::create() 201{ 202 return new MPP_StatisticalCorrector_64KB(this); 203} 204 205 206MultiperspectivePerceptronTAGE64KB::MultiperspectivePerceptronTAGE64KB( 207 const MultiperspectivePerceptronTAGE64KBParams *p) 208 : MultiperspectivePerceptronTAGE(p) 209{ 210} 211 212void 213MultiperspectivePerceptronTAGE64KB::createSpecs() 214{ 215 addSpec(new BLURRYPATH(5, 15, -1, 2.25, 0, 6, *this)); 216 addSpec(new BLURRYPATH(8, 10, -1, 2.25, 0, 6, *this)); 217 addSpec(new RECENCYPOS(31, 3.5, 0, 6, *this)); 218 addSpec(new GHISTMODPATH(3, 7, 1, 2.24, 0, 6, *this)); 219 addSpec(new MODPATH(3, 20, 3, 2.24, 0, 6, *this)); 220 addSpec(new IMLI(1, 2.23, 0, 6, *this)); 221 addSpec(new IMLI(4, 1.98, 0, 6, *this)); 222 addSpec(new RECENCY(9, 3, -1, 2.51, 0, 6, *this)); 223 addSpec(new ACYCLIC(12, -1, -1, 2.0, 0, 6, *this)); 224} 225 226MultiperspectivePerceptronTAGE64KB* 227MultiperspectivePerceptronTAGE64KBParams::create() 228{ 229 return new MultiperspectivePerceptronTAGE64KB(this); 230} 231