summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/scoreboard.cc
diff options
context:
space:
mode:
authorAndrew M. B. Boktor <[email protected]>2012-07-02 22:11:33 -0800
committerAndrew Boktor <[email protected]>2014-08-14 13:47:33 -0700
commitdadb44ad16727623476a1e6947453da81ed682c7 (patch)
tree095da91d5386468dbf28e3512ba8e02b2f5d110d /src/gpgpu-sim/scoreboard.cc
parentbb96888d31d37760c86fa1aed3bbf203792185e7 (diff)
Adding a two level scheduler as described in the ISCA 2012 tutorial
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 13261]
Diffstat (limited to 'src/gpgpu-sim/scoreboard.cc')
-rw-r--r--src/gpgpu-sim/scoreboard.cc17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/gpgpu-sim/scoreboard.cc b/src/gpgpu-sim/scoreboard.cc
index 4935715..e2379fd 100644
--- a/src/gpgpu-sim/scoreboard.cc
+++ b/src/gpgpu-sim/scoreboard.cc
@@ -32,10 +32,12 @@
//Constructor
Scoreboard::Scoreboard( unsigned sid, unsigned n_warps )
+: longopregs()
{
m_sid = sid;
//Initialize size of table
reg_table.resize(n_warps);
+ longopregs.resize(n_warps);
}
// Print scoreboard contents
@@ -69,10 +71,24 @@ void Scoreboard::releaseRegister(unsigned wid, unsigned 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();
+}
+
void Scoreboard::reserveRegisters(const class warp_inst_t* inst)
{
for( unsigned r=0; r < 4; r++)
if(inst->out[r] > 0) reserveRegister(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() == tex_space)){
+ for ( unsigned r=0; r<4; r++) {
+ if(inst->out[r] > 0) longopregs[inst->warp_id()].insert(r);
+ }
+ }
}
// Release registers for an instruction
@@ -80,6 +96,7 @@ void Scoreboard::releaseRegisters(const class warp_inst_t *inst)
{
for( unsigned r=0; r < 4; r++)
if(inst->out[r] > 0) releaseRegister(inst->warp_id(), inst->out[r]);
+ longopregs[inst->warp_id()].clear();
}
/**