fu_pool.hh

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

HH
169
字号
/* * Copyright (c) 2006 * 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: Kevin T. Lim */#ifndef __CPU_O3_FU_POOL_HH__#define __CPU_O3_FU_POOL_HH__#include <bitset>#include <list>#include <string>#include <vector>#include "base/sched_list.hh"#include "cpu/op_class.hh"#include "params/FUPool.hh"#include "sim/sim_object.hh"class FUDesc;class FuncUnit;/** * Pool of FU's, specific to the new CPU model. The old FU pool had lists of * free units and busy units, and whenever a FU was needed it would iterate * through the free units to find a FU that provided the capability. This pool * has lists of units specific to each of the capabilities, and whenever a FU * is needed, it iterates through that list to find a free unit. The previous * FU pool would have to be ticked each cycle to update which units became * free. This FU pool lets the IEW stage handle freeing units, which frees * them as their scheduled execution events complete. This limits units in this * model to either have identical issue and op latencies, or 1 cycle issue * latencies. */class FUPool : public SimObject{  private:    /** Maximum op execution latencies, per op class. */    unsigned maxOpLatencies[Num_OpClasses];    /** Maximum issue latencies, per op class. */    unsigned maxIssueLatencies[Num_OpClasses];    /** Bitvector listing capabilities of this FU pool. */    std::bitset<Num_OpClasses> capabilityList;    /** Bitvector listing which FUs are busy. */    std::vector<bool> unitBusy;    /** List of units to be freed at the end of this cycle. */    std::vector<int> unitsToBeFreed;    /**     * Class that implements a circular queue to hold FU indices. The hope is     * that FUs that have been just used will be moved to the end of the queue     * by iterating through it, thus leaving free units at the head of the     * queue.     */    class FUIdxQueue {      public:        /** Constructs a circular queue of FU indices. */        FUIdxQueue()            : idx(0), size(0)        { }        /** Adds a FU to the queue. */        inline void addFU(int fu_idx);        /** Returns the index of the FU at the head of the queue, and changes         *  the index to the next element.         */        inline int getFU();      private:        /** Circular queue index. */        int idx;        /** Size of the queue. */        int size;        /** Queue of FU indices. */        std::vector<int> funcUnitsIdx;    };    /** Per op class queues of FUs that provide that capability. */    FUIdxQueue fuPerCapList[Num_OpClasses];    /** Number of FUs. */    int numFU;    /** Functional units. */    std::vector<FuncUnit *> funcUnits;    typedef std::vector<FuncUnit *>::iterator fuListIterator;  public:    typedef FUPoolParams Params;    /** Constructs a FU pool. */    FUPool(const Params *p);    ~FUPool();    /** Annotates units that provide memory operations. Included only because     *  old FU pool provided this function.     */    void annotateMemoryUnits(unsigned hit_latency);    /**     * Gets a FU providing the requested capability. Will mark the unit as busy,     * but leaves the freeing of the unit up to the IEW stage.     * @param capability The capability requested.     * @return Returns -2 if the FU pool does not have the capability, -1 if     * there is no free FU, and the FU's index otherwise.     */    int getUnit(OpClass capability);    /** Frees a FU at the end of this cycle. */    void freeUnitNextCycle(int fu_idx);    /** Frees all FUs on the list. */    void processFreeUnits();    /** Returns the total number of FUs. */    int size() { return numFU; }    /** Debugging function used to dump FU information. */    void dump();    /** Returns the operation execution latency of the given capability. */    unsigned getOpLatency(OpClass capability) {        return maxOpLatencies[capability];    }    /** Returns the issue latency of the given capability. */    unsigned getIssueLatency(OpClass capability) {        return maxIssueLatencies[capability];    }    /** Switches out functional unit pool. */    void switchOut();    /** Takes over from another CPU's thread. */    void takeOverFrom();};#endif // __CPU_O3_FU_POOL_HH__

⌨️ 快捷键说明

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