sat_counter.hh

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· HH 代码 · 共 194 行

HH
194
字号
/* * 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 */#ifndef __SAT_COUNTER_HH__#define __SAT_COUNTER_HH__#include <string>#include "base/predictor.hh"#include "base/statistics.hh"#include "sim/stats.hh"//////  A simple saturating counter predictor////class SaturatingCounterPred : public GenericPredictor{  private:    std::string   pred_name;    std::string   zero_name;    std::string   one_name;    unsigned index_bits;    unsigned counter_bits;    unsigned zero_change;    unsigned one_change;    unsigned thresh;    unsigned init_value;    unsigned max_value;       // maximum counter value    unsigned long max_index;  // also the index mask value    unsigned *table;    //  Statistics    Stats::Scalar<> predicted_one;      // Total predictions of one, preds_one    Stats::Scalar<> predicted_zero;     // Total predictions of zero, preds_zero    Stats::Scalar<> correct_pred_one;   // Total correct predictions of one, correct_one    Stats::Scalar<> correct_pred_zero;  // Total correct predictions of zero, correct_zero    Stats::Scalar<> record_zero;        //updates_zero    Stats::Scalar<> record_one;         //updates_one    Stats::Formula preds_total;    Stats::Formula pred_frac_zero;    Stats::Formula pred_frac_one;    Stats::Formula correct_total;    Stats::Formula updates_total;    Stats::Formula pred_rate;    Stats::Formula frac_correct_zero;    Stats::Formula frac_correct_one;    Stats::Formula coverage_zero;    Stats::Formula coverage_one;  private:    bool pred_one(unsigned &counter)  { return counter >  thresh; }    bool pred_zero(unsigned &counter) { return counter <= thresh; }    void update_one(unsigned &counter) {        if (one_change)            counter += one_change;        else            counter = 0;        // check for wrap        if (counter > max_value)            counter = max_value;    }    void update_zero(unsigned &counter) {        if (zero_change) {            // check for wrap            if (counter < zero_change)                counter = 0;            else                counter -= zero_change;        } else            counter = 0;    }  public:    SaturatingCounterPred(std::string p_name,                          std::string z_name, std::string o_name,                          unsigned _index_bits, unsigned _counter_bits = 2,                          unsigned _zero_change = 1, unsigned _one_change = 1,                          unsigned _thresh = 1, unsigned _init_value = 0);    void clear() {        for (int i = 0; i <= max_index; ++i)            table[i] = init_value;    }    //  Record the ACTUAL result... and indicate whether the prediction    //  corresponding to this event was correct    void record(unsigned long _index, unsigned _val, unsigned _predicted,                unsigned _pdata)    {        record(_index, _val, _predicted);    }    void record(unsigned long _index, unsigned _val, unsigned _predicted) {        unsigned long index = _index & max_index;        if (_val) {            update_one(table[index]);            ++record_one;            if (_predicted)                ++correct_pred_one;        } else {            update_zero(table[index]);            ++record_zero;            if (!_predicted)                ++correct_pred_zero;        }    }    unsigned value(unsigned long _index) {        unsigned long index = _index & max_index;        return table[index];    }    unsigned predict(unsigned long _index, unsigned &pdata) {        return predict(_index);    }    unsigned predict(unsigned long _index) {        unsigned long index = _index & max_index;        if (pred_one(table[index])) {            ++predicted_one;            return 1;        }        ++predicted_zero;        return 0;    }    //  No internal state is changed here    unsigned peek(unsigned long _index) {        unsigned long index = _index & max_index;        if (pred_one(table[index]))            return 1;        return 0;    }    //=======================================================    void regStats();    void regFormulas();};#endif // __SAT_COUNTER_HH__

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?