summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/scoreboard.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpgpu-sim/scoreboard.cc')
-rw-r--r--src/gpgpu-sim/scoreboard.cc229
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();
}