diff options
Diffstat (limited to 'src/gpgpu-sim')
| -rw-r--r-- | src/gpgpu-sim/gpu-sim.cc | 3 | ||||
| -rw-r--r-- | src/gpgpu-sim/shader.cc | 10 | ||||
| -rw-r--r-- | src/gpgpu-sim/shader.h | 1 |
3 files changed, 12 insertions, 2 deletions
diff --git a/src/gpgpu-sim/gpu-sim.cc b/src/gpgpu-sim/gpu-sim.cc index d29247c..988806c 100644 --- a/src/gpgpu-sim/gpu-sim.cc +++ b/src/gpgpu-sim/gpu-sim.cc @@ -232,6 +232,9 @@ void shader_core_config::reg_options(class OptionParser * opp) option_parser_register(opp, "-gpgpu_num_sched_per_core", OPT_INT32, &gpgpu_num_sched_per_core, "Number of warp schedulers per core", "1"); + option_parser_register(opp, "-gpgpu_max_insn_issue_per_warp", OPT_INT32, &gpgpu_max_insn_issue_per_warp, + "Max number of instructions that can be issued per warp in one cycle by scheduler", + "2"); } void gpgpu_sim_config::reg_options(option_parser_t opp) 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 ) { diff --git a/src/gpgpu-sim/shader.h b/src/gpgpu-sim/shader.h index ddaafec..871a7ce 100644 --- a/src/gpgpu-sim/shader.h +++ b/src/gpgpu-sim/shader.h @@ -986,6 +986,7 @@ struct shader_core_config : public core_config bool gpgpu_dwf_reg_bankconflict; int gpgpu_num_sched_per_core; + int gpgpu_max_insn_issue_per_warp; //op collector int gpgpu_operand_collector_num_units_sp; |
