summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gpgpu-sim/shader.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc
index ceb67cb..5be7a9c 100644
--- a/src/gpgpu-sim/shader.cc
+++ b/src/gpgpu-sim/shader.cc
@@ -1743,6 +1743,20 @@ void barrier_set_t::warp_exit( unsigned warp_id )
// caller needs to verify all threads in warp are done, e.g., by checking PDOM stack to
// see it has only one entry during exit_impl()
m_warp_active.reset(warp_id);
+
+ // test for barrier release
+ cta_to_warp_t::iterator w=m_cta_to_warps.begin();
+ for (; w != m_cta_to_warps.end(); ++w) {
+ if (w->second.test(warp_id) == true) break;
+ }
+ warp_set_t warps_in_cta = w->second;
+ warp_set_t at_barrier = warps_in_cta & m_warp_at_barrier;
+ warp_set_t active = warps_in_cta & m_warp_active;
+
+ if( at_barrier == active ) {
+ // all warps have reached barrier, so release waiting warps...
+ m_warp_at_barrier &= ~at_barrier;
+ }
}
// assertions