From 0921d949dbb6233b8482b1fee90cfcc4ab2d0764 Mon Sep 17 00:00:00 2001 From: Tim Rogers Date: Thu, 27 Oct 2011 17:12:10 -0800 Subject: Actually fixing the atomic bug [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 10756] --- src/abstract_hardware_model.cc | 17 +++++++++++++++++ src/abstract_hardware_model.h | 19 ++----------------- src/gpgpu-sim/mem_fetch.h | 1 + src/gpgpu-sim/shader.cc | 2 +- 4 files changed, 21 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/abstract_hardware_model.cc b/src/abstract_hardware_model.cc index 802547e..90f45d9 100644 --- a/src/abstract_hardware_model.cc +++ b/src/abstract_hardware_model.cc @@ -125,6 +125,23 @@ void warp_inst_t::set_active( const active_mask_t &active ) { } } +void warp_inst_t::do_atomic() { + do_atomic( m_warp_active_mask ); +} + +void warp_inst_t::do_atomic( const active_mask_t& access_mask ) { + assert( m_isatomic && !m_empty ); + for( unsigned i=0; i < m_config->warp_size; i++ ) + { + if( access_mask.test(i) ) + { + dram_callback_t &cb = m_per_scalar_thread[i].callback; + if( cb.thread ) + cb.function(cb.instruction, cb.thread); + } + } +} + void warp_inst_t::generate_mem_accesses() { if( empty() || op == MEMORY_BARRIER_OP || m_mem_accesses_created ) diff --git a/src/abstract_hardware_model.h b/src/abstract_hardware_model.h index a314300..4942110 100644 --- a/src/abstract_hardware_model.h +++ b/src/abstract_hardware_model.h @@ -654,23 +654,8 @@ public: } // modifiers - void do_atomic() { - do_atomic( m_warp_active_mask ); - } - void do_atomic( const active_mask_t& access_mask ) - { - assert( m_isatomic && !m_empty ); - for( unsigned i=0; i < m_config->warp_size; i++ ) - { - if( access_mask.test(i) ) - { - dram_callback_t &cb = m_per_scalar_thread[i].callback; - if( cb.thread ) - cb.function(cb.instruction, cb.thread); - } - } - - } + void do_atomic(); + void do_atomic( const active_mask_t& access_mask ); void clear() { m_empty=true; diff --git a/src/gpgpu-sim/mem_fetch.h b/src/gpgpu-sim/mem_fetch.h index 369ea33..cc3147c 100644 --- a/src/gpgpu-sim/mem_fetch.h +++ b/src/gpgpu-sim/mem_fetch.h @@ -118,6 +118,7 @@ public: unsigned get_icnt_receive_time() const { return m_icnt_receive_time; } enum mem_access_type get_access_type() const { return m_access.get_type(); } + const active_mask_t& get_access_warp_mask() const { return m_access.get_warp_mask(); } address_type get_pc() const { return m_inst.empty()?-1:m_inst.pc; } const warp_inst_t &get_inst() { return m_inst; } enum mem_fetch_status get_status() const { return m_status; } diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc index 50ad5ea..4ce7536 100644 --- a/src/gpgpu-sim/shader.cc +++ b/src/gpgpu-sim/shader.cc @@ -1132,7 +1132,7 @@ void ldst_unit::writeback() if( m_next_global ) { m_next_wb = m_next_global->get_inst(); if( m_next_global->isatomic() ) - m_core->decrement_atomic_count(m_next_global->get_wid(),m_next_wb.active_count()); + m_core->decrement_atomic_count(m_next_global->get_wid(),m_next_global->get_access_warp_mask().count()); delete m_next_global; m_next_global = NULL; } -- cgit v1.3