summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWilson Fung <[email protected]>2011-07-26 15:49:51 -0800
committerAndrew Boktor <[email protected]>2014-08-14 13:18:22 -0700
commit9ba14bafc4e02f6a125a1df96d80f508c306488c (patch)
treed4af293ddeaffc4667985e5c238f01475575f713 /src
parent26fcdea70d160bfe395d1bc17877127c5593efb5 (diff)
Integration change from CL8943 to fix barrier behaviour.
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 9884]
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