hybrid_pred.hh
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· HH 代码 · 共 205 行
HH
205 行
/* * Copyright (c) 2001, 2002, 2003, 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. * * Authors: Steven E. Raasch * Steven K. Reinhardt *///==========================================================================//// This predictor takes the AND of a "local" and a "global" predictor// in order to determine its prediction.////////#ifndef __HYBRID_PRED_HH__#define __HYBRID_PRED_HH__#include <string>#include "base/sat_counter.hh"#include "base/statistics.hh"class HybridPredictor : public GenericPredictor{ private: std::string pred_name; std::string one_name; std::string zero_name; bool reg_individual_stats; SaturatingCounterPred *local; SaturatingCounterPred *global; unsigned long max_index; // // Stats // Stats::Scalar<> pred_one; //num_one_preds Stats::Scalar<> pred_zero; //num_zero_preds Stats::Scalar<> correct_pred_one; //num_one_correct Stats::Scalar<> correct_pred_zero; //num_zero_correct Stats::Scalar<> record_one; //num_one_updates Stats::Scalar<> record_zero; //num_zero_updates Stats::Formula total_preds; Stats::Formula frac_preds_zero; Stats::Formula frac_preds_one; Stats::Formula total_correct; Stats::Formula total_accuracy; Stats::Formula zero_accuracy; Stats::Formula one_accuracy; Stats::Formula zero_coverage; Stats::Formula one_coverage; public: HybridPredictor(const char *_p_name, const char *_z_name, const char *_o_name, unsigned _index_bits, unsigned _counter_bits, unsigned _zero_change, unsigned _one_change, unsigned _thresh, unsigned _global_bits, unsigned _global_thresh, bool _reg_individual_stats = false); void clear() { global->clear(); local->clear(); } unsigned peek(unsigned long _index) { unsigned l = local->peek(_index); unsigned g = global->peek(_index); if (l && g) return 1; return 0; } unsigned value(unsigned long _index) { unsigned l = local->peek(_index); unsigned g = global->peek(_index); l = l & 0xFFFF; g = g & 0xFFFF; return (l << 16) | g; } unsigned predict(unsigned long _index) { unsigned l = local->predict(_index); unsigned g = global->predict(_index); if (l && g) { ++pred_one; return 1; } ++pred_zero; return 0; } // // This version need only be used if local/global statistics // will be maintained // unsigned predict(unsigned long _index, unsigned &_pdata) { unsigned l = local->predict(_index); unsigned g = global->predict(_index); // // bit 0 => local predictor result // bit 1 => global predictor result // _pdata = 0; if (l) _pdata |= 1; if (g) _pdata |= 2; if (l && g) { ++pred_one; return 1; } ++pred_zero; return 0; } void record(unsigned long _index, unsigned _val, unsigned _predicted) { if (_val) { local->record(_index, _val, 0); global->record(_index, _val, 0); ++record_one; if (_val == _predicted) { ++correct_pred_one; } } else { local->record(_index, _val, 0); global->record(_index, _val, 0); ++record_zero; if (_val == _predicted) ++correct_pred_zero; } } void record(unsigned long _index, unsigned _val, unsigned _predicted, unsigned _pdata) { local->record(_index, _val, (_pdata & 1)); global->record(_index, _val, ((_pdata & 2) ? 1 : 0)); if (_val) { ++record_one; if (_val == _predicted) ++correct_pred_one; } else { ++record_zero; if (_val == _predicted) ++correct_pred_zero; } } void regStats(); void regFormulas();};#endif // _HYBRID_PRED_HH__
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?