summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/scoreboard.cc
diff options
context:
space:
mode:
authorNick <[email protected]>2019-09-13 07:48:08 -0400
committerNick <[email protected]>2019-09-13 07:48:08 -0400
commit9b1e6dba9f721c772e801abc4851a88aa61929da (patch)
treeed12425be898e85e01e7a3997a9b8d5efba6ef50 /src/gpgpu-sim/scoreboard.cc
parent5c99f0fa58caf45f4d457894413aa11c03afdb7d (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.cc202
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();
}