summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/scoreboard.cc
diff options
context:
space:
mode:
authorTor Aamodt <[email protected]>2010-10-01 08:55:28 -0800
committerTor Aamodt <[email protected]>2010-10-01 08:55:28 -0800
commit11b308e7363e937966b035b4891db32b4eece3bf (patch)
tree50ca4c9ad6f163ac4acb2bf505e64dfebed66947 /src/gpgpu-sim/scoreboard.cc
parentbb820c116764d7a1b8e071137d32b74e7f34dd2f (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.cc66
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();
}