diff --git a/src/cpu/base.cc b/src/cpu/base.cc index 490e48938a..cee76472f5 100644 --- a/src/cpu/base.cc +++ b/src/cpu/base.cc @@ -203,7 +203,11 @@ BaseCPU::BaseCPU(const Params &p, bool is_checker) baseStats.numCycles; fetchStats.emplace_back(fetchStatptr); - executeStats.emplace_back(new ExecuteCPUStats(this, i)); + // create executeStat object for thread i and set rate formulas + ExecuteCPUStats* executeStatptr = new ExecuteCPUStats(this, i); + executeStatptr->instRate = executeStatptr->numInsts / + baseStats.numCycles; + executeStats.emplace_back(executeStatptr); // create commitStat object for thread i and set ipc, cpi formulas CommitCPUStats* commitStatptr = new CommitCPUStats(this, i); @@ -900,6 +904,19 @@ FetchCPUStats::FetchCPUStats(statistics::Group *parent, int thread_id) BaseCPU:: ExecuteCPUStats::ExecuteCPUStats(statistics::Group *parent, int thread_id) : statistics::Group(parent, csprintf("executeStats%i", thread_id).c_str()), + ADD_STAT(numInsts, statistics::units::Count::get(), + "Number of executed instructions"), + ADD_STAT(numNop, statistics::units::Count::get(), + "Number of nop insts executed"), + ADD_STAT(numBranches, statistics::units::Count::get(), + "Number of branches executed"), + ADD_STAT(numLoadInsts, statistics::units::Count::get(), + "Number of load instructions executed"), + ADD_STAT(numStoreInsts, statistics::units::Count::get(), + "Number of stores executed"), + ADD_STAT(instRate, statistics::units::Rate< + statistics::units::Count, statistics::units::Cycle>::get(), + "Inst execution rate"), ADD_STAT(dcacheStallCycles, statistics::units::Cycle::get(), "DCache total stall cycles"), ADD_STAT(numCCRegReads, statistics::units::Count::get(), @@ -938,36 +955,38 @@ ExecuteCPUStats::ExecuteCPUStats(statistics::Group *parent, int thread_id) "Number of ops (including micro ops) which were discarded before " "commit") { + numStoreInsts = numMemRefs - numLoadInsts; + dcacheStallCycles - .prereq(dcacheStallCycles); + .prereq(dcacheStallCycles); numCCRegReads - .prereq(numCCRegReads) - .flags(statistics::nozero); + .prereq(numCCRegReads) + .flags(statistics::nozero); numCCRegWrites - .prereq(numCCRegWrites) - .flags(statistics::nozero); + .prereq(numCCRegWrites) + .flags(statistics::nozero); numFpAluAccesses - .prereq(numFpAluAccesses); + .prereq(numFpAluAccesses); numFpRegReads - .prereq(numFpRegReads); + .prereq(numFpRegReads); numIntAluAccesses - .prereq(numIntAluAccesses); + .prereq(numIntAluAccesses); numIntRegReads - .prereq(numIntRegReads); + .prereq(numIntRegReads); numIntRegWrites - .prereq(numIntRegWrites); + .prereq(numIntRegWrites); numMiscRegReads - .prereq(numMiscRegReads); + .prereq(numMiscRegReads); numMiscRegWrites - .prereq(numMiscRegWrites); + .prereq(numMiscRegWrites); numVecPredRegReads - .prereq(numVecPredRegReads); + .prereq(numVecPredRegReads); numVecPredRegWrites - .prereq(numVecPredRegWrites); + .prereq(numVecPredRegWrites); numVecRegReads - .prereq(numVecRegReads); + .prereq(numVecRegReads); numVecRegWrites - .prereq(numVecRegWrites); + .prereq(numVecRegWrites); } BaseCPU:: diff --git a/src/cpu/base.hh b/src/cpu/base.hh index 5d0d3cab01..fc22abc5aa 100644 --- a/src/cpu/base.hh +++ b/src/cpu/base.hh @@ -716,6 +716,19 @@ class BaseCPU : public ClockedObject { ExecuteCPUStats(statistics::Group *parent, int thread_id); + /* Stat for total number of executed instructions */ + statistics::Scalar numInsts; + /* Number of executed nops */ + statistics::Scalar numNop; + /* Number of executed branches */ + statistics::Scalar numBranches; + /* Stat for total number of executed load instructions */ + statistics::Scalar numLoadInsts; + /* Number of executed store instructions */ + statistics::Formula numStoreInsts; + /* Number of instructions executed per cycle */ + statistics::Formula instRate; + /* Number of cycles stalled for D-cache responses */ statistics::Scalar dcacheStallCycles; diff --git a/src/cpu/o3/iew.cc b/src/cpu/o3/iew.cc index 7cf6c54542..92d281ce93 100644 --- a/src/cpu/o3/iew.cc +++ b/src/cpu/o3/iew.cc @@ -217,52 +217,14 @@ IEW::IEWStats::IEWStats(CPU *cpu) IEW::IEWStats::ExecutedInstStats::ExecutedInstStats(CPU *cpu) : statistics::Group(cpu), - ADD_STAT(numInsts, statistics::units::Count::get(), - "Number of executed instructions"), - ADD_STAT(numLoadInsts, statistics::units::Count::get(), - "Number of load instructions executed"), ADD_STAT(numSquashedInsts, statistics::units::Count::get(), "Number of squashed instructions skipped in execute"), ADD_STAT(numSwp, statistics::units::Count::get(), - "Number of swp insts executed"), - ADD_STAT(numNop, statistics::units::Count::get(), - "Number of nop insts executed"), - ADD_STAT(numRefs, statistics::units::Count::get(), - "Number of memory reference insts executed"), - ADD_STAT(numBranches, statistics::units::Count::get(), - "Number of branches executed"), - ADD_STAT(numStoreInsts, statistics::units::Count::get(), - "Number of stores executed"), - ADD_STAT(numRate, statistics::units::Rate< - statistics::units::Count, statistics::units::Cycle>::get(), - "Inst execution rate", numInsts / cpu->baseStats.numCycles) + "Number of swp insts executed") { - numLoadInsts - .init(cpu->numThreads) - .flags(statistics::total); - numSwp .init(cpu->numThreads) .flags(statistics::total); - - numNop - .init(cpu->numThreads) - .flags(statistics::total); - - numRefs - .init(cpu->numThreads) - .flags(statistics::total); - - numBranches - .init(cpu->numThreads) - .flags(statistics::total); - - numStoreInsts - .flags(statistics::total); - numStoreInsts = numRefs - numLoadInsts; - - numRate - .flags(statistics::total); } void @@ -1053,7 +1015,7 @@ IEW::dispatchInsts(ThreadID tid) instQueue.recordProducer(inst); - iewStats.executedInstStats.numNop[tid]++; + cpu->executeStats[tid]->numNop++; add_to_iq = false; } else { @@ -1561,7 +1523,7 @@ IEW::updateExeInstStats(const DynInstPtr& inst) { ThreadID tid = inst->threadNumber; - iewStats.executedInstStats.numInsts++; + cpu->executeStats[tid]->numInsts++; #if TRACING_ON if (debug::O3PipeView) { @@ -1573,16 +1535,16 @@ IEW::updateExeInstStats(const DynInstPtr& inst) // Control operations // if (inst->isControl()) - iewStats.executedInstStats.numBranches[tid]++; + cpu->executeStats[tid]->numBranches++; // // Memory operations // if (inst->isMemRef()) { - iewStats.executedInstStats.numRefs[tid]++; + cpu->executeStats[tid]->numMemRefs++; if (inst->isLoad()) { - iewStats.executedInstStats.numLoadInsts[tid]++; + cpu->executeStats[tid]->numLoadInsts++; } } } diff --git a/src/cpu/o3/iew.hh b/src/cpu/o3/iew.hh index 80fed295df..4fe8227dcc 100644 --- a/src/cpu/o3/iew.hh +++ b/src/cpu/o3/iew.hh @@ -455,25 +455,11 @@ class IEW { ExecutedInstStats(CPU *cpu); - /** Stat for total number of executed instructions. */ - statistics::Scalar numInsts; - /** Stat for total number of executed load instructions. */ - statistics::Vector numLoadInsts; /** Stat for total number of squashed instructions skipped at * execute. */ statistics::Scalar numSquashedInsts; /** Number of executed software prefetches. */ statistics::Vector numSwp; - /** Number of executed nops. */ - statistics::Vector numNop; - /** Number of executed meomory references. */ - statistics::Vector numRefs; - /** Number of executed branches. */ - statistics::Vector numBranches; - /** Number of executed store instructions. */ - statistics::Formula numStoreInsts; - /** Number of instructions executed per cycle. */ - statistics::Formula numRate; } executedInstStats; /** Number of instructions sent to commit. */