summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/shader.cc
diff options
context:
space:
mode:
authorInderpreet Singh <[email protected]>2011-09-14 14:03:49 -0800
committerAndrew Boktor <[email protected]>2014-08-14 13:18:23 -0700
commit6e9b61e6fdeb4b64458ffc8821e39822e0bbd747 (patch)
tree7d0f54df14e99e2f1785b9ea6f282e4ff8ed3d7d /src/gpgpu-sim/shader.cc
parenta63925256ec38cf38e9928df067bac9781d21d91 (diff)
Fix for Bug 110 - integrates in CL 10258 from tm-test branch
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 10299]
Diffstat (limited to 'src/gpgpu-sim/shader.cc')
-rw-r--r--src/gpgpu-sim/shader.cc10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc
index 5be7a9c..06e4c65 100644
--- a/src/gpgpu-sim/shader.cc
+++ b/src/gpgpu-sim/shader.cc
@@ -684,9 +684,11 @@ void scheduler_unit::cycle()
unsigned warp_id = supervised_warps[supervised_id];
unsigned checked=0;
unsigned issued=0;
- while( !warp(warp_id).waiting() && !warp(warp_id).ibuffer_empty() && (checked < 2) && (issued < 2) ) {
+ unsigned max_issue = m_shader->m_config->gpgpu_max_insn_issue_per_warp;
+ while( !warp(warp_id).waiting() && !warp(warp_id).ibuffer_empty() && (checked < max_issue) && (checked <= issued) && (issued < max_issue) ) {
const warp_inst_t *pI = warp(warp_id).ibuffer_next_inst();
bool valid = warp(warp_id).ibuffer_next_valid();
+ bool warp_inst_issued = false;
unsigned pc,rpc;
m_simt_stack[warp_id]->get_pdom_stack_top_info(&pc,&rpc);
if( pI ) {
@@ -706,6 +708,7 @@ void scheduler_unit::cycle()
m_shader->issue_warp(*m_mem_out,pI,active_mask,warp_id);
issued++;
issued_inst=true;
+ warp_inst_issued = true;
}
} else {
bool sp_pipe_avail = (*m_sp_out)->empty();
@@ -715,11 +718,13 @@ void scheduler_unit::cycle()
m_shader->issue_warp(*m_sp_out,pI,active_mask,warp_id);
issued++;
issued_inst=true;
+ warp_inst_issued = true;
} else if ( (pI->op == SFU_OP) || (pI->op == ALU_SFU_OP) ) {
if( sfu_pipe_avail ) {
m_shader->issue_warp(*m_sfu_out,pI,active_mask,warp_id);
issued++;
issued_inst=true;
+ warp_inst_issued = true;
}
}
}
@@ -730,7 +735,8 @@ void scheduler_unit::cycle()
warp(warp_id).set_next_pc(pc);
warp(warp_id).ibuffer_flush();
}
- warp(warp_id).ibuffer_step();
+ if(warp_inst_issued)
+ warp(warp_id).ibuffer_step();
checked++;
}
if ( issued ) {