summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Rogers <[email protected]>2011-10-27 17:12:10 -0800
committerAndrew Boktor <[email protected]>2014-08-14 13:18:24 -0700
commit0921d949dbb6233b8482b1fee90cfcc4ab2d0764 (patch)
tree51433f52f8d2a4d70ad0821995027b8e05d31d03
parente11f8a1d3deb7dcb1b5dbef06dcc994436ff98c1 (diff)
Actually fixing the atomic bug
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 10756]
-rw-r--r--src/abstract_hardware_model.cc17
-rw-r--r--src/abstract_hardware_model.h19
-rw-r--r--src/gpgpu-sim/mem_fetch.h1
-rw-r--r--src/gpgpu-sim/shader.cc2
4 files changed, 21 insertions, 18 deletions
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;
}