From a9dfe00b4846222f24f2d4a214db6625a570d559 Mon Sep 17 00:00:00 2001 From: cdkersey Date: Mon, 31 Aug 2015 22:01:48 -0600 Subject: [PATCH] Stats output on request. --- src/core.cpp | 24 ++++++++++++++++++++++-- src/harptool.cpp | 5 ++++- src/include/core.h | 7 +++++++ src/instruction.cpp | 8 ++++++-- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/core.cpp b/src/core.cpp index 76af61b1..1589f22b 100644 --- a/src/core.cpp +++ b/src/core.cpp @@ -30,7 +30,7 @@ void Harp::reg_doWrite(Word cpuId, Word regNum) { #endif Core::Core(const ArchDef &a, Decoder &d, MemoryUnit &mem, Word id): - a(a), iDec(d), mem(mem) + a(a), iDec(d), mem(mem), steps(0) { for (unsigned i = 0; i < a.getNWarps(); ++i) w.push_back(Warp(this)); @@ -44,6 +44,8 @@ bool Core::interrupt(Word r0) { } void Core::step() { + ++steps; + for (unsigned i = 0; i < w.size(); ++i) { if (w[i].activeThreads) { D(3, "Core step stepping warp " << i << '[' << w[i].activeThreads << ']'); @@ -59,11 +61,20 @@ bool Core::running() const { return false; } +void Core::printStats() const { + cout << "Steps: " << steps << endl; + + for (unsigned i = 0; i < w.size(); ++i) { + cout << "=== Warp " << i << " ===" << endl; + w[i].printStats(); + } +} + Warp::Warp(Core *c, Word id) : core(c), pc(0), interruptEnable(true), supervisorMode(true), activeThreads(0), reg(0), pred(0), shadowReg(core->a.getNRegs()), shadowPReg(core->a.getNPRegs()), id(id), - spawned(false) + spawned(false), steps(0), insts(0), loads(0), stores(0) { /* Build the register file. */ Word regNum(0); @@ -92,6 +103,8 @@ void Warp::step() { if (activeThreads == 0) return; + ++steps; + D(3, "in step pc=0x" << hex << pc); /* Fetch and decode. */ @@ -205,3 +218,10 @@ bool Warp::interrupt(Word r0) { return true; } + +void Warp::printStats() const { + cout << "Steps: " << steps << endl + << "Insts: " << insts << endl + << "Loads: " << loads << endl + << "Stores: " << stores << endl; +} diff --git a/src/harptool.cpp b/src/harptool.cpp index 10efd1a5..e6bf4091 100644 --- a/src/harptool.cpp +++ b/src/harptool.cpp @@ -207,12 +207,13 @@ int disasm_main(int argc, char **argv) { int emu_main(int argc, char **argv) { string archString("8w32/32/8/8"), imgFileName("a.out.bin"); - bool showHelp; + bool showHelp, showStats; /* Read the command line arguments. */ CommandLineArgFlag fh("-h", "--help", "", showHelp); CommandLineArgSetterfc("-c", "--core", "", imgFileName); CommandLineArgSetterfa("-a", "--arch", "", archString); + CommandLineArgFlag fs("-s", "--stats", "", showStats); CommandLineArg::readArgs(argc, argv); @@ -244,6 +245,8 @@ int emu_main(int argc, char **argv) { while (core.running()) { console.poll(); core.step(); } + if (showStats) core.printStats(); + return 0; } diff --git a/src/include/core.h b/src/include/core.h index 01c16634..e52732c8 100644 --- a/src/include/core.h +++ b/src/include/core.h @@ -79,12 +79,15 @@ namespace Harp { bool running() const; void step(); + void printStats() const; + const ArchDef &a; Decoder &iDec; MemoryUnit &mem; Word interruptEntry; + unsigned long steps; std::vector w; std::map > b; // Barriers }; @@ -100,6 +103,8 @@ namespace Harp { bool getSupervisorMode() const { return supervisorMode; } #endif + void printStats() const; + // private: Core *core; @@ -117,6 +122,8 @@ namespace Harp { bool interruptEnable, shadowInterruptEnable, supervisorMode, shadowSupervisorMode, spawned; + unsigned long steps, insts, loads, stores; + friend class Instruction; }; }; diff --git a/src/instruction.cpp b/src/instruction.cpp index 3f0c5229..49e9f88d 100644 --- a/src/instruction.cpp +++ b/src/instruction.cpp @@ -150,6 +150,8 @@ void Instruction::executeOn(Warp &c) { if (((predicated && !pReg[pred]) || !c.tmask[t]) && op != SPLIT && op != JOIN) continue; + ++c.insts; + Word memAddr; switch (op) { case NOP: break; @@ -250,14 +252,16 @@ void Instruction::executeOn(Warp &c) { if (!pcSet) nextPc = reg[rsrc[0]]; pcSet = true; break; - case LD: memAddr = reg[rsrc[0]] + immsrc; + case LD: ++c.loads; + memAddr = reg[rsrc[0]] + immsrc; #ifdef EMU_INSTRUMENTATION Harp::OSDomain::osDomain-> do_mem(0, memAddr, c.core->mem.virtToPhys(memAddr), 8, true); #endif reg[rdest] = c.core->mem.read(memAddr, c.supervisorMode); break; - case ST: memAddr = reg[rsrc[1]] + immsrc; + case ST: ++c.stores; + memAddr = reg[rsrc[1]] + immsrc; c.core->mem.write(memAddr, reg[rsrc[0]], c.supervisorMode); #ifdef EMU_INSTRUMENTATION Harp::OSDomain::osDomain->