From 11b308e7363e937966b035b4891db32b4eece3bf Mon Sep 17 00:00:00 2001 From: Tor Aamodt Date: Fri, 1 Oct 2010 08:55:28 -0800 Subject: integrating recent changes from fermi-test into fermi (i'll use "fermi" for more disruptive changes to the pipeline model such as updating the MSHRs and getting rid of the warp tracker, ripping out DWF, etc...) [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 7805] --- src/gpgpu-sim/scoreboard.cc | 66 +++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 39 deletions(-) (limited to 'src/gpgpu-sim/scoreboard.cc') diff --git a/src/gpgpu-sim/scoreboard.cc b/src/gpgpu-sim/scoreboard.cc index 278ada4..711a6ab 100644 --- a/src/gpgpu-sim/scoreboard.cc +++ b/src/gpgpu-sim/scoreboard.cc @@ -11,16 +11,17 @@ //Constructor -Scoreboard::Scoreboard( int sid, int n_warps ) +Scoreboard::Scoreboard( unsigned sid, unsigned n_warps ) { - this->sid = sid; + m_sid = sid; //Initialize size of table reg_table.resize(n_warps); } // Print scoreboard contents -void Scoreboard::printContents() { - printf("scoreboard contents (sid=%d): \n", sid); +void Scoreboard::printContents() +{ + printf("scoreboard contents (sid=%d): \n", m_sid); for(unsigned i=0; iout[0] > 0) reserveRegister(wid, inst->out[0]); if(inst->out[1] > 0) reserveRegister(wid, inst->out[1]); @@ -66,19 +67,22 @@ void Scoreboard::reserveRegisters(int wid, void* inst_void) { } // Release registers for an instruction -void Scoreboard::releaseRegisters(int wid, void *inst_void) { - inst_t *inst = (inst_t *) inst_void; - +void Scoreboard::releaseRegisters(unsigned wid, const class inst_t *inst) +{ if(inst->out[0] > 0) releaseRegister(wid, inst->out[0]); if(inst->out[1] > 0) releaseRegister(wid, inst->out[1]); if(inst->out[2] > 0) releaseRegister(wid, inst->out[2]); if(inst->out[3] > 0) releaseRegister(wid, inst->out[3]); } -// Checks to see if registers used by an instruction are reserved in the scoreboard -bool Scoreboard::checkCollision(int wid, void *inst_void) { - inst_t *inst = (inst_t *) inst_void; - +/** + * Checks to see if registers used by an instruction are reserved in the scoreboard + * + * @return + * true if WAW or RAW hazard (no WAR since in-order issue) + **/ +bool Scoreboard::checkCollision( unsigned wid, const class inst_t *inst ) +{ // Get list of all input and output registers std::set inst_regs; @@ -94,32 +98,16 @@ bool Scoreboard::checkCollision(int wid, void *inst_void) { if(inst->ar1 > 0) inst_regs.insert(inst->ar1); if(inst->ar2 > 0) inst_regs.insert(inst->ar2); - /* - printf("Inst registers: "); - std::set::iterator it; - for ( it=inst_regs.begin() ; it != inst_regs.end(); it++ ) - printf("%d ", *it); - printf("\n"); - */ - // Check for collision, get the intersection of reserved registers and instruction registers - //std::set reg_intr; std::set::iterator it2; for ( it2=inst_regs.begin() ; it2 != inst_regs.end(); it2++ ) if(reg_table[wid].find(*it2) != reg_table[wid].end()) { - //reg_intr.insert(*it2); return true; } - return false; +} - /* - printf("Intersection registers: "); - std::set::iterator it3; - for ( it3=reg_intr.begin() ; it3 != reg_intr.end(); it3++ ) - printf("%d ", *it3); - printf("\n"); - */ - - +bool Scoreboard::pendingWrites(unsigned wid) const +{ + return !reg_table[wid].empty(); } -- cgit v1.3