diff options
| author | Inderpreet Singh <[email protected]> | 2011-09-14 14:03:49 -0800 |
|---|---|---|
| committer | Andrew Boktor <[email protected]> | 2014-08-14 13:18:23 -0700 |
| commit | 6e9b61e6fdeb4b64458ffc8821e39822e0bbd747 (patch) | |
| tree | 7d0f54df14e99e2f1785b9ea6f282e4ff8ed3d7d /src/gpgpu-sim/shader.cc | |
| parent | a63925256ec38cf38e9928df067bac9781d21d91 (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.cc | 10 |
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 ) { |
