diff options
| author | Ahmed El-Shafiey <[email protected]> | 2014-08-06 16:57:40 -0800 |
|---|---|---|
| committer | Andrew Boktor <[email protected]> | 2014-08-14 13:50:59 -0700 |
| commit | fd3c208f3c51c5520dcd7150d8a521a61577a9d5 (patch) | |
| tree | d17d3c9f47c67e1f56c9e567f51fe7f56dd599c3 /src/cuda-sim/cuda-sim.cc | |
| parent | 94a6b6c513c0afaf86770d2af0e41c8d7d0da3f5 (diff) | |
Support for named bariers + bar.red + bar.arrive instructions
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 18452]
Diffstat (limited to 'src/cuda-sim/cuda-sim.cc')
| -rw-r--r-- | src/cuda-sim/cuda-sim.cc | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/src/cuda-sim/cuda-sim.cc b/src/cuda-sim/cuda-sim.cc index dd76e4b..1ccc156 100644 --- a/src/cuda-sim/cuda-sim.cc +++ b/src/cuda-sim/cuda-sim.cc @@ -541,6 +541,40 @@ void ptx_instruction::set_mul_div_or_other_archop(){ } } + + + +void ptx_instruction::set_bar_type() +{ + if(m_opcode==BAR_OP) { + switch(m_barrier_op){ + case SYNC_OPTION: + bar_type = SYNC; + break; + case ARRIVE_OPTION: + bar_type = ARRIVE; + break; + case RED_OPTION: + bar_type = RED; + switch(m_reduction_op){ + case POPC_REDUCTION: + red_type = POPC_RED; + break; + case AND_REDUCTION: + red_type = AND_RED; + break; + case OR_REDUCTION: + red_type = OR_RED; + break; + } + break; + default: + abort(); + } + } +} + + void ptx_instruction::set_opcode_and_latency() { unsigned int_latency[5]; @@ -837,7 +871,7 @@ void ptx_instruction::pre_decode() } set_opcode_and_latency(); - + set_bar_type(); // Get register operands int n=0,m=0; ptx_instruction::const_iterator opr=op_iter_begin(); @@ -1257,11 +1291,15 @@ void ptx_thread_info::ptx_exec_inst( warp_inst_t &inst, unsigned lane_id) insn_data_size = datatype2size(to_type); insn_memory_op = pI->has_memory_read() ? memory_load : memory_store; } - + + if ( pI->get_opcode() == BAR_OP && pI->barrier_op() == RED_OPTION) { + inst.add_callback( lane_id, last_callback().function, last_callback().instruction, this,false /*not atomic*/); + } + if ( pI->get_opcode() == ATOM_OP ) { insn_memaddr = last_eaddr(); insn_space = last_space(); - inst.add_callback( lane_id, last_callback().function, last_callback().instruction, this ); + inst.add_callback( lane_id, last_callback().function, last_callback().instruction, this,true /*atomic*/); unsigned to_type = pI->get_type(); insn_data_size = datatype2size(to_type); } |
