diff options
| author | Nick <[email protected]> | 2019-09-13 07:48:08 -0400 |
|---|---|---|
| committer | Nick <[email protected]> | 2019-09-13 07:48:08 -0400 |
| commit | 9b1e6dba9f721c772e801abc4851a88aa61929da (patch) | |
| tree | ed12425be898e85e01e7a3997a9b8d5efba6ef50 /src/gpgpu-sim/scoreboard.cc | |
| parent | 5c99f0fa58caf45f4d457894413aa11c03afdb7d (diff) | |
Revert "Add src/gpgpu-sim formatting"
This reverts commit 9c9b1341613e767f306b2b73b5b8a5317b6ee563.
Diffstat (limited to 'src/gpgpu-sim/scoreboard.cc')
| -rw-r--r-- | src/gpgpu-sim/scoreboard.cc | 202 |
1 files changed, 106 insertions, 96 deletions
diff --git a/src/gpgpu-sim/scoreboard.cc b/src/gpgpu-sim/scoreboard.cc index 7a207ec..1017e75 100644 --- a/src/gpgpu-sim/scoreboard.cc +++ b/src/gpgpu-sim/scoreboard.cc @@ -7,16 +7,14 @@ // // Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. -// Redistributions in binary form must reproduce the above copyright notice, -// this +// Redistributions in binary form must reproduce the above copyright notice, this // list of conditions and the following disclaimer in the documentation and/or // other materials provided with the distribution. // Neither the name of The University of British Columbia nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE @@ -28,128 +26,140 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "scoreboard.h" -#include "../cuda-sim/ptx_sim.h" #include "shader.h" +#include "../cuda-sim/ptx_sim.h" #include "shader_trace.h" -// Constructor -Scoreboard::Scoreboard(unsigned sid, unsigned n_warps, class gpgpu_t* gpu) - : longopregs() { - m_sid = sid; - // Initialize size of table - reg_table.resize(n_warps); - longopregs.resize(n_warps); - m_gpu = gpu; +//Constructor +Scoreboard::Scoreboard( unsigned sid, unsigned n_warps, class gpgpu_t* gpu ) +: longopregs() +{ + m_sid = sid; + //Initialize size of table + reg_table.resize(n_warps); + longopregs.resize(n_warps); + + m_gpu = gpu; } // Print scoreboard contents -void Scoreboard::printContents() const { - 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 = %2d: ", i); - std::set<unsigned>::const_iterator it; - for (it = reg_table[i].begin(); it != reg_table[i].end(); it++) - printf("%u ", *it); - printf("\n"); - } +void Scoreboard::printContents() const +{ + 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 = %2d: ", i); + std::set<unsigned>::const_iterator it; + for( it=reg_table[i].begin() ; it != reg_table[i].end(); it++ ) + printf("%u ", *it); + printf("\n"); + } } -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).", - m_sid, wid, regnum); - abort(); - } - SHADER_DPRINTF(SCOREBOARD, "Reserved Register - warp:%d, reg: %d\n", wid, - regnum); - reg_table[wid].insert(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).", m_sid, wid, regnum); + abort(); + } + SHADER_DPRINTF( SCOREBOARD, + "Reserved Register - warp:%d, reg: %d\n", wid, regnum ); + reg_table[wid].insert(regnum); } // Unmark register as write-pending -void Scoreboard::releaseRegister(unsigned wid, unsigned regnum) { - if (!(reg_table[wid].find(regnum) != reg_table[wid].end())) return; - SHADER_DPRINTF(SCOREBOARD, "Release register - warp:%d, reg: %d\n", wid, - regnum); - reg_table[wid].erase(regnum); +void Scoreboard::releaseRegister(unsigned wid, unsigned regnum) +{ + if( !(reg_table[wid].find(regnum) != reg_table[wid].end()) ) + return; + SHADER_DPRINTF( SCOREBOARD, + "Release register - warp:%d, reg: %d\n", wid, regnum ); + reg_table[wid].erase(regnum); } -const bool Scoreboard::islongop(unsigned warp_id, unsigned regnum) { - return longopregs[warp_id].find(regnum) != longopregs[warp_id].end(); +const bool Scoreboard::islongop (unsigned warp_id,unsigned regnum) { + return longopregs[warp_id].find(regnum) != longopregs[warp_id].end(); } -void Scoreboard::reserveRegisters(const class warp_inst_t* inst) { - for (unsigned r = 0; r < MAX_OUTPUT_VALUES; r++) { - if (inst->out[r] > 0) { - reserveRegister(inst->warp_id(), inst->out[r]); - SHADER_DPRINTF(SCOREBOARD, "Reserved register - warp:%d, reg: %d\n", - inst->warp_id(), inst->out[r]); +void Scoreboard::reserveRegisters(const class warp_inst_t* inst) +{ + for( unsigned r=0; r < MAX_OUTPUT_VALUES; r++) { + if(inst->out[r] > 0) { + reserveRegister(inst->warp_id(), inst->out[r]); + SHADER_DPRINTF( SCOREBOARD, + "Reserved register - warp:%d, reg: %d\n", + inst->warp_id(), + inst->out[r] ); + } } - } - // Keep track of long operations - if (inst->is_load() && (inst->space.get_type() == global_space || - inst->space.get_type() == local_space || - inst->space.get_type() == param_space_kernel || - inst->space.get_type() == param_space_local || - inst->space.get_type() == param_space_unclassified || - inst->space.get_type() == tex_space)) { - for (unsigned r = 0; r < MAX_OUTPUT_VALUES; r++) { - if (inst->out[r] > 0) { - SHADER_DPRINTF(SCOREBOARD, "New longopreg marked - warp:%d, reg: %d\n", - inst->warp_id(), inst->out[r]); - longopregs[inst->warp_id()].insert(inst->out[r]); - } + //Keep track of long operations + if (inst->is_load() && + ( inst->space.get_type() == global_space || + inst->space.get_type() == local_space || + inst->space.get_type() == param_space_kernel || + inst->space.get_type() == param_space_local || + inst->space.get_type() == param_space_unclassified || + inst->space.get_type() == tex_space)){ + for ( unsigned r=0; r<MAX_OUTPUT_VALUES; r++) { + if(inst->out[r] > 0) { + SHADER_DPRINTF( SCOREBOARD, + "New longopreg marked - warp:%d, reg: %d\n", + inst->warp_id(), + inst->out[r] ); + longopregs[inst->warp_id()].insert(inst->out[r]); + } + } } - } } // Release registers for an instruction -void Scoreboard::releaseRegisters(const class warp_inst_t* inst) { - for (unsigned r = 0; r < MAX_OUTPUT_VALUES; r++) { - if (inst->out[r] > 0) { - SHADER_DPRINTF(SCOREBOARD, "Register Released - warp:%d, reg: %d\n", - inst->warp_id(), inst->out[r]); - releaseRegister(inst->warp_id(), inst->out[r]); - longopregs[inst->warp_id()].erase(inst->out[r]); +void Scoreboard::releaseRegisters(const class warp_inst_t *inst) +{ + for( unsigned r=0; r < MAX_OUTPUT_VALUES; r++) { + if(inst->out[r] > 0) { + SHADER_DPRINTF( SCOREBOARD, + "Register Released - warp:%d, reg: %d\n", + inst->warp_id(), + inst->out[r] ); + releaseRegister(inst->warp_id(), inst->out[r]); + longopregs[inst->warp_id()].erase(inst->out[r]); + } } - } } -/** - * Checks to see if registers used by an instruction are reserved in the - *scoreboard - * - * @return +/** + * 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) const { - // Get list of all input and output registers - std::set<int> inst_regs; + **/ +bool Scoreboard::checkCollision( unsigned wid, const class inst_t *inst ) const +{ + // Get list of all input and output registers + std::set<int> inst_regs; - for (unsigned iii = 0; iii < inst->outcount; iii++) - inst_regs.insert(inst->out[iii]); + for(unsigned iii=0; iii < inst->outcount; iii++) + inst_regs.insert(inst->out[iii]); - for (unsigned jjj = 0; jjj < inst->incount; jjj++) - inst_regs.insert(inst->in[jjj]); + for(unsigned jjj=0;jjj<inst->incount;jjj++) + inst_regs.insert(inst->in[jjj]); - if (inst->pred > 0) inst_regs.insert(inst->pred); - if (inst->ar1 > 0) inst_regs.insert(inst->ar1); - if (inst->ar2 > 0) inst_regs.insert(inst->ar2); + if(inst->pred > 0) inst_regs.insert(inst->pred); + if(inst->ar1 > 0) inst_regs.insert(inst->ar1); + if(inst->ar2 > 0) inst_regs.insert(inst->ar2); - // Check for collision, get the intersection of reserved registers and - // instruction registers - std::set<int>::const_iterator it2; - for (it2 = inst_regs.begin(); it2 != inst_regs.end(); it2++) - if (reg_table[wid].find(*it2) != reg_table[wid].end()) { - return true; - } - return false; + // Check for collision, get the intersection of reserved registers and instruction registers + std::set<int>::const_iterator it2; + for ( it2=inst_regs.begin() ; it2 != inst_regs.end(); it2++ ) + if(reg_table[wid].find(*it2) != reg_table[wid].end()) { + return true; + } + return false; } -bool Scoreboard::pendingWrites(unsigned wid) const { - return !reg_table[wid].empty(); +bool Scoreboard::pendingWrites(unsigned wid) const +{ + return !reg_table[wid].empty(); } |
