diff options
| author | Tor Aamodt <[email protected]> | 2010-10-01 08:55:28 -0800 |
|---|---|---|
| committer | Tor Aamodt <[email protected]> | 2010-10-01 08:55:28 -0800 |
| commit | 11b308e7363e937966b035b4891db32b4eece3bf (patch) | |
| tree | 50ca4c9ad6f163ac4acb2bf505e64dfebed66947 /src/gpgpu-sim/scoreboard.cc | |
| parent | bb820c116764d7a1b8e071137d32b74e7f34dd2f (diff) | |
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]
Diffstat (limited to 'src/gpgpu-sim/scoreboard.cc')
| -rw-r--r-- | src/gpgpu-sim/scoreboard.cc | 66 |
1 files changed, 27 insertions, 39 deletions
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; i<reg_table.size(); i++) { if(reg_table[i].size() == 0 ) continue; printf(" wid = %d: ", i); @@ -33,9 +34,10 @@ void Scoreboard::printContents() { // Mark register as write-pending -void Scoreboard::reserveRegister(int wid, int regnum) { +void Scoreboard::reserveRegister(unsigned wid, unsigned regnum) +{ if( !(reg_table[wid].find(regnum) == reg_table[wid].end()) ){ - printf("Error: trying to reserve an already reserved register (sid=%d, wid=%d, regnum=%d).", sid, wid, regnum); + printf("Error: trying to reserve an already reserved register (sid=%d, wid=%d, regnum=%d).", m_sid, wid, regnum); assert(reg_table[wid].find(regnum) == reg_table[wid].end()); } @@ -44,20 +46,19 @@ void Scoreboard::reserveRegister(int wid, int regnum) { // Unmark register as write-pending -void Scoreboard::releaseRegister(int wid, int regnum) { +void Scoreboard::releaseRegister(unsigned wid, unsigned regnum) +{ if( !(reg_table[wid].find(regnum) != reg_table[wid].end()) ) { - printf("Error: trying to release an unreserved register (sid=%d, wid=%d, regnum=%d).", sid, wid, regnum); + printf("Error: trying to release an unreserved register (sid=%d, wid=%d, regnum=%d).", m_sid, wid, regnum); assert(reg_table[wid].find(regnum) != reg_table[wid].end()); } - reg_table[wid].erase(regnum); } // Reserve registers for an instruction -void Scoreboard::reserveRegisters(int wid, void* inst_void) { - inst_t *inst = (inst_t *) inst_void; - +void Scoreboard::reserveRegisters(unsigned wid, const class inst_t* inst) +{ // Reserve registers if(inst->out[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<int> 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<int>::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<int> reg_intr; std::set<int>::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<int>::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(); } |
