diff options
Diffstat (limited to 'src/gpgpu-sim/scoreboard.cc')
| -rw-r--r-- | src/gpgpu-sim/scoreboard.cc | 229 |
1 files changed, 109 insertions, 120 deletions
diff --git a/src/gpgpu-sim/scoreboard.cc b/src/gpgpu-sim/scoreboard.cc index 1017e75..44a9980 100644 --- a/src/gpgpu-sim/scoreboard.cc +++ b/src/gpgpu-sim/scoreboard.cc @@ -7,159 +7,148 @@ // // 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 -// 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. +// 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 -// 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 -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// 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 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. #include "scoreboard.h" -#include "shader.h" #include "../cuda-sim/ptx_sim.h" +#include "shader.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); -//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; + 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(); } |
