Stats output on request.

This commit is contained in:
cdkersey
2015-08-31 22:01:48 -06:00
parent 7765655d65
commit a9dfe00b48
4 changed files with 39 additions and 5 deletions

View File

@@ -30,7 +30,7 @@ void Harp::reg_doWrite(Word cpuId, Word regNum) {
#endif #endif
Core::Core(const ArchDef &a, Decoder &d, MemoryUnit &mem, Word id): 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) for (unsigned i = 0; i < a.getNWarps(); ++i)
w.push_back(Warp(this)); w.push_back(Warp(this));
@@ -44,6 +44,8 @@ bool Core::interrupt(Word r0) {
} }
void Core::step() { void Core::step() {
++steps;
for (unsigned i = 0; i < w.size(); ++i) { for (unsigned i = 0; i < w.size(); ++i) {
if (w[i].activeThreads) { if (w[i].activeThreads) {
D(3, "Core step stepping warp " << i << '[' << w[i].activeThreads << ']'); D(3, "Core step stepping warp " << i << '[' << w[i].activeThreads << ']');
@@ -59,11 +61,20 @@ bool Core::running() const {
return false; 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) : Warp::Warp(Core *c, Word id) :
core(c), pc(0), interruptEnable(true), core(c), pc(0), interruptEnable(true),
supervisorMode(true), activeThreads(0), reg(0), pred(0), supervisorMode(true), activeThreads(0), reg(0), pred(0),
shadowReg(core->a.getNRegs()), shadowPReg(core->a.getNPRegs()), id(id), 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. */ /* Build the register file. */
Word regNum(0); Word regNum(0);
@@ -92,6 +103,8 @@ void Warp::step() {
if (activeThreads == 0) return; if (activeThreads == 0) return;
++steps;
D(3, "in step pc=0x" << hex << pc); D(3, "in step pc=0x" << hex << pc);
/* Fetch and decode. */ /* Fetch and decode. */
@@ -205,3 +218,10 @@ bool Warp::interrupt(Word r0) {
return true; return true;
} }
void Warp::printStats() const {
cout << "Steps: " << steps << endl
<< "Insts: " << insts << endl
<< "Loads: " << loads << endl
<< "Stores: " << stores << endl;
}

View File

@@ -207,12 +207,13 @@ int disasm_main(int argc, char **argv) {
int emu_main(int argc, char **argv) { int emu_main(int argc, char **argv) {
string archString("8w32/32/8/8"), imgFileName("a.out.bin"); string archString("8w32/32/8/8"), imgFileName("a.out.bin");
bool showHelp; bool showHelp, showStats;
/* Read the command line arguments. */ /* Read the command line arguments. */
CommandLineArgFlag fh("-h", "--help", "", showHelp); CommandLineArgFlag fh("-h", "--help", "", showHelp);
CommandLineArgSetter<string>fc("-c", "--core", "", imgFileName); CommandLineArgSetter<string>fc("-c", "--core", "", imgFileName);
CommandLineArgSetter<string>fa("-a", "--arch", "", archString); CommandLineArgSetter<string>fa("-a", "--arch", "", archString);
CommandLineArgFlag fs("-s", "--stats", "", showStats);
CommandLineArg::readArgs(argc, argv); CommandLineArg::readArgs(argc, argv);
@@ -244,6 +245,8 @@ int emu_main(int argc, char **argv) {
while (core.running()) { console.poll(); core.step(); } while (core.running()) { console.poll(); core.step(); }
if (showStats) core.printStats();
return 0; return 0;
} }

View File

@@ -79,12 +79,15 @@ namespace Harp {
bool running() const; bool running() const;
void step(); void step();
void printStats() const;
const ArchDef &a; const ArchDef &a;
Decoder &iDec; Decoder &iDec;
MemoryUnit &mem; MemoryUnit &mem;
Word interruptEntry; Word interruptEntry;
unsigned long steps;
std::vector<Warp> w; std::vector<Warp> w;
std::map<Word, std::set<Warp *> > b; // Barriers std::map<Word, std::set<Warp *> > b; // Barriers
}; };
@@ -100,6 +103,8 @@ namespace Harp {
bool getSupervisorMode() const { return supervisorMode; } bool getSupervisorMode() const { return supervisorMode; }
#endif #endif
void printStats() const;
// private: // private:
Core *core; Core *core;
@@ -117,6 +122,8 @@ namespace Harp {
bool interruptEnable, shadowInterruptEnable, supervisorMode, bool interruptEnable, shadowInterruptEnable, supervisorMode,
shadowSupervisorMode, spawned; shadowSupervisorMode, spawned;
unsigned long steps, insts, loads, stores;
friend class Instruction; friend class Instruction;
}; };
}; };

View File

@@ -150,6 +150,8 @@ void Instruction::executeOn(Warp &c) {
if (((predicated && !pReg[pred]) || !c.tmask[t]) && if (((predicated && !pReg[pred]) || !c.tmask[t]) &&
op != SPLIT && op != JOIN) continue; op != SPLIT && op != JOIN) continue;
++c.insts;
Word memAddr; Word memAddr;
switch (op) { switch (op) {
case NOP: break; case NOP: break;
@@ -250,14 +252,16 @@ void Instruction::executeOn(Warp &c) {
if (!pcSet) nextPc = reg[rsrc[0]]; if (!pcSet) nextPc = reg[rsrc[0]];
pcSet = true; pcSet = true;
break; break;
case LD: memAddr = reg[rsrc[0]] + immsrc; case LD: ++c.loads;
memAddr = reg[rsrc[0]] + immsrc;
#ifdef EMU_INSTRUMENTATION #ifdef EMU_INSTRUMENTATION
Harp::OSDomain::osDomain-> Harp::OSDomain::osDomain->
do_mem(0, memAddr, c.core->mem.virtToPhys(memAddr), 8, true); do_mem(0, memAddr, c.core->mem.virtToPhys(memAddr), 8, true);
#endif #endif
reg[rdest] = c.core->mem.read(memAddr, c.supervisorMode); reg[rdest] = c.core->mem.read(memAddr, c.supervisorMode);
break; 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); c.core->mem.write(memAddr, reg[rsrc[0]], c.supervisorMode);
#ifdef EMU_INSTRUMENTATION #ifdef EMU_INSTRUMENTATION
Harp::OSDomain::osDomain-> Harp::OSDomain::osDomain->